From 7f86ba0deddc92caceabf5aff4f6d377c145a60f Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Sun, 11 Jul 2010 21:03:29 +0400 Subject: [PATCH] bundle relax-ng plugin --- .idea/modules.xml | 1 + plugins/relaxng/lib/isorelax.jar | Bin 0 -> 192602 bytes plugins/relaxng/lib/jing.jar | Bin 0 -> 486845 bytes .../relaxng/lib/rngom-20051226-patched.jar | Bin 0 -> 652498 bytes plugins/relaxng/lib/rngom-src.zip | Bin 0 -> 159398 bytes plugins/relaxng/lib/trang-copying.txt | 31 + plugins/relaxng/lib/trang-core.jar | Bin 0 -> 497001 bytes plugins/relaxng/relaxng.iml | 56 + plugins/relaxng/src/META-INF/LICENSE | 13 + .../relaxng/src/META-INF/jing-copying.html | 73 + plugins/relaxng/src/META-INF/plugin.xml | 93 + .../UnresolvedReference.html | 25 + .../inspectionDescriptions/UnusedDefine.html | 26 + .../plugins/relaxNG/ApplicationLoader.java | 124 + .../relaxNG/GotoSymbolContributor.java | 42 + .../plugins/relaxNG/ProjectLoader.java | 152 + .../relaxNG/RngDocumentationProvider.java | 148 + .../relaxNG/SimpleErrorReportSubmitter.java | 135 + .../relaxNG/compact/ReferenceAnnotator.java | 126 + .../relaxNG/compact/RncCompletionData.java | 137 + .../relaxNG/compact/RncElementType.java | 56 + .../relaxNG/compact/RncElementTypes.java | 74 + .../plugins/relaxNG/compact/RncFileType.java | 83 + .../relaxNG/compact/RncHighlighter.java | 77 + .../relaxNG/compact/RncParserDefinition.java | 103 + .../relaxNG/compact/RncTokenTypes.java | 205 + .../relaxNG/compact/RngCompactLanguage.java | 164 + .../compact/folding/RncFoldingBuilder.java | 158 + .../relaxNG/compact/formatting/RncBlock.java | 127 + .../formatting/RncFormattingModelBuilder.java | 39 + .../lexer/CompactSyntaxLexerAdapter.java | 258 + .../compact/lexer/EscapePreprocessor.java | 140 + .../compact/lexer/SimpleCharStream.java | 420 + .../compact/parser/AbstractParsing.java | 156 + .../compact/parser/DeclarationParsing.java | 178 + .../compact/parser/NameClassParsing.java | 88 + .../compact/parser/PatternParsing.java | 191 + .../relaxNG/compact/parser/RncParser.java | 50 + .../relaxNG/compact/psi/RncAnnotation.java | 30 + .../plugins/relaxNG/compact/psi/RncDecl.java | 30 + .../relaxNG/compact/psi/RncDefine.java | 32 + .../plugins/relaxNG/compact/psi/RncDiv.java | 27 + .../relaxNG/compact/psi/RncElement.java | 27 + .../compact/psi/RncElementVisitor.java | 76 + .../relaxNG/compact/psi/RncExternalRef.java | 26 + .../plugins/relaxNG/compact/psi/RncFile.java | 32 + .../relaxNG/compact/psi/RncFileReference.java | 35 + .../relaxNG/compact/psi/RncGrammar.java | 31 + .../relaxNG/compact/psi/RncInclude.java | 31 + .../plugins/relaxNG/compact/psi/RncName.java | 33 + .../relaxNG/compact/psi/RncNsDecl.java | 26 + .../relaxNG/compact/psi/RncParentRef.java | 25 + .../relaxNG/compact/psi/RncPattern.java | 27 + .../plugins/relaxNG/compact/psi/RncRef.java | 34 + .../compact/psi/impl/FollowFileHint.java | 32 + .../compact/psi/impl/PatternReference.java | 227 + .../compact/psi/impl/RncAnnotationImpl.java | 50 + .../relaxNG/compact/psi/impl/RncDeclImpl.java | 88 + .../compact/psi/impl/RncDefineImpl.java | 171 + .../relaxNG/compact/psi/impl/RncDivImpl.java | 43 + .../relaxNG/compact/psi/impl/RncDocument.java | 82 + .../compact/psi/impl/RncElementImpl.java | 138 + .../compact/psi/impl/RncExternalRefImpl.java | 38 + .../relaxNG/compact/psi/impl/RncFileImpl.java | 126 + .../psi/impl/RncFileReferenceImpl.java | 99 + .../compact/psi/impl/RncGrammarImpl.java | 62 + .../compact/psi/impl/RncIncludeImpl.java | 69 + .../relaxNG/compact/psi/impl/RncNameImpl.java | 277 + .../compact/psi/impl/RncNsDeclImpl.java | 37 + .../compact/psi/impl/RncParentRefImpl.java | 72 + .../relaxNG/compact/psi/impl/RncRefImpl.java | 70 + .../relaxNG/compact/psi/util/EscapeUtil.java | 67 + .../relaxNG/compact/psi/util/PsiFunction.java | 36 + .../relaxNG/compact/psi/util/RenameUtil.java | 111 + .../relaxNG/config/NoNamespaceConfig.java | 41 + .../relaxNG/config/NoNamespaceConfigImpl.java | 175 + .../config/NoNamespaceConfigPanel.form | 29 + .../config/NoNamespaceConfigPanel.java | 133 + .../config/NoNamespaceSchemaProvider.java | 55 + .../relaxNG/convert/AdvancedDtdOptions.form | 191 + .../relaxNG/convert/AdvancedDtdOptions.java | 258 + .../relaxNG/convert/AdvancedOptions.java | 33 + .../convert/AdvancedOptionsDialog.java | 95 + .../relaxNG/convert/AdvancedXsdOptions.form | 71 + .../relaxNG/convert/AdvancedXsdOptions.java | 70 + .../relaxNG/convert/ConvertSchemaAction.java | 121 + .../relaxNG/convert/ConvertSchemaDialog.java | 86 + .../convert/ConvertSchemaSettings.java | 41 + .../convert/ConvertSchemaSettingsImpl.form | 152 + .../convert/ConvertSchemaSettingsImpl.java | 257 + .../plugins/relaxNG/convert/IdeaDriver.java | 210 + .../relaxNG/convert/IdeaErrorHandler.java | 57 + .../plugins/relaxNG/convert/SchemaType.java | 28 + .../relaxNG/inspections/BaseInspection.java | 220 + .../relaxNG/inspections/RngDomInspection.java | 65 + .../inspections/UnusedDefineInspection.java | 230 + .../plugins/relaxNG/model/CommonElement.java | 63 + .../plugins/relaxNG/model/Define.java | 34 + .../intellij/plugins/relaxNG/model/Div.java | 27 + .../plugins/relaxNG/model/Grammar.java | 28 + .../plugins/relaxNG/model/Include.java | 35 + .../plugins/relaxNG/model/Pattern.java | 28 + .../intellij/plugins/relaxNG/model/Ref.java | 33 + .../annotation/CommonAnnotationHolder.java | 72 + .../model/annotation/ModelAnnotator.java | 130 + .../annotation/OverriddenDefineRenderer.java | 88 + .../annotation/OverriddenDefineSearcher.java | 55 + .../annotation/OverridingDefineRenderer.java | 89 + .../model/descriptors/AttributeFinder.java | 126 + .../model/descriptors/ChildElementFinder.java | 72 + .../descriptors/CompositeDescriptor.java | 119 + .../model/descriptors/NamedPatternFilter.java | 29 + .../descriptors/RecursionSaveWalker.java | 97 + .../descriptors/RngElementDescriptor.java | 360 + .../model/descriptors/RngNsDescriptor.java | 252 + .../RngXmlAttributeDescriptor.java | 205 + .../model/resolve/DefinitionResolver.java | 217 + .../relaxNG/model/resolve/GrammarFactory.java | 43 + .../model/resolve/RelaxIncludeIndex.java | 76 + .../model/resolve/RelaxIncludeProvider.java | 99 + .../model/resolve/RelaxSymbolIndex.java | 286 + .../relaxNG/references/AddValueCondition.java | 42 + .../references/AttributeValueCondition.java | 35 + .../references/AttributeValueFunction.java | 33 + .../relaxNG/references/FileReferenceUtil.java | 143 + .../relaxNG/references/IdRefProvider.java | 149 + .../references/PrefixReferenceProvider.java | 122 + .../relaxNG/references/ResolvingVisitor.java | 127 + .../plugins/relaxNG/resources/relaxng.rng | 521 + .../relaxNG/validation/MessageViewHelper.java | 255 + .../relaxNG/validation/Psi2SaxAdapter.java | 162 + .../plugins/relaxNG/validation/RngParser.java | 208 + .../validation/RngSchemaValidator.java | 251 + .../relaxNG/validation/ValidateAction.java | 261 + .../validation/XmlInstanceValidator.java | 114 + .../plugins/relaxNG/xml/dom/Combine.java | 39 + .../plugins/relaxNG/xml/dom/RngAttribute.java | 40 + .../plugins/relaxNG/xml/dom/RngChoice.java | 32 + .../plugins/relaxNG/xml/dom/RngData.java | 68 + .../plugins/relaxNG/xml/dom/RngDefine.java | 57 + .../plugins/relaxNG/xml/dom/RngDiv.java | 31 + .../relaxNG/xml/dom/RngDomElement.java | 50 + .../relaxNG/xml/dom/RngDomVisitor.java | 46 + .../plugins/relaxNG/xml/dom/RngElement.java | 42 + .../plugins/relaxNG/xml/dom/RngEmpty.java | 31 + .../plugins/relaxNG/xml/dom/RngExcept.java | 27 + .../relaxNG/xml/dom/RngExternalRef.java | 47 + .../plugins/relaxNG/xml/dom/RngGrammar.java | 34 + .../relaxNG/xml/dom/RngGrammarContent.java | 87 + .../plugins/relaxNG/xml/dom/RngGroup.java | 30 + .../plugins/relaxNG/xml/dom/RngInclude.java | 47 + .../relaxNG/xml/dom/RngIncludeContent.java | 71 + .../relaxNG/xml/dom/RngInterleave.java | 30 + .../plugins/relaxNG/xml/dom/RngList.java | 27 + .../plugins/relaxNG/xml/dom/RngMixed.java | 27 + .../relaxNG/xml/dom/RngNotAllowed.java | 31 + .../plugins/relaxNG/xml/dom/RngOneOrMore.java | 27 + .../relaxNG/xml/dom/RngOpenPattern.java | 202 + .../relaxNG/xml/dom/RngOpenPatterns.java | 316 + .../plugins/relaxNG/xml/dom/RngOptional.java | 27 + .../plugins/relaxNG/xml/dom/RngParam.java | 58 + .../plugins/relaxNG/xml/dom/RngParentRef.java | 46 + .../plugins/relaxNG/xml/dom/RngRef.java | 41 + .../plugins/relaxNG/xml/dom/RngStart.java | 37 + .../plugins/relaxNG/xml/dom/RngText.java | 31 + .../plugins/relaxNG/xml/dom/RngValue.java | 58 + .../relaxNG/xml/dom/RngZeroOrMore.java | 27 + .../xml/dom/impl/CreatePatternFix.java | 137 + .../xml/dom/impl/DefinitionReference.java | 160 + .../relaxNG/xml/dom/impl/RngDefineImpl.java | 53 + .../xml/dom/impl/RngDefineMetaData.java | 57 + .../xml/dom/impl/RngDomElementBase.java | 64 + .../relaxNG/xml/dom/impl/RngGrammarImpl.java | 36 + .../xml/dom/impl/RngHrefConverter.java | 68 + .../relaxNG/xml/dom/impl/RngIncludeImpl.java | 50 + .../relaxNG/xml/dom/impl/RngRefImpl.java | 66 + .../xml/dom/impl/RngReferenceConverter.java | 104 + .../relaxNG/xml/dom/names/AnyName.java | 39 + .../plugins/relaxNG/xml/dom/names/Name.java | 47 + .../plugins/relaxNG/xml/dom/names/NsName.java | 35 + .../xml/dom/names/OpenNameClasses.java | 82 + .../plugins/relaxNG/AbstractIndexTest.java | 32 + .../plugins/relaxNG/AbstractParsingTest.java | 50 + .../relaxNG/AttributeCompletionTest.java | 59 + .../relaxNG/ElementCompletionTest.java | 50 + .../relaxNG/ExternalRncParsingTest.java | 60 + .../plugins/relaxNG/HighlightingTestBase.java | 296 + .../relaxNG/RncAnnotationParsingTest.java | 52 + .../plugins/relaxNG/RncCompletionTest.java | 55 + .../relaxNG/RncExternalHighlightingTest.java | 57 + .../plugins/relaxNG/RncHighlightingTest.java | 125 + .../relaxNG/RncIndexHighlightingTest.java | 48 + .../plugins/relaxNG/RncParsingTest.java | 52 + .../plugins/relaxNG/RncRenameTest.java | 99 + .../plugins/relaxNG/RngCompletionTest.java | 47 + .../plugins/relaxNG/RngHighlightingTest.java | 155 + .../relaxNG/RngIndexHighlightingTest.java | 66 + .../plugins/relaxNG/RngRenameTest.java | 43 + .../plugins/relaxNG/XmlHighlightingTest.java | 166 + .../plugins/relaxNG/XmlValidationTest.java | 99 + .../intellij/plugins/testUtil/CopyFile.java | 18 + .../testUtil/IdeaCodeInsightTestCase.java | 13 + .../plugins/testUtil/ResourceUtil.java | 57 + .../testData/completion/attr-combine-test.rng | 27 + .../testData/completion/attr-combine.xml | 1 + .../completion/attribute-completion-1.xml | 1 + .../attribute-completion-1_after.xml | 1 + .../completion/attribute-completion-2.xml | 1 + .../attribute-completion-2_after.xml | 1 + .../completion/attribute-completion-3.xml | 1 + .../completion/attribute-completion-4.xml | 1 + .../completion/attribute-completion-5.xml | 1 + .../completion/attribute-completion-6.xml | 1 + .../completion/attribute-completion.rng | 49 + .../completion/element-completion-1.xml | 3 + .../completion/element-completion-2.xml | 3 + .../completion/element-completion-3.xml | 3 + .../completion/element-completion-3_after.xml | 3 + .../completion/element-completion-root.xml | 2 + .../completion/element-completion.rng | 33 + .../completion/rnc/complete-keyword-1.rnc | 1 + .../rnc/complete-keyword-1_after.rnc | 1 + .../completion/rnc/complete-keyword-2.rnc | 1 + .../rnc/complete-keyword-2_after.rnc | 1 + .../completion/rnc/complete-ref-1.rnc | 2 + .../completion/rnc/complete-ref-1_after.rnc | 2 + .../completion/rnc/complete-ref-2.rnc | 4 + .../completion/rnc/complete-ref-2_after.rnc | 4 + .../completion/rnc/complete-ref-3.rnc | 7 + .../completion/rnc/complete-ref-3_after.rnc | 7 + .../completion/rnc/complete-ref-4.rnc | 7 + .../completion/rnc/complete-ref-4_after.rnc | 7 + .../testData/completion/rnc/included.rnc | 3 + .../completion/rng/complete-ref-1.rng | 7 + .../completion/rng/complete-ref-1_after.rng | 7 + .../completion/rng/complete-ref-2.rng | 9 + .../completion/rng/complete-ref-2_after.rng | 9 + .../completion/rng/complete-ref-3.rng | 13 + .../completion/rng/complete-ref-3_after.rng | 13 + .../completion/rng/complete-ref-4.rng | 15 + .../completion/rng/complete-ref-4_after.rng | 15 + .../testData/completion/rng/included.rng | 5 + .../highlighting/attachment-filter.rng | 149 + .../highlighting/attribute-choice-1.xml | 3 + .../highlighting/attribute-choice-2.xml | 3 + .../highlighting/attribute-choice-3.xml | 2 + .../relaxng/testData/highlighting/docbook.rng | 15278 +++++ .../highlighting/fixed-attribute_1.xml | 2 + .../highlighting/fixed-attribute_2.xml | 2 + .../testData/highlighting/jpdl-3.1.xsd | 456 + .../relaxng/testData/highlighting/mybook.xml | 525 + .../highlighting/nested-composite.rng | 16 + .../highlighting/nested-fragment-2.xml | 82 + .../testData/highlighting/nested-fragment.xml | 7 + .../highlighting/optional-attribute_1.xml | 2 + .../highlighting/optional-attribute_2.xml | 2 + .../highlighting/optional-element_1.xml | 5 + .../relaxng/testData/highlighting/relaxng.rng | 335 + .../testData/highlighting/rnc/addressbook.rnc | 10 + .../testData/highlighting/rnc/annotation.rnc | 9 + .../highlighting/rnc/backward-include-def.rnc | 6 + .../highlighting/rnc/backward-include-ref.rnc | 3 + .../testData/highlighting/rnc/bad-element.xml | 3 + .../highlighting/rnc/bad-parent-ref-1.rnc | 8 + .../rnc/create-datatypes-prefix-1.rnc | 1 + .../rnc/create-datatypes-prefix-1_after.rnc | 2 + .../highlighting/rnc/create-definition-1.rnc | 2 + .../rnc/create-definition-1_after.rnc | 3 + .../highlighting/rnc/create-definition-2.rnc | 5 + .../rnc/create-definition-2_after.rnc | 6 + .../highlighting/rnc/create-ns-prefix-1.rnc | 1 + .../rnc/create-ns-prefix-1_after.rnc | 2 + .../highlighting/rnc/datatype-prefix.rnc | 3 + .../testData/highlighting/rnc/docbook.rnc | 10639 +++ .../highlighting/rnc/fo/basic_properties.rnc | 648 + .../testData/highlighting/rnc/fo/datatype.rnc | 54 + .../testData/highlighting/rnc/fo/elements.rnc | 554 + .../testData/highlighting/rnc/fo/fo-test.xml | 34 + .../testData/highlighting/rnc/fo/main.rnc | 239 + .../testData/highlighting/rnc/fo/mybook.fo | 2627 + .../highlighting/rnc/fo/properties.rnc | 658 + .../highlighting/rnc/fo/properties_groups.rnc | 562 + .../testData/highlighting/rnc/include.rnc | 3 + .../testData/highlighting/rnc/included.rnc | 8 + .../highlighting/rnc/missing-attribute.xml | 3 + .../highlighting/rnc/missing-content.rnc | 4 + .../highlighting/rnc/missing-start.rnc | 1 + .../highlighting/rnc/ns-prefix-keyword.rnc | 3 + .../testData/highlighting/rnc/ns-prefix.rnc | 3 + .../testData/highlighting/rnc/parent-ref.rnc | 9 + .../testData/highlighting/rnc/ref-3.rnc | 9 + .../testData/highlighting/rnc/rng-schema.rnc | 63 + .../rnc/suppressed-unused-define.rnc | 5 + .../highlighting/rnc/undefined-ref-ok.rnc | 4 + .../highlighting/rnc/undefined-ref.rnc | 2 + .../rnc/unresolved-datatype-prefix-1.rnc | 1 + .../rnc/unresolved-datatype-prefix-2.rnc | 3 + .../highlighting/rnc/unresolved-include.rnc | 2 + .../rnc/unresolved-ns-prefix-1.rnc | 1 + .../rnc/unresolved-ns-prefix-2.rnc | 3 + .../rnc/unresolved-ns-prefix-3.rnc | 9 + .../highlighting/rnc/unused-define.rnc | 4 + .../testData/highlighting/rnc/used-define.rnc | 4 + .../highlighting/rnc/valid-rnc-include.xml | 6 + .../testData/highlighting/rnc/valid-rnc.xml | 3 + .../highlighting/rng/backward-file1.rng | 18 + .../highlighting/rng/backward-include-def.rng | 20 + .../highlighting/rng/backward-include-ref.rng | 8 + .../highlighting/rng/backward-included.rng | 8 + .../rng/backward-with-include.rng | 11 + .../testData/highlighting/rng/bad-element.rng | 6 + .../testData/highlighting/rng/bad-include.rng | 8 + .../highlighting/rng/bad-ns-prefix.rng | 5 + .../highlighting/rng/bad-parent-ref-1.rng | 24 + .../highlighting/rng/bad-parent-ref-2.rng | 17 + .../testData/highlighting/rng/bad-ref-2.rng | 16 + .../testData/highlighting/rng/bad-ref-3.rng | 12 + .../testData/highlighting/rng/bad-ref.rng | 5 + .../highlighting/rng/create-definition-1.rng | 6 + .../rng/create-definition-1_after.rng | 9 + .../highlighting/rng/create-definition-2.rng | 9 + .../rng/create-definition-2_after.rng | 12 + .../highlighting/rng/good-external-ref.rng | 11 + .../highlighting/rng/good-include-ref-1.rng | 8 + .../highlighting/rng/good-include.rng | 8 + .../testData/highlighting/rng/include.rng | 4 + .../highlighting/rng/included-grammar.rng | 6 + .../highlighting/rng/including-grammar.rng | 8 + .../rng/missing-start-element-and-include.rng | 8 + .../rng/missing-start-element.rng | 6 + .../highlighting/rng/parent-ref-1.rng | 12 + .../highlighting/rng/parent-ref-2.rng | 14 + .../testData/highlighting/rng/ref-1.rng | 12 + .../testData/highlighting/rng/ref-2.rng | 32 + .../testData/highlighting/rng/ref-3.rng | 18 + .../rng/resolve-include-ref-1.rng | 8 + .../rng/resolve-include-ref-2.rng | 12 + .../testData/highlighting/rng/simple.rng | 88 + .../highlighting/rng/unused-define-1.rng | 3 + .../highlighting/rng/unused-define-2.rng | 5 + .../highlighting/rng/used-define-1.rng | 6 + .../highlighting/rng/used-define-2.rng | 8 + .../rng/used-define-3-include.rng | 4 + .../highlighting/rng/used-define-3.rng | 7 + .../highlighting/simple-attribute_1.xml | 2 + .../highlighting/simple-attribute_2.xml | 2 + .../highlighting/simple-element_1.xml | 5 + .../relaxng/testData/highlighting/simple.rng | 99 + .../testData/highlighting/token-datatype.xml | 4 + .../testData/highlighting/value-choice-1.xml | 2 + .../testData/highlighting/value-choice-2.xml | 2 + .../relaxng/testData/highlighting/xslt.rng | 895 + plugins/relaxng/testData/log4j.dtd | 165 + .../testData/parsing/escaped-broken-1.rnc | 1 + .../testData/parsing/escaped-broken-2.rnc | 1 + .../testData/parsing/escaped-broken-3.rnc | 1 + .../testData/parsing/escaped-broken-4.rnc | 1 + .../testData/parsing/escaped-broken-5.rnc | 1 + plugins/relaxng/testData/parsing/escaped.rnc | 1 + .../parsing/psi/annotations/Following.rnc | 3 + .../parsing/psi/annotations/Following.txt | 31 + .../psi/annotations/FollowingIncomplete.rnc | 3 + .../psi/annotations/FollowingIncomplete.txt | 18 + .../parsing/psi/annotations/GrammarLevel.rnc | 7 + .../parsing/psi/annotations/GrammarLevel.txt | 57 + .../parsing/psi/annotations/Nested.rnc | 11 + .../parsing/psi/annotations/Nested.txt | 47 + .../parsing/psi/annotations/Simple1.rnc | 12 + .../parsing/psi/annotations/Simple1.txt | 89 + .../parsing/psi/annotations/Simple2.rnc | 9 + .../parsing/psi/annotations/Simple2.txt | 80 + .../testData/parsing/psi/complex/Datatype.rnc | 58 + .../testData/parsing/psi/complex/Datatype.txt | 363 + .../testData/parsing/psi/complex/Docbook.rnc | 10638 +++ .../testData/parsing/psi/complex/Docbook.txt | 55100 ++++++++++++++++ .../testData/parsing/psi/complex/Elements.rnc | 554 + .../testData/parsing/psi/complex/Elements.txt | 2713 + .../testData/parsing/psi/complex/Main.rnc | 239 + .../testData/parsing/psi/complex/Main.txt | 1206 + .../parsing/psi/complex/Properties.rnc | 659 + .../parsing/psi/complex/Properties.txt | 1904 + .../testData/parsing/psi/complex/RelaxNG.rnc | 63 + .../testData/parsing/psi/complex/RelaxNG.txt | 953 + .../parsing/psi/complex/basic_properties.rnc | 648 + .../parsing/psi/complex/properties_groups.rnc | 562 + plugins/relaxng/testData/parsing/simple.rnc | 1 + .../rename/rnc/rename-datatype-prefix-1.rnc | 4 + .../rnc/rename-datatype-prefix-1_after.rnc | 4 + .../rename/rnc/rename-definition-1.rnc | 3 + .../rename/rnc/rename-definition-1_after.rnc | 3 + .../rename/rnc/rename-definition-2.rnc | 3 + .../rename/rnc/rename-definition-2_after.rnc | 3 + .../rename/rnc/rename-definition-3.rnc | 2 + .../rename/rnc/rename-definition-3_after.rnc | 2 + .../rename/rnc/rename-in-include-ref.rnc | 1 + .../testData/rename/rnc/rename-in-include.rnc | 1 + .../rename/rnc/rename-in-include_after.rnc | 1 + .../rename/rnc/rename-ns-prefix-1.rnc | 3 + .../rename/rnc/rename-ns-prefix-1_after.rnc | 3 + .../testData/rename/rng/rename-ref-1.rng | 7 + .../rename/rng/rename-ref-1_after.rng | 7 + .../testData/validation/broken-rnc.xml | 3 + .../testData/validation/broken-rng.xml | 3 + .../relaxng/testData/validation/broken.rnc | 7 + .../relaxng/testData/validation/broken.rng | 15 + .../testData/validation/cdata-test.xml | 3 + .../testData/validation/entity-included-2.xml | 3 + .../testData/validation/entity-included.xml | 1 + .../testData/validation/entity-test-1.xml | 6 + .../testData/validation/entity-test-2.xml | 6 + .../testData/validation/entity-test-3.xml | 5 + .../validation/invalid-element-rnc.xml | 4 + .../testData/validation/invalid-element.xml | 4 + .../validation/missing-element-rnc.xml | 2 + .../testData/validation/missing-element.xml | 2 + .../relaxng/testData/validation/simple.rnc | 9 + .../relaxng/testData/validation/simple.rng | 33 + .../testData/validation/text-content.xml | 5 + plugins/relaxng/testData/validation/xslt.rng | 895 + 419 files changed, 130449 insertions(+) create mode 100644 plugins/relaxng/lib/isorelax.jar create mode 100644 plugins/relaxng/lib/jing.jar create mode 100644 plugins/relaxng/lib/rngom-20051226-patched.jar create mode 100644 plugins/relaxng/lib/rngom-src.zip create mode 100644 plugins/relaxng/lib/trang-copying.txt create mode 100644 plugins/relaxng/lib/trang-core.jar create mode 100644 plugins/relaxng/relaxng.iml create mode 100644 plugins/relaxng/src/META-INF/LICENSE create mode 100644 plugins/relaxng/src/META-INF/jing-copying.html create mode 100644 plugins/relaxng/src/META-INF/plugin.xml create mode 100644 plugins/relaxng/src/inspectionDescriptions/UnresolvedReference.html create mode 100644 plugins/relaxng/src/inspectionDescriptions/UnusedDefine.html create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/ApplicationLoader.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/GotoSymbolContributor.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/ProjectLoader.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/RngDocumentationProvider.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/SimpleErrorReportSubmitter.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/ReferenceAnnotator.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncCompletionData.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncElementType.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncElementTypes.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncFileType.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncHighlighter.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncParserDefinition.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncTokenTypes.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RngCompactLanguage.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/folding/RncFoldingBuilder.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/formatting/RncBlock.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/formatting/RncFormattingModelBuilder.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/lexer/CompactSyntaxLexerAdapter.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/lexer/EscapePreprocessor.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/lexer/SimpleCharStream.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/AbstractParsing.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/DeclarationParsing.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/NameClassParsing.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/PatternParsing.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/RncParser.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncAnnotation.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncDecl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncDefine.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncDiv.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncElement.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncElementVisitor.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncExternalRef.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncFile.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncFileReference.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncGrammar.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncInclude.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncName.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncNsDecl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncParentRef.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncPattern.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncRef.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/FollowFileHint.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/PatternReference.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncAnnotationImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDeclImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDefineImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDivImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDocument.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncElementImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncExternalRefImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncFileImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncFileReferenceImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncGrammarImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncIncludeImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncNameImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncNsDeclImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncParentRefImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncRefImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/util/EscapeUtil.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/util/PsiFunction.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/util/RenameUtil.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfig.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfigImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfigPanel.form create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfigPanel.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceSchemaProvider.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedDtdOptions.form create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedDtdOptions.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedOptions.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedOptionsDialog.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedXsdOptions.form create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedXsdOptions.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaAction.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaDialog.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaSettings.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaSettingsImpl.form create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaSettingsImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/IdeaDriver.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/IdeaErrorHandler.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/SchemaType.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/inspections/BaseInspection.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/inspections/RngDomInspection.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/inspections/UnusedDefineInspection.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/CommonElement.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Define.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Div.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Grammar.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Include.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Pattern.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Ref.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/CommonAnnotationHolder.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/ModelAnnotator.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/OverriddenDefineRenderer.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/OverriddenDefineSearcher.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/OverridingDefineRenderer.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/AttributeFinder.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/ChildElementFinder.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/CompositeDescriptor.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/NamedPatternFilter.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RecursionSaveWalker.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngElementDescriptor.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngNsDescriptor.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngXmlAttributeDescriptor.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/DefinitionResolver.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/GrammarFactory.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxIncludeIndex.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxIncludeProvider.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxSymbolIndex.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/references/AddValueCondition.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/references/AttributeValueCondition.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/references/AttributeValueFunction.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/references/FileReferenceUtil.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/references/IdRefProvider.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/references/PrefixReferenceProvider.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/references/ResolvingVisitor.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/resources/relaxng.rng create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/MessageViewHelper.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/Psi2SaxAdapter.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/RngParser.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/RngSchemaValidator.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/ValidateAction.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/XmlInstanceValidator.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/Combine.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngAttribute.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngChoice.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngData.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDefine.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDiv.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDomElement.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDomVisitor.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngElement.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngEmpty.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngExcept.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngExternalRef.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngGrammar.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngGrammarContent.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngGroup.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngInclude.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngIncludeContent.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngInterleave.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngList.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngMixed.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngNotAllowed.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOneOrMore.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOpenPattern.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOpenPatterns.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOptional.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngParam.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngParentRef.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngRef.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngStart.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngText.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngValue.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngZeroOrMore.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/CreatePatternFix.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/DefinitionReference.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngDefineImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngDefineMetaData.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngDomElementBase.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngGrammarImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngHrefConverter.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngIncludeImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngRefImpl.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngReferenceConverter.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/AnyName.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/Name.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/NsName.java create mode 100644 plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/OpenNameClasses.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/AbstractIndexTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/AbstractParsingTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/AttributeCompletionTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/ElementCompletionTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/ExternalRncParsingTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/HighlightingTestBase.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/RncAnnotationParsingTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/RncCompletionTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/RncExternalHighlightingTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/RncHighlightingTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/RncIndexHighlightingTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/RncParsingTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/RncRenameTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/RngCompletionTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/RngHighlightingTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/RngIndexHighlightingTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/RngRenameTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/XmlHighlightingTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/relaxNG/XmlValidationTest.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/testUtil/CopyFile.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/testUtil/IdeaCodeInsightTestCase.java create mode 100644 plugins/relaxng/test/org/intellij/plugins/testUtil/ResourceUtil.java create mode 100644 plugins/relaxng/testData/completion/attr-combine-test.rng create mode 100644 plugins/relaxng/testData/completion/attr-combine.xml create mode 100644 plugins/relaxng/testData/completion/attribute-completion-1.xml create mode 100644 plugins/relaxng/testData/completion/attribute-completion-1_after.xml create mode 100644 plugins/relaxng/testData/completion/attribute-completion-2.xml create mode 100644 plugins/relaxng/testData/completion/attribute-completion-2_after.xml create mode 100644 plugins/relaxng/testData/completion/attribute-completion-3.xml create mode 100644 plugins/relaxng/testData/completion/attribute-completion-4.xml create mode 100644 plugins/relaxng/testData/completion/attribute-completion-5.xml create mode 100644 plugins/relaxng/testData/completion/attribute-completion-6.xml create mode 100644 plugins/relaxng/testData/completion/attribute-completion.rng create mode 100644 plugins/relaxng/testData/completion/element-completion-1.xml create mode 100644 plugins/relaxng/testData/completion/element-completion-2.xml create mode 100644 plugins/relaxng/testData/completion/element-completion-3.xml create mode 100644 plugins/relaxng/testData/completion/element-completion-3_after.xml create mode 100644 plugins/relaxng/testData/completion/element-completion-root.xml create mode 100644 plugins/relaxng/testData/completion/element-completion.rng create mode 100644 plugins/relaxng/testData/completion/rnc/complete-keyword-1.rnc create mode 100644 plugins/relaxng/testData/completion/rnc/complete-keyword-1_after.rnc create mode 100644 plugins/relaxng/testData/completion/rnc/complete-keyword-2.rnc create mode 100644 plugins/relaxng/testData/completion/rnc/complete-keyword-2_after.rnc create mode 100644 plugins/relaxng/testData/completion/rnc/complete-ref-1.rnc create mode 100644 plugins/relaxng/testData/completion/rnc/complete-ref-1_after.rnc create mode 100644 plugins/relaxng/testData/completion/rnc/complete-ref-2.rnc create mode 100644 plugins/relaxng/testData/completion/rnc/complete-ref-2_after.rnc create mode 100644 plugins/relaxng/testData/completion/rnc/complete-ref-3.rnc create mode 100644 plugins/relaxng/testData/completion/rnc/complete-ref-3_after.rnc create mode 100644 plugins/relaxng/testData/completion/rnc/complete-ref-4.rnc create mode 100644 plugins/relaxng/testData/completion/rnc/complete-ref-4_after.rnc create mode 100644 plugins/relaxng/testData/completion/rnc/included.rnc create mode 100644 plugins/relaxng/testData/completion/rng/complete-ref-1.rng create mode 100644 plugins/relaxng/testData/completion/rng/complete-ref-1_after.rng create mode 100644 plugins/relaxng/testData/completion/rng/complete-ref-2.rng create mode 100644 plugins/relaxng/testData/completion/rng/complete-ref-2_after.rng create mode 100644 plugins/relaxng/testData/completion/rng/complete-ref-3.rng create mode 100644 plugins/relaxng/testData/completion/rng/complete-ref-3_after.rng create mode 100644 plugins/relaxng/testData/completion/rng/complete-ref-4.rng create mode 100644 plugins/relaxng/testData/completion/rng/complete-ref-4_after.rng create mode 100644 plugins/relaxng/testData/completion/rng/included.rng create mode 100644 plugins/relaxng/testData/highlighting/attachment-filter.rng create mode 100644 plugins/relaxng/testData/highlighting/attribute-choice-1.xml create mode 100644 plugins/relaxng/testData/highlighting/attribute-choice-2.xml create mode 100644 plugins/relaxng/testData/highlighting/attribute-choice-3.xml create mode 100644 plugins/relaxng/testData/highlighting/docbook.rng create mode 100644 plugins/relaxng/testData/highlighting/fixed-attribute_1.xml create mode 100644 plugins/relaxng/testData/highlighting/fixed-attribute_2.xml create mode 100644 plugins/relaxng/testData/highlighting/jpdl-3.1.xsd create mode 100644 plugins/relaxng/testData/highlighting/mybook.xml create mode 100644 plugins/relaxng/testData/highlighting/nested-composite.rng create mode 100644 plugins/relaxng/testData/highlighting/nested-fragment-2.xml create mode 100644 plugins/relaxng/testData/highlighting/nested-fragment.xml create mode 100644 plugins/relaxng/testData/highlighting/optional-attribute_1.xml create mode 100644 plugins/relaxng/testData/highlighting/optional-attribute_2.xml create mode 100644 plugins/relaxng/testData/highlighting/optional-element_1.xml create mode 100644 plugins/relaxng/testData/highlighting/relaxng.rng create mode 100644 plugins/relaxng/testData/highlighting/rnc/addressbook.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/annotation.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/backward-include-def.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/backward-include-ref.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/bad-element.xml create mode 100644 plugins/relaxng/testData/highlighting/rnc/bad-parent-ref-1.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/create-datatypes-prefix-1.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/create-datatypes-prefix-1_after.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/create-definition-1.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/create-definition-1_after.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/create-definition-2.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/create-definition-2_after.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/create-ns-prefix-1.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/create-ns-prefix-1_after.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/datatype-prefix.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/docbook.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/fo/basic_properties.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/fo/datatype.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/fo/elements.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/fo/fo-test.xml create mode 100644 plugins/relaxng/testData/highlighting/rnc/fo/main.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/fo/mybook.fo create mode 100644 plugins/relaxng/testData/highlighting/rnc/fo/properties.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/fo/properties_groups.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/include.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/included.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/missing-attribute.xml create mode 100644 plugins/relaxng/testData/highlighting/rnc/missing-content.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/missing-start.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/ns-prefix-keyword.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/ns-prefix.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/parent-ref.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/ref-3.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/rng-schema.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/suppressed-unused-define.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/undefined-ref-ok.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/undefined-ref.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/unresolved-datatype-prefix-1.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/unresolved-datatype-prefix-2.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/unresolved-include.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/unresolved-ns-prefix-1.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/unresolved-ns-prefix-2.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/unresolved-ns-prefix-3.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/unused-define.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/used-define.rnc create mode 100644 plugins/relaxng/testData/highlighting/rnc/valid-rnc-include.xml create mode 100644 plugins/relaxng/testData/highlighting/rnc/valid-rnc.xml create mode 100644 plugins/relaxng/testData/highlighting/rng/backward-file1.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/backward-include-def.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/backward-include-ref.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/backward-included.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/backward-with-include.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/bad-element.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/bad-include.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/bad-ns-prefix.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/bad-parent-ref-1.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/bad-parent-ref-2.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/bad-ref-2.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/bad-ref-3.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/bad-ref.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/create-definition-1.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/create-definition-1_after.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/create-definition-2.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/create-definition-2_after.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/good-external-ref.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/good-include-ref-1.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/good-include.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/include.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/included-grammar.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/including-grammar.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/missing-start-element-and-include.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/missing-start-element.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/parent-ref-1.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/parent-ref-2.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/ref-1.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/ref-2.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/ref-3.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/resolve-include-ref-1.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/resolve-include-ref-2.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/simple.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/unused-define-1.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/unused-define-2.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/used-define-1.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/used-define-2.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/used-define-3-include.rng create mode 100644 plugins/relaxng/testData/highlighting/rng/used-define-3.rng create mode 100644 plugins/relaxng/testData/highlighting/simple-attribute_1.xml create mode 100644 plugins/relaxng/testData/highlighting/simple-attribute_2.xml create mode 100644 plugins/relaxng/testData/highlighting/simple-element_1.xml create mode 100644 plugins/relaxng/testData/highlighting/simple.rng create mode 100644 plugins/relaxng/testData/highlighting/token-datatype.xml create mode 100644 plugins/relaxng/testData/highlighting/value-choice-1.xml create mode 100644 plugins/relaxng/testData/highlighting/value-choice-2.xml create mode 100644 plugins/relaxng/testData/highlighting/xslt.rng create mode 100644 plugins/relaxng/testData/log4j.dtd create mode 100644 plugins/relaxng/testData/parsing/escaped-broken-1.rnc create mode 100644 plugins/relaxng/testData/parsing/escaped-broken-2.rnc create mode 100644 plugins/relaxng/testData/parsing/escaped-broken-3.rnc create mode 100644 plugins/relaxng/testData/parsing/escaped-broken-4.rnc create mode 100644 plugins/relaxng/testData/parsing/escaped-broken-5.rnc create mode 100644 plugins/relaxng/testData/parsing/escaped.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/annotations/Following.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/annotations/Following.txt create mode 100644 plugins/relaxng/testData/parsing/psi/annotations/FollowingIncomplete.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/annotations/FollowingIncomplete.txt create mode 100644 plugins/relaxng/testData/parsing/psi/annotations/GrammarLevel.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/annotations/GrammarLevel.txt create mode 100644 plugins/relaxng/testData/parsing/psi/annotations/Nested.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/annotations/Nested.txt create mode 100644 plugins/relaxng/testData/parsing/psi/annotations/Simple1.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/annotations/Simple1.txt create mode 100644 plugins/relaxng/testData/parsing/psi/annotations/Simple2.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/annotations/Simple2.txt create mode 100644 plugins/relaxng/testData/parsing/psi/complex/Datatype.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/complex/Datatype.txt create mode 100644 plugins/relaxng/testData/parsing/psi/complex/Docbook.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/complex/Docbook.txt create mode 100644 plugins/relaxng/testData/parsing/psi/complex/Elements.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/complex/Elements.txt create mode 100644 plugins/relaxng/testData/parsing/psi/complex/Main.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/complex/Main.txt create mode 100644 plugins/relaxng/testData/parsing/psi/complex/Properties.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/complex/Properties.txt create mode 100644 plugins/relaxng/testData/parsing/psi/complex/RelaxNG.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/complex/RelaxNG.txt create mode 100644 plugins/relaxng/testData/parsing/psi/complex/basic_properties.rnc create mode 100644 plugins/relaxng/testData/parsing/psi/complex/properties_groups.rnc create mode 100644 plugins/relaxng/testData/parsing/simple.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-datatype-prefix-1.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-datatype-prefix-1_after.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-definition-1.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-definition-1_after.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-definition-2.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-definition-2_after.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-definition-3.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-definition-3_after.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-in-include-ref.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-in-include.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-in-include_after.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-ns-prefix-1.rnc create mode 100644 plugins/relaxng/testData/rename/rnc/rename-ns-prefix-1_after.rnc create mode 100644 plugins/relaxng/testData/rename/rng/rename-ref-1.rng create mode 100644 plugins/relaxng/testData/rename/rng/rename-ref-1_after.rng create mode 100644 plugins/relaxng/testData/validation/broken-rnc.xml create mode 100644 plugins/relaxng/testData/validation/broken-rng.xml create mode 100644 plugins/relaxng/testData/validation/broken.rnc create mode 100644 plugins/relaxng/testData/validation/broken.rng create mode 100644 plugins/relaxng/testData/validation/cdata-test.xml create mode 100644 plugins/relaxng/testData/validation/entity-included-2.xml create mode 100644 plugins/relaxng/testData/validation/entity-included.xml create mode 100644 plugins/relaxng/testData/validation/entity-test-1.xml create mode 100644 plugins/relaxng/testData/validation/entity-test-2.xml create mode 100644 plugins/relaxng/testData/validation/entity-test-3.xml create mode 100644 plugins/relaxng/testData/validation/invalid-element-rnc.xml create mode 100644 plugins/relaxng/testData/validation/invalid-element.xml create mode 100644 plugins/relaxng/testData/validation/missing-element-rnc.xml create mode 100644 plugins/relaxng/testData/validation/missing-element.xml create mode 100644 plugins/relaxng/testData/validation/simple.rnc create mode 100644 plugins/relaxng/testData/validation/simple.rng create mode 100644 plugins/relaxng/testData/validation/text-content.xml create mode 100644 plugins/relaxng/testData/validation/xslt.rng diff --git a/.idea/modules.xml b/.idea/modules.xml index 82283e971251..d94269431fdf 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -11,6 +11,7 @@ + diff --git a/plugins/relaxng/lib/isorelax.jar b/plugins/relaxng/lib/isorelax.jar new file mode 100644 index 0000000000000000000000000000000000000000..a2ebb7698a17b37dd893793c5abe5ce184ec8f83 GIT binary patch literal 192602 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

V%I7R7I(MVQU?2Z9rvwB(l};!0S9X7Pv+w| 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 literal 0 HcmV?d00001 diff --git a/plugins/relaxng/lib/jing.jar b/plugins/relaxng/lib/jing.jar new file mode 100644 index 0000000000000000000000000000000000000000..6acbfb0b959f42950f763eee198b4b34cf17dd99 GIT binary patch literal 486845 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

+

+ The complete list of changes in earlier versions is available + here +

+]]> + + Sascha Weinreuter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.intellij.plugins.relaxNG.ProjectLoader + + + org.intellij.plugins.relaxNG.config.NoNamespaceConfig + org.intellij.plugins.relaxNG.config.NoNamespaceConfigImpl + + + + + + org.intellij.plugins.relaxNG.ApplicationLoader + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/src/inspectionDescriptions/UnresolvedReference.html b/plugins/relaxng/src/inspectionDescriptions/UnresolvedReference.html new file mode 100644 index 000000000000..216227e09bcc --- /dev/null +++ b/plugins/relaxng/src/inspectionDescriptions/UnresolvedReference.html @@ -0,0 +1,25 @@ + + + + + + +

+ This inspections checks for any unresolved references to named patterns ("define") in a RELAX-NG file in XML Syntax. + For unresolved references, a QuickFix is offered to create a corresponding define-element. +

+ + + + diff --git a/plugins/relaxng/src/inspectionDescriptions/UnusedDefine.html b/plugins/relaxng/src/inspectionDescriptions/UnusedDefine.html new file mode 100644 index 000000000000..1a59a9063112 --- /dev/null +++ b/plugins/relaxng/src/inspectionDescriptions/UnusedDefine.html @@ -0,0 +1,26 @@ + + + + + + +

+ This inspections checks for any unused named patterns ("define") in a RELAX-NG file (XML or Compact Syntax) and + highlights them as unused symbols. This is done with respect to includes from other files, i.e. a define is not + marked as unused if is is used through an include in another file. +

+ + + + diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/ApplicationLoader.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/ApplicationLoader.java new file mode 100644 index 000000000000..dc50fc37c5f6 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/ApplicationLoader.java @@ -0,0 +1,124 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import org.intellij.plugins.relaxNG.compact.psi.impl.RncDocument; +import org.intellij.plugins.relaxNG.inspections.RngDomInspection; +import org.intellij.plugins.relaxNG.inspections.UnusedDefineInspection; +import org.intellij.plugins.relaxNG.model.descriptors.RngNsDescriptor; +import org.intellij.plugins.relaxNG.validation.ValidateAction; +import org.intellij.plugins.relaxNG.xml.dom.RngDefine; +import org.intellij.plugins.relaxNG.xml.dom.impl.RngDefineMetaData; + +import com.intellij.codeInspection.InspectionToolProvider; +import com.intellij.javaee.ResourceRegistrar; +import com.intellij.javaee.StandardResourceProvider; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.components.ApplicationComponent; +import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.psi.PsiElement; +import com.intellij.psi.filters.AndFilter; +import com.intellij.psi.filters.ClassFilter; +import com.intellij.psi.filters.ElementFilter; +import com.intellij.psi.filters.position.NamespaceFilter; +import com.intellij.psi.meta.MetaDataRegistrar; +import com.intellij.psi.xml.XmlDocument; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.DomManager; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 18.07.2007 + */ +public class ApplicationLoader implements ApplicationComponent, InspectionToolProvider { + private static final String RNG_EXT = "rng"; + private static final String VALIDATE_XML = "ValidateXml"; + + @NonNls + @NotNull + public String getComponentName() { + return "Relax-NG"; + } + + public void initComponent() { + registerMetaData(); + + final FileTypeManager ftm = FileTypeManager.getInstance(); + ftm.registerFileType(StdFileTypes.XML, RNG_EXT); + + installValidateXmlAction(); + } + + private static void installValidateXmlAction() { + final ActionManager mgr = ActionManager.getInstance(); + final AnAction validateAction = mgr.getAction(VALIDATE_XML); + mgr.unregisterAction(VALIDATE_XML); + mgr.registerAction(VALIDATE_XML, new ValidateAction(validateAction)); + } + + private static void registerMetaData() { + final MetaDataRegistrar registrar = MetaDataRegistrar.getInstance(); + registrar.registerMetaData( + new AndFilter( + new NamespaceFilter(ProjectLoader.RNG_NAMESPACE), + new ClassFilter(XmlDocument.class) + ), + RngNsDescriptor.class); + + registrar.registerMetaData( + new ClassFilter(RncDocument.class), + RngNsDescriptor.class); + + registrar.registerMetaData(new ElementFilter() { + public boolean isAcceptable(Object element, PsiElement context) { + if (element instanceof XmlTag) { + final XmlTag tag = (XmlTag)element; + final DomElement domElement = DomManager.getDomManager(tag.getProject()).getDomElement(tag); + return domElement instanceof RngDefine; + } + return false; + } + + public boolean isClassAcceptable(Class hintClass) { + return XmlTag.class.isAssignableFrom(hintClass); + } + }, RngDefineMetaData.class); + } + + public void disposeComponent() { + } + + public Class[] getInspectionClasses() { + return new Class[]{ + RngDomInspection.class, + UnusedDefineInspection.class + }; + } + + public class ResourceProvider implements StandardResourceProvider { + public void registerResources(ResourceRegistrar registrar) { + registrar.addStdResource(ProjectLoader.RNG_NAMESPACE, "resources/relaxng.rng", getClass()); + registrar.addIgnoredResource("http://relaxng.org/ns/compatibility/annotations/1.0"); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/GotoSymbolContributor.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/GotoSymbolContributor.java new file mode 100644 index 000000000000..148acd83a7a9 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/GotoSymbolContributor.java @@ -0,0 +1,42 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import org.intellij.plugins.relaxNG.model.resolve.RelaxSymbolIndex; + +import com.intellij.navigation.ChooseByNameContributor; +import com.intellij.navigation.NavigationItem; +import com.intellij.openapi.project.Project; + +import java.util.Collection; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 24.10.2007 +*/ +public class GotoSymbolContributor implements ChooseByNameContributor { + + public NavigationItem[] getItemsByName(String name, String pattern, Project project, boolean includeNonProjectItems) { + return RelaxSymbolIndex.getSymbolsByName(name, project, includeNonProjectItems); + } + + public String[] getNames(Project project, boolean includeNonProjectItems) { + final Collection names = RelaxSymbolIndex.getSymbolNames(project); + return names.toArray(new String[names.size()]); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/ProjectLoader.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/ProjectLoader.java new file mode 100644 index 000000000000..2e356ce53c8a --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/ProjectLoader.java @@ -0,0 +1,152 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import com.intellij.lang.ASTNode; +import com.intellij.openapi.components.ProjectComponent; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.patterns.StringPattern; +import com.intellij.patterns.XmlNamedElementPattern; +import com.intellij.psi.AbstractElementManipulator; +import com.intellij.psi.PsiManager; +import com.intellij.psi.filters.position.PatternFilter; +import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.xml.DomFileDescription; +import com.intellij.util.xml.DomManager; +import com.intellij.util.xml.highlighting.DomElementsAnnotator; +import com.intellij.xml.util.XmlUtil; +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; +import org.intellij.plugins.relaxNG.compact.psi.RncFileReference; +import org.intellij.plugins.relaxNG.compact.psi.util.RenameUtil; +import org.intellij.plugins.relaxNG.model.annotation.ModelAnnotator; +import org.intellij.plugins.relaxNG.references.PrefixReferenceProvider; +import org.intellij.plugins.relaxNG.xml.dom.*; +import org.intellij.plugins.relaxNG.xml.dom.impl.RngDefineImpl; +import org.intellij.plugins.relaxNG.xml.dom.impl.RngGrammarImpl; +import org.intellij.plugins.relaxNG.xml.dom.impl.RngIncludeImpl; +import org.intellij.plugins.relaxNG.xml.dom.impl.RngRefImpl; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +import static com.intellij.patterns.StandardPatterns.string; +import static com.intellij.patterns.XmlPatterns.*; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 16.07.2007 + */ +public class ProjectLoader implements ProjectComponent { + public static final String RNG_NAMESPACE = "http://relaxng.org/ns/structure/1.0"; + + private static final XmlNamedElementPattern RNG_TAG_PATTERN = xmlTag().withNamespace(string().equalTo(RNG_NAMESPACE)); + + private static final XmlNamedElementPattern.XmlAttributePattern NAME_ATTR_PATTERN = xmlAttribute("name"); + private static final StringPattern ELEMENT_OR_ATTRIBUTE_PATTERN = string().oneOf("element", "attribute"); + private static final XmlNamedElementPattern.XmlAttributePattern NAME_PATTERN = NAME_ATTR_PATTERN.withParent( + RNG_TAG_PATTERN.withLocalName(ELEMENT_OR_ATTRIBUTE_PATTERN)); + + private final Project myProject; + + public ProjectLoader(Project project) { + myProject = project; + } + + @NonNls + @NotNull + public String getComponentName() { + return "RELAX-NG"; + } + + public void initComponent() { + registerFileDescriptions(); + + registerReferences(); + } + + private void registerReferences() { + final ReferenceProvidersRegistry registry = ReferenceProvidersRegistry.getInstance(myProject); + XmlUtil.registerXmlAttributeValueReferenceProvider(registry, new String[]{ + "name" + }, new PatternFilter(xmlAttributeValue().withParent(NAME_PATTERN)), true, new PrefixReferenceProvider()); + +// final XmlAttributeValuePattern id = xmlAttributeValue().withParent(xmlAttribute()).with(IdRefProvider.HAS_ID_REF_TYPE); +// final XmlAttributeValuePattern idref = xmlAttributeValue().withParent(xmlAttribute()).with(IdRefProvider.HAS_ID_TYPE); +// registry.registerXmlAttributeValueReferenceProvider(null, new PatternFilter(or(id, idref)), false, new IdRefProvider()); + } + + @SuppressWarnings({ "deprecation" }) + private void registerFileDescriptions() { + final DomManager mgr = DomManager.getDomManager(myProject); + mgr.registerFileDescription(new MyFileDescription(RngGrammar.class, "grammar")); + mgr.registerFileDescription(new MyFileDescription(RngElement.class, "element")); + mgr.registerFileDescription(new MyFileDescription(RngChoice.class, "choice")); + mgr.registerFileDescription(new MyFileDescription(RngGroup.class, "group")); + mgr.registerFileDescription(new MyFileDescription(RngInterleave.class, "interleave")); + } + + public void disposeComponent() { + } + + public void projectOpened() { + } + + public void projectClosed() { + } + + private static class MyFileDescription extends DomFileDescription { + public MyFileDescription(Class elementClass, String rootTagName) { + super(elementClass, rootTagName); + registerNamespacePolicy("RELAX-NG", RNG_NAMESPACE); + registerImplementation(RngDefine.class, RngDefineImpl.class); + registerImplementation(RngGrammar.class, RngGrammarImpl.class); + registerImplementation(RngInclude.class, RngIncludeImpl.class); + registerImplementation(RngRef.class, RngRefImpl.class); + } + + public boolean isAutomaticHighlightingEnabled() { + return true; + } + + public DomElementsAnnotator createAnnotator() { + return new ModelAnnotator(); + } + } + + public static class RncFileReferenceManipulator extends AbstractElementManipulator { + public RncFileReference handleContentChange(RncFileReference element, TextRange range, String newContent) throws IncorrectOperationException { + final ASTNode node = element.getNode(); + assert node != null; + + final ASTNode literal = node.findChildByType(RncTokenTypes.LITERAL); + if (literal != null) { + assert range.equals(element.getReferenceRange()); + final PsiManager manager = PsiManager.getInstance(element.getProject()); + final ASTNode newChild = RenameUtil.createLiteralNode(manager, newContent); + literal.getTreeParent().replaceChild(literal, newChild); + } + return element; + } + + @Override + public TextRange getRangeInElement(RncFileReference element) { + return element.getReferenceRange(); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/RngDocumentationProvider.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/RngDocumentationProvider.java new file mode 100644 index 000000000000..c11ef0983289 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/RngDocumentationProvider.java @@ -0,0 +1,148 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import org.intellij.plugins.relaxNG.model.descriptors.CompositeDescriptor; +import org.intellij.plugins.relaxNG.model.descriptors.RngElementDescriptor; +import org.intellij.plugins.relaxNG.model.descriptors.RngXmlAttributeDescriptor; + +import com.intellij.lang.documentation.DocumentationProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiManager; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlElement; +import com.intellij.psi.xml.XmlTag; +import com.intellij.xml.XmlAttributeDescriptor; +import com.intellij.xml.XmlElementDescriptor; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; + +import org.kohsuke.rngom.digested.DElementPattern; + +import java.util.Collection; +import java.util.List; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 19.11.2007 +*/ +public class RngDocumentationProvider implements DocumentationProvider { + @NonNls + private static final String COMPATIBILITY_ANNOTATIONS_1_0 = "http://relaxng.org/ns/compatibility/annotations/1.0"; + + @Nullable + public String generateDoc(PsiElement element, PsiElement originalElement) { + final XmlElement c = PsiTreeUtil.getParentOfType(originalElement, XmlTag.class, XmlAttribute.class); + if (c instanceof XmlTag) { + final XmlTag xmlElement = (XmlTag)c; + final XmlElementDescriptor descriptor = xmlElement.getDescriptor(); + if (descriptor instanceof CompositeDescriptor) { + final StringBuilder sb = new StringBuilder(); + final CompositeDescriptor d = (CompositeDescriptor)descriptor; + final DElementPattern[] patterns = d.getElementPatterns(); + for (DElementPattern pattern : patterns) { + final PsiElement psiElement = d.getDeclaration(pattern.getLocation()); + if (psiElement instanceof XmlTag) { + if (sb.length() > 0) { + sb.append("
"); + } + sb.append(getDocumentationFromTag((XmlTag)psiElement, xmlElement.getLocalName(), "Element")); + } + } + return makeDocumentation(sb); + } else if (descriptor instanceof RngElementDescriptor) { + final RngElementDescriptor d = (RngElementDescriptor)descriptor; + final PsiElement declaration = d.getDeclaration(); + if (declaration instanceof XmlTag) { + return makeDocumentation(getDocumentationFromTag((XmlTag)declaration, xmlElement.getLocalName(), "Element")); + } + } + } else if (c instanceof XmlAttribute) { + final XmlAttribute attribute = (XmlAttribute)c; + final XmlAttributeDescriptor descriptor = attribute.getDescriptor(); + if (descriptor instanceof RngXmlAttributeDescriptor) { + final RngXmlAttributeDescriptor d = (RngXmlAttributeDescriptor)descriptor; + final StringBuilder sb = new StringBuilder(); + final Collection declaration = d.getDeclarations(); + for (PsiElement psiElement : declaration) { + if (psiElement instanceof XmlTag) { + if (sb.length() > 0) { + sb.append("
"); + } + sb.append(getDocumentationFromTag((XmlTag)element, d.getName(), "Attribute")); + } + } + } + } else if (element instanceof XmlTag) { + return makeDocumentation(getDocumentationFromTag((XmlTag)element, ((XmlTag)element).getLocalName(), "Element")); + } + return null; + } + + private static String makeDocumentation(StringBuilder sb) { + if (!sb.toString().startsWith("")) { + sb.insert(0, ""); + sb.append(""); + } + return sb.toString().replaceAll("\n", "
"); + } + + private static StringBuilder getDocumentationFromTag(XmlTag tag, String localName, String kind) { + if (tag.getNamespace().equals(ProjectLoader.RNG_NAMESPACE)) { + final StringBuilder sb = new StringBuilder(); + sb.append(kind).append(": ").append(localName).append("
"); + final XmlTag[] docTags = tag.findSubTags("documentation", COMPATIBILITY_ANNOTATIONS_1_0); + for (XmlTag docTag : docTags) { + sb.append(docTag.getValue().getTrimmedText()); + sb.append("\n"); + } + final XmlTag nextTag = PsiTreeUtil.getNextSiblingOfType(tag, XmlTag.class); + if (nextTag != null) { + if ("documentation".equals(nextTag.getLocalName()) && COMPATIBILITY_ANNOTATIONS_1_0.equals(nextTag.getNamespace())) { + sb.append(nextTag.getValue().getTrimmedText()); + } + } + return sb; + } + return null; + } + + @Nullable + public PsiElement getDocumentationElementForLink(PsiManager psiManager, String link, PsiElement context) { + return null; + } + + @Nullable + public PsiElement getDocumentationElementForLookupItem(PsiManager psiManager, Object object, PsiElement element) { + return null; + } + + @Nullable + public String getQuickNavigateInfo(PsiElement element) { + return null; + } + + public List getUrlFor(PsiElement element, PsiElement originalElement) { + return null; + } + + public int hashCode() { + return 0; // CompositeDocumentationProvider uses a HashSet that doesn't preserve order. We want to be the first one. + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/SimpleErrorReportSubmitter.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/SimpleErrorReportSubmitter.java new file mode 100644 index 000000000000..1b11167e6eba --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/SimpleErrorReportSubmitter.java @@ -0,0 +1,135 @@ +/* + * Copyright 2006 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import com.intellij.ide.BrowserUtil; +import com.intellij.ide.plugins.IdeaPluginDescriptor; +import com.intellij.ide.plugins.PluginManager; +import com.intellij.openapi.diagnostic.ErrorReportSubmitter; +import com.intellij.openapi.diagnostic.IdeaLoggingEvent; +import com.intellij.openapi.diagnostic.SubmittedReportInfo; +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.ui.Messages; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import java.awt.*; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +public class SimpleErrorReportSubmitter extends ErrorReportSubmitter { + public String getReportActionText() { + return "Error Report Information"; + } + + public SubmittedReportInfo submit(IdeaLoggingEvent[] events, Component parentComponent) { + final IdeaPluginDescriptor plugin = PluginManager.getPlugin(getPluginDescriptor().getPluginId()); + + assert plugin != null; + final String title = plugin.getName() + " - " + plugin.getVersion(); + + final String vendorEmail = plugin.getVendorEmail(); + final String subject = title + " Exception"; + final String mailto = "mailto:" + encode(vendorEmail) + "?Subject=" + encode(subject) /*+ + "&body=" + encode("Stacktrace:\n" + events[0].getThrowableText())*/; + + final String weblink = "http://www.intellij.net/forums/forum.jsp?forum=18"; + final String website = plugin.getUrl(); + + final String font = new JLabel().getFont().getName(); + + String message = "" + + "To report an exception, please post the exception stacktrace and a short description " + + "of how it can be reproduced to the IntelliJ " + + "plugin web forum or the corresponding newsgroup, " + + "and/or send an email containing that information to " + + "" + vendorEmail + "." + + (website != null ? "

Please also check the plugin's website for more information." : "") + + "
"; + + final JEditorPane pane = new JEditorPane("text/html", message); + pane.setEditable(false); + pane.setPreferredSize(new Dimension(410, website != null ? 110 : 80)); + pane.addHyperlinkListener(new HyperlinkListener() { + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + BrowserUtil.launchBrowser(e.getURL().toExternalForm()); + } + } + }); + + new MyMessageDialog(parentComponent, title, Messages.getErrorIcon(), pane).show(); + + return new SubmittedReportInfo(null, null, SubmittedReportInfo.SubmissionStatus.FAILED); + } + + private String encode(String link) { + final String enc = System.getProperty("file.encoding"); + try { + return URLEncoder.encode(link, enc).replaceAll("\\+", "%20"); + } catch (UnsupportedEncodingException e) { + throw new Error(e); + } + } + + private static class MyMessageDialog extends DialogWrapper { + protected JComponent myMessage; + protected Icon myIcon; + + public MyMessageDialog(Component parent, String title, Icon icon, JComponent message) { + super(parent, false); + _init(title, message, icon); + } + + private void _init(String title, JComponent message, Icon icon) { + setTitle(title); + myMessage = message; + myIcon = icon; + setButtonsAlignment(SwingUtilities.CENTER); + init(); + + myMessage.setBackground(getContentPane().getBackground()); + } + + protected Action[] createActions() { + return new Action[]{ getOKAction() }; + } + + protected JComponent createNorthPanel() { + JPanel panel = new JPanel(new BorderLayout(15, 0)); + if (myIcon != null) { + JLabel iconLabel = new JLabel(myIcon); + Container container = new Container(); + container.setLayout(new BorderLayout()); + container.add(iconLabel, BorderLayout.NORTH); + panel.add(container, BorderLayout.WEST); + } + + if (myMessage != null) { + panel.add(myMessage, BorderLayout.CENTER); + } + return panel; + } + + @Nullable + protected JComponent createCenterPanel() { + return null; + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/ReferenceAnnotator.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/ReferenceAnnotator.java new file mode 100644 index 000000000000..f178ef65d4b0 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/ReferenceAnnotator.java @@ -0,0 +1,126 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact; + +import org.intellij.plugins.relaxNG.compact.psi.*; + +import com.intellij.codeInsight.daemon.EmptyResolveMessageProvider; +import com.intellij.codeInsight.daemon.QuickFixProvider; +import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.daemon.impl.HighlightInfoType; +import com.intellij.codeInspection.ProblemHighlightType; +import com.intellij.lang.annotation.Annotation; +import com.intellij.lang.annotation.AnnotationHolder; +import com.intellij.lang.annotation.Annotator; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiPolyVariantReference; +import com.intellij.psi.PsiReference; +import org.jetbrains.annotations.NotNull; + +import java.text.MessageFormat; +import java.util.List; + +/** + * Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 10.08.2007 +*/ +public class ReferenceAnnotator extends RncElementVisitor implements Annotator { + private AnnotationHolder myHolder; + + public synchronized void annotate(@NotNull PsiElement psiElement, @NotNull AnnotationHolder holder) { + myHolder = holder; + try { + psiElement.accept(this); + } finally { + myHolder = null; + } + } + + @Override + public void visitInclude(RncInclude include) { + checkReferences(include.getReferences()); + } + + @Override + public void visitExternalRef(RncExternalRef ref) { + checkReferences(ref.getReferences()); + } + + @Override + public void visitRef(RncRef pattern) { + checkReferences(pattern.getReferences()); + } + + @Override + public void visitParentRef(RncParentRef pattern) { + checkReferences(pattern.getReferences()); + } + + @Override + public void visitName(RncName name) { + checkReferences(name.getReferences()); + } + + private void checkReferences(PsiReference[] references) { + for (PsiReference reference : references) { + if (!reference.isSoft()) { + if (reference.resolve() == null) { + if (reference instanceof PsiPolyVariantReference) { + final PsiPolyVariantReference pvr = (PsiPolyVariantReference)reference; + if (pvr.multiResolve(false).length == 0) { + addError(reference); + } + } else { + addError(reference); + } + } + } + } + } + + private void addError(PsiReference reference) { + final TextRange rangeInElement = reference.getRangeInElement(); + final TextRange range = TextRange.from(reference.getElement().getTextRange().getStartOffset() + + rangeInElement.getStartOffset(), rangeInElement.getLength()); + + final Annotation annotation; + if (reference instanceof EmptyResolveMessageProvider) { + final String s = ((EmptyResolveMessageProvider)reference).getUnresolvedMessagePattern(); + annotation = myHolder.createErrorAnnotation(range, s != null ? + MessageFormat.format(s, reference.getCanonicalText()) + : "Cannot resolve symbol"); + } else { + annotation = myHolder.createErrorAnnotation(range, "Cannot resolve symbol"); + } + annotation.setHighlightType(ProblemHighlightType.LIKE_UNKNOWN_SYMBOL); + + if (reference instanceof QuickFixProvider) { + final HighlightInfo info = new HighlightInfo(HighlightInfoType.WRONG_REF, annotation.getStartOffset(), annotation.getEndOffset(), "", null); + ((QuickFixProvider)reference).registerQuickfix(info, reference); + + final List> ranges = info.quickFixActionRanges; + if (ranges != null) { + for (Pair pair : ranges) { + annotation.registerFix(pair.first.getAction(), pair.second); + } + } + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncCompletionData.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncCompletionData.java new file mode 100644 index 000000000000..657396bd8c92 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncCompletionData.java @@ -0,0 +1,137 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact; + +import com.intellij.codeInsight.TailType; +import com.intellij.codeInsight.completion.CompletionContext; +import com.intellij.codeInsight.completion.CompletionData; +import com.intellij.codeInsight.completion.CompletionVariant; +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementFactory; +import com.intellij.patterns.ElementPattern; +import com.intellij.patterns.PsiElementPattern; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiWhiteSpace; +import com.intellij.psi.filters.AndFilter; +import com.intellij.psi.filters.ContextGetter; +import com.intellij.psi.filters.ElementFilter; +import com.intellij.psi.filters.position.PatternFilter; +import com.intellij.psi.impl.source.tree.LeafPsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; +import org.intellij.plugins.relaxNG.compact.psi.RncDecl; +import org.intellij.plugins.relaxNG.compact.psi.RncDefine; +import org.intellij.plugins.relaxNG.compact.psi.RncElement; +import org.intellij.plugins.relaxNG.compact.psi.RncGrammar; +import org.intellij.plugins.relaxNG.compact.psi.util.EscapeUtil; + +import static com.intellij.patterns.PlatformPatterns.psiElement; +import static com.intellij.patterns.StandardPatterns.*; + +public class RncCompletionData extends CompletionData { + + public RncCompletionData() { + declareFinalScope(RncElement.class); + + final CompletionVariant variant = new CompletionVariant(new AndFilter( + new ElementFilter() { + public boolean isAcceptable(Object element, PsiElement context) { + return true; + } + + public boolean isClassAcceptable(Class hintClass) { + return PsiElement.class.isAssignableFrom(hintClass); + } + }, + new PatternFilter(or( + psiElement().afterLeaf(psiElement(RncTokenTypes.KEYWORD_DEFAULT)), + not( + or( + psiElement().inside(psiElement(RncTokenTypes.LITERAL)), + psiElement().afterLeaf(psiElement().withElementType(RncTokenTypes.KEYWORDS)) + ) + ) + )) + )); + + variant.includeScopeClass(LeafPsiElement.class, true); + + variant.addCompletion(new KeywordGetter()); + + registerVariant(variant); + } + + private static class KeywordGetter implements ContextGetter { + private static final ElementPattern TOP_LEVEL = + not(psiElement().inside(psiElement(RncGrammar.class) + .inside(true, psiElement(RncGrammar.class)))); + + private static final PsiElementPattern DECL_PATTERN = + psiElement().inside(psiElement(RncDecl.class)); + + private static final PsiElementPattern DEFAULT_PATTERN = + DECL_PATTERN.afterLeaf(psiElement().withText("default")); + + private static final ElementPattern DEFINE_PATTERN = + and(psiElement().withParent(RncDefine.class), psiElement().afterLeafSkipping(psiElement(PsiWhiteSpace.class), psiElement().withText("="))); + + private static final String[] DECL_KEYWORDS = new String[]{ "default", "namespace", "datatypes" }; + private static final String[] GRAMMAR_CONTENT_KEYWORDS = new String[]{ "include", "div", "start" }; + private static final String[] PATTERN_KEYWORDS = new String[]{ "attribute", "element", "grammar", + "notAllowed", "text", "empty", "external", "parent", "list", "mixed" }; + + public Object[] get(PsiElement context, CompletionContext completionContext) { + return ContainerUtil.map2Array(doGetKeywords(context), LookupElement.class, new Function() { + public LookupElement fun(String s) { + return LookupElementFactory.getInstance().createLookupElement(s).setTailType(TailType.SPACE).setBold(); + } + }); + } + + private String[] doGetKeywords(PsiElement context) { + final PsiElement next = PsiTreeUtil.skipSiblingsForward(context, PsiWhiteSpace.class); + if (next != null && EscapeUtil.unescapeText(next).equals("=")) { + return new String[]{ "start" }; + } + + if (DEFAULT_PATTERN.accepts(context)) { + return new String[]{ "namespace" }; + } else if (DECL_PATTERN.accepts(context)) { + return ArrayUtil.EMPTY_STRING_ARRAY; + } else if (context.getParent() instanceof RncDefine && context.getParent().getFirstChild() == context) { + if (DEFINE_PATTERN.accepts(context)) { + return ArrayUtil.EMPTY_STRING_ARRAY; + } + if (TOP_LEVEL.accepts(context)) { + if (!afterPattern(context)) { + return ArrayUtil.mergeArrays(DECL_KEYWORDS, + ArrayUtil.mergeArrays(GRAMMAR_CONTENT_KEYWORDS, PATTERN_KEYWORDS, String.class), String.class); + } + } + return GRAMMAR_CONTENT_KEYWORDS; + } + return PATTERN_KEYWORDS; + } + + private boolean afterPattern(PsiElement context) { + // TODO: recognize all patterns + return PsiTreeUtil.getPrevSiblingOfType(context.getParent(), RncDefine.class) != null; + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncElementType.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncElementType.java new file mode 100644 index 000000000000..2d806252c2de --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncElementType.java @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact; + +import org.intellij.plugins.relaxNG.compact.psi.RncElement; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.tree.IElementType; +import com.intellij.util.NotNullFunction; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Modifier; + +public class RncElementType extends IElementType { + public RncElementType(String name) { + super(name, RngCompactLanguage.INSTANCE); + } +} + +class RncElementTypeEx extends RncElementType implements NotNullFunction { + private final Constructor myConstructor; + + RncElementTypeEx(String name, Class clazz) { + super(name); + assert !clazz.isInterface() && !Modifier.isAbstract(clazz.getModifiers()); + try { + myConstructor = clazz.getConstructor(ASTNode.class); + } catch (NoSuchMethodException e) { + throw new Error(e); + } + } + + @NotNull + public final C fun(ASTNode node) { + try { + return myConstructor.newInstance(node); + } catch (Exception e) { + throw new Error(e); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncElementTypes.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncElementTypes.java new file mode 100644 index 000000000000..16b4f0a175d4 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncElementTypes.java @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact; + +import org.intellij.plugins.relaxNG.compact.psi.*; +import org.intellij.plugins.relaxNG.compact.psi.impl.*; + +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.IFileElementType; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 01.08.2007 +*/ +public class RncElementTypes { + public static final IFileElementType FILE_ELEMENT_TYPE = new IFileElementType(RngCompactLanguage.INSTANCE); + + public static final IElementType DOCUMENT = new RncElementTypeEx("DOCUMENT", RncDocument.class); + + public static final IElementType NS_DECL = new RncElementTypeEx("NS_DECL", RncNsDeclImpl.class); + public static final IElementType DATATYPES_DECL = new RncElementTypeEx("DATATYPES_DECL", RncDeclImpl.class); + + public static final IElementType START = new RncElementType("START"); + public static final IElementType DIV = new RncElementTypeEx("DIV", RncDivImpl.class); + public static final IElementType INCLUDE = new RncElementTypeEx("INCLUDE", RncIncludeImpl.class); + + public static final IElementType NAME_CLASS = new RncElementType("NAME_CLASS"); + public static final IElementType NAME_CLASS_CHOICE = new RncElementType("NAME_CLASS_CHOICE"); + public static final IElementType EXCEPT_NAME_CLASS = new RncElementType("EXCEPT_NAME_CLASS"); + + public static final IElementType DEFINE = new RncElementTypeEx("DEFINE", RncDefineImpl.class); + public static final IElementType PATTERN = new RncElementType("PATTERN"); + public static final IElementType GROUP_PATTERN = new RncElementType("GROUP_PATTERN"); + public static final IElementType GRAMMAR_PATTERN = new RncElementTypeEx("GRAMMAR_PATTERN", RncGrammarImpl.class); + public static final IElementType EMPTY_PATTERN = new RncElementType("EMPTY_PATTERN"); + public static final IElementType TEXT_PATTERN = new RncElementType("TEXT_PATTERN"); + public static final IElementType NOT_ALLOWED_PATTERN = new RncElementType("NOT_ALLOWED_PATTERN"); + public static final IElementType EXTERNAL_REF = new RncElementTypeEx("EXTERNAL_REF", RncExternalRefImpl.class); + public static final IElementType PARENT_REF = new RncElementTypeEx("PARENT_REF", RncParentRefImpl.class); + public static final IElementType REF_PATTERN = new RncElementTypeEx("REF_PATTERN", RncRefImpl.class); + public static final IElementType LIST_PATTERN = new RncElementType("LIST_PATTERN"); + public static final IElementType MIXED_PATTERN = new RncElementType("MIXED_PATTERN"); + + public static final IElementType DATATYPE_PATTERN = new RncElementType("DATATYPE_PATTERN"); + public static final IElementType PARAM = new RncElementType("PARAM"); + + public static final IElementType SEQUENCE = new RncElementType("SEQUENCE"); + public static final IElementType INTERLEAVE = new RncElementType("INTERLEAVE"); + public static final IElementType CHOICE = new RncElementType("CHOICE"); + public static final IElementType OPTIONAL = new RncElementType("OPTIONAL"); + public static final IElementType ZERO_OR_MORE = new RncElementType("ZERO_OR_MORE"); + public static final IElementType ONE_OR_MORE = new RncElementType("ONE_OR_MORE"); + + public static final IElementType NAME = new RncElementTypeEx("NAME", RncNameImpl.class); + + public static final IElementType ANNOTATION = new RncElementTypeEx("ANNOTATION", RncAnnotationImpl.class); + public static final IElementType ANNOTATION_ELEMENT = new RncElementTypeEx("ANNOTATION_ELEMENT", RncAnnotationImpl.class); + public static final IElementType FORWARD_ANNOTATION = new RncElementTypeEx("FORWARD_ANNOTATION", RncAnnotationImpl.class); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncFileType.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncFileType.java new file mode 100644 index 000000000000..c464eaf1af85 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncFileType.java @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact; + +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.FileTypeConsumer; +import com.intellij.openapi.fileTypes.FileTypeFactory; +import com.intellij.openapi.fileTypes.LanguageFileType; +import com.intellij.openapi.util.IconLoader; +import com.intellij.util.PairConsumer; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 01.08.2007 +*/ +public class RncFileType extends LanguageFileType { + public static final String RNC_EXT = "rnc"; + + private static FileType INSTANCE; + + private RncFileType() { + super(RngCompactLanguage.INSTANCE); + } + + @NotNull + @NonNls + public String getName() { + return "RNG Compact"; + } + + @NotNull + public String getDescription() { + return "RELAX NG Compact Syntax"; + } + + @NotNull + @NonNls + public String getDefaultExtension() { + return "rnc"; + } + + @Nullable + public Icon getIcon() { + return IconLoader.findIcon("/fileTypes/text.png"); + } + + public static synchronized FileType getInstance() { + if (INSTANCE == null) { + INSTANCE = new RncFileType(); + } + return INSTANCE; + } + + public static class Factory extends FileTypeFactory { + public void createFileTypes(@NotNull FileTypeConsumer fileTypeConsumer) { + fileTypeConsumer.consume(getInstance(), RNC_EXT); + } + + public void createFileTypes(@NotNull PairConsumer consumer) { + consumer.consume(getInstance(), RNC_EXT); + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncHighlighter.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncHighlighter.java new file mode 100644 index 000000000000..738d3bc843f2 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncHighlighter.java @@ -0,0 +1,77 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact; + +import org.intellij.plugins.relaxNG.compact.lexer.CompactSyntaxLexerAdapter; + +import com.intellij.lexer.Lexer; +import com.intellij.openapi.editor.HighlighterColors; +import com.intellij.openapi.editor.SyntaxHighlighterColors; +import com.intellij.openapi.editor.colors.CodeInsightColors; +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.fileTypes.SyntaxHighlighterBase; +import com.intellij.psi.tree.IElementType; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 04.08.2007 + */ +public class RncHighlighter extends SyntaxHighlighterBase { + @NotNull + public Lexer getHighlightingLexer() { + return new CompactSyntaxLexerAdapter(); + } + + private static final Map ourMap1; + + static { + ourMap1 = new HashMap(); + + fillMap(ourMap1, RncTokenTypes.KEYWORDS, SyntaxHighlighterColors.KEYWORD); + fillMap(ourMap1, RncTokenTypes.OPERATORS, SyntaxHighlighterColors.OPERATION_SIGN); + + fillMap(ourMap1, RncTokenTypes.STRINGS, SyntaxHighlighterColors.STRING); + + ourMap1.put(RncTokenTypes.LBRACE, SyntaxHighlighterColors.BRACES); + ourMap1.put(RncTokenTypes.RBRACE, SyntaxHighlighterColors.BRACES); + + ourMap1.put(RncTokenTypes.LBRACKET, SyntaxHighlighterColors.BRACKETS); + ourMap1.put(RncTokenTypes.RBRACKET, SyntaxHighlighterColors.BRACKETS); + + ourMap1.put(RncTokenTypes.LPAREN, SyntaxHighlighterColors.PARENTHS); + ourMap1.put(RncTokenTypes.RPAREN, SyntaxHighlighterColors.PARENTHS); + + ourMap1.put(RncTokenTypes.COMMA, SyntaxHighlighterColors.COMMA); + + fillMap(ourMap1, RncTokenTypes.DOC_TOKENS, SyntaxHighlighterColors.DOC_COMMENT); + fillMap(ourMap1, RncTokenTypes.COMMENTS, SyntaxHighlighterColors.LINE_COMMENT); + + fillMap(ourMap1, RncTokenTypes.IDENTIFIERS, CodeInsightColors.LOCAL_VARIABLE_ATTRIBUTES); + + ourMap1.put(RncTokenTypes.ILLEGAL_CHAR, HighlighterColors.BAD_CHARACTER); + } + + @NotNull + public TextAttributesKey[] getTokenHighlights(IElementType tokenType) { + return pack(ourMap1.get(tokenType)); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncParserDefinition.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncParserDefinition.java new file mode 100644 index 000000000000..88e90bb7a01c --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncParserDefinition.java @@ -0,0 +1,103 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact; + +import org.intellij.plugins.relaxNG.compact.lexer.CompactSyntaxLexerAdapter; +import org.intellij.plugins.relaxNG.compact.parser.RncParser; +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; +import org.intellij.plugins.relaxNG.compact.psi.impl.RncElementImpl; +import org.intellij.plugins.relaxNG.compact.psi.impl.RncFileImpl; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.ParserDefinition; +import com.intellij.lang.PsiParser; +import com.intellij.lexer.Lexer; +import com.intellij.openapi.project.Project; +import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.TokenType; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.IFileElementType; +import com.intellij.psi.tree.TokenSet; +import com.intellij.util.NotNullFunction; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 10.08.2007 + */ +public class RncParserDefinition implements ParserDefinition { + @NotNull + public Lexer createLexer(Project project) { + return new CompactSyntaxLexerAdapter(); + } + + public PsiParser createParser(Project project) { + return new RncParser(); + } + + public IFileElementType getFileNodeType() { + return RncElementTypes.FILE_ELEMENT_TYPE; + } + + @NotNull + public TokenSet getWhitespaceTokens() { + return TokenSet.create(TokenType.WHITE_SPACE); + } + + @NotNull + public TokenSet getCommentTokens() { + return TokenSet.orSet(RncTokenTypes.COMMENTS, RncTokenTypes.DOC_TOKENS); + } + + @NotNull + public TokenSet getStringLiteralElements() { + return TokenSet.create(RncTokenTypes.LITERAL); + } + + @NotNull + @SuppressWarnings({ "unchecked" }) + public PsiElement createElement(ASTNode node) { + final IElementType type = node.getElementType(); + + if (type instanceof NotNullFunction) { + return ((NotNullFunction)type).fun(node); + } + + return new MyRncElement(node); + } + + public PsiFile createFile(FileViewProvider viewProvider) { + return new RncFileImpl(viewProvider); + } + + public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode left, ASTNode right) { + return SpaceRequirements.MAY; + } + + private static class MyRncElement extends RncElementImpl { + public MyRncElement(ASTNode node) { + super(node); + } + + public void accept(@NotNull RncElementVisitor visitor) { + visitor.visitElement(this); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncTokenTypes.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncTokenTypes.java new file mode 100644 index 000000000000..d64b67851f54 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RncTokenTypes.java @@ -0,0 +1,205 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact; + +import com.intellij.openapi.util.Ref; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; +import org.jetbrains.annotations.NotNull; + +import gnu.trove.TIntObjectHashMap; +import gnu.trove.TObjectProcedure; +import org.kohsuke.rngom.parse.compact.CompactSyntaxConstants; + +import java.lang.reflect.Field; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 04.08.2007 + */ +public class RncTokenTypes { + private static final TIntObjectHashMap ourTokenTypes = new TIntObjectHashMap(); + + static { + assert RngCompactLanguage.INSTANCE != null; + try { + final Field[] fields = CompactSyntaxConstants.class.getFields(); + for (Field field : fields) { + final String name = field.getName(); + if (name.equals("DEFAULT")) break; + + if (int.class.isAssignableFrom(field.getType())) { + Integer i = (Integer)field.get(null); + ourTokenTypes.put(i, new RncElementType(name)); + } + } + + final String[] tokens = CompactSyntaxConstants.tokenImage; + for (int i = 0; i < tokens.length; i++) { + String token = tokens[i]; + if (token.matches("\"\\w*\"")) { + token = "KEYWORD_" + token.substring(1, token.length() - 1).toUpperCase(); + } else if (token.matches("\".*\"")) { + token = token.substring(1, token.length() - 1); + } + if (ourTokenTypes.get(i) == null) { + ourTokenTypes.put(i, new RncElementType(token)); + } + } + } catch (IllegalAccessException e) { + throw new Error(e); + } + } + + @NotNull + public static IElementType get(int i) { + assert !ourTokenTypes.isEmpty(); + final IElementType type = ourTokenTypes.get(i); + assert type != null : "Unknown token kind: " + i; + return type; + } + + @NotNull + private static IElementType get(final String name) { + assert !ourTokenTypes.isEmpty(); + final Ref ref = new Ref(); + ourTokenTypes.forEachValue(new TObjectProcedure() { + public boolean execute(IElementType iElementType) { + if (iElementType.toString().equals(name)) { + ref.set(iElementType); + return false; + } + return true; + } + }); + return ref.get(); + } + + private static final IElementType WS = get(CompactSyntaxConstants.WS); + public static final TokenSet WHITESPACE = TokenSet.create(WS); + + public static final IElementType ILLEGAL_CHAR = get(CompactSyntaxConstants.ILLEGAL_CHAR); + + public static final IElementType LBRACE = get("{"); + public static final IElementType RBRACE = get("}"); + public static final IElementType LBRACKET = get("["); + public static final IElementType RBRACKET = get("]"); + public static final IElementType LPAREN = get("("); + public static final IElementType RPAREN = get(")"); + + public static final IElementType GTGT = get(CompactSyntaxConstants.FANNOTATE); + + public static final TokenSet BRACES = TokenSet.create(LBRACE, RBRACE); + + public static final IElementType EQ = get("="); + public static final IElementType PLUS = get("+"); + public static final IElementType MINUS = get("-"); + public static final IElementType STAR = get("*"); + public static final IElementType AND = get("&"); + public static final IElementType PIPE = get("|"); + public static final IElementType QUEST = get("?"); + + public static final IElementType PREFIXED_NAME = get(CompactSyntaxConstants.PREFIXED_NAME); + public static final IElementType PREFIXED_STAR = get(CompactSyntaxConstants.PREFIX_STAR); + + public static final IElementType CHOICE_EQ = get("|="); + public static final IElementType INTERLEAVE_EQ = get("&="); + + public static final IElementType COMMA = get(","); + + public static final TokenSet BINARY_OPS = TokenSet.create( + COMMA, PIPE, AND + ); + + public static final TokenSet QUANTIFIER_OPS = TokenSet.create( + PLUS, STAR, QUEST + ); + + public static final IElementType DOC = get(CompactSyntaxConstants.DOCUMENTATION); + public static final TokenSet DOC_TOKENS = TokenSet.create( + DOC, + get(CompactSyntaxConstants.DOCUMENTATION_AFTER_SINGLE_LINE_COMMENT), + get(CompactSyntaxConstants.DOCUMENTATION_CONTINUE) + ); + + public static final IElementType COMMENT = get(CompactSyntaxConstants.SINGLE_LINE_COMMENT); + public static final TokenSet COMMENTS = TokenSet.create( + COMMENT, + get(CompactSyntaxConstants.SINGLE_LINE_COMMENT_CONTINUE) + ); + + public static final IElementType ESCAPED_IDENTIFIER = get(CompactSyntaxConstants.ESCAPED_IDENTIFIER); + public static final TokenSet IDENTIFIERS = TokenSet.create( + get(CompactSyntaxConstants.IDENTIFIER), + ESCAPED_IDENTIFIER + ); + + public static final TokenSet OPERATORS = TokenSet.orSet(TokenSet.create( + CHOICE_EQ, INTERLEAVE_EQ), BINARY_OPS, QUANTIFIER_OPS); + + public static final IElementType LITERAL = get(CompactSyntaxConstants.LITERAL); + public static final TokenSet STRINGS = TokenSet.create(LITERAL); + + static final TokenSet READABLE_TEXT = TokenSet.orSet( + DOC_TOKENS, COMMENTS, + TokenSet.create(LITERAL)); + + public static final IElementType KEYWORD_ElEMENT = get("KEYWORD_ELEMENT"); + public static final IElementType KEYWORD_ATTRIBUTE = get("KEYWORD_ATTRIBUTE"); + public static final IElementType KEYWORD_NAMESPACE = get("KEYWORD_NAMESPACE"); + public static final IElementType KEYWORD_LIST = get("KEYWORD_LIST"); + public static final IElementType KEYWORD_MIXED = get("KEYWORD_MIXED"); + public static final IElementType KEYWORD_EMPTY = get("KEYWORD_EMPTY"); + public static final IElementType KEYWORD_GRAMMAR = get("KEYWORD_GRAMMAR"); + public static final IElementType KEYWORD_TEXT = get("KEYWORD_TEXT"); + public static final IElementType KEYWORD_PARENT = get("KEYWORD_PARENT"); + public static final IElementType KEYWORD_EXTERNAL = get("KEYWORD_LIST"); + public static final IElementType KEYWORD_NOT_ALLOWED = get("KEYWORD_NOTALLOWED"); + public static final IElementType KEYWORD_START = get("KEYWORD_START"); + public static final IElementType KEYWORD_INCLUDE = get("KEYWORD_INCLUDE"); + public static final IElementType KEYWORD_DEFAULT = get("KEYWORD_DEFAULT"); + public static final IElementType KEYWORD_INHERIT = get("KEYWORD_INHERIT"); + public static final IElementType KEYWORD_STRING = get("KEYWORD_STRING"); + public static final IElementType KEYWORD_TOKEN = get("KEYWORD_TOKEN"); + public static final IElementType KEYWORD_DATATYPES = get("KEYWORD_DATATYPES"); + public static final IElementType KEYWORD_DIV = get("KEYWORD_DIV"); + + public static final TokenSet KEYWORDS = TokenSet.create( + KEYWORD_ATTRIBUTE, + KEYWORD_DATATYPES, + KEYWORD_DEFAULT, + KEYWORD_DIV, + KEYWORD_ElEMENT, + KEYWORD_EMPTY, + KEYWORD_EXTERNAL, + KEYWORD_GRAMMAR, + KEYWORD_INCLUDE, + KEYWORD_INHERIT, + KEYWORD_LIST, + KEYWORD_MIXED, + KEYWORD_NAMESPACE, + KEYWORD_NOT_ALLOWED, + KEYWORD_PARENT, + KEYWORD_START, + KEYWORD_STRING, + KEYWORD_TEXT, + KEYWORD_TOKEN + ); + + public static final TokenSet IDENTIFIER_OR_KEYWORD = TokenSet.orSet(KEYWORDS, IDENTIFIERS); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RngCompactLanguage.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RngCompactLanguage.java new file mode 100644 index 000000000000..6e228d48bc9a --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/RngCompactLanguage.java @@ -0,0 +1,164 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact; + +import org.intellij.plugins.relaxNG.compact.psi.RncDefine; +import org.intellij.plugins.relaxNG.compact.psi.RncElement; +import org.intellij.plugins.relaxNG.compact.psi.util.EscapeUtil; +import org.intellij.plugins.relaxNG.compact.psi.util.RenameUtil; + +import com.intellij.lang.BracePair; +import com.intellij.lang.Commenter; +import com.intellij.lang.Language; +import com.intellij.lang.PairedBraceMatcher; +import com.intellij.lang.documentation.DocumentationProvider; +import com.intellij.lang.refactoring.NamesValidator; +import com.intellij.openapi.fileTypes.SingleLazyInstanceSyntaxHighlighterFactory; +import com.intellij.openapi.fileTypes.SyntaxHighlighter; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.tree.IElementType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 01.08.2007 +*/ +public class RngCompactLanguage extends Language { + public static final String ID = "RELAX-NG"; + + public static final RngCompactLanguage INSTANCE = new RngCompactLanguage(); + + private RngCompactLanguage() { + super(ID); + } + + public static class MyCommenter implements Commenter { + @Nullable + public String getLineCommentPrefix() { + return "#"; + } + + @Nullable + public String getBlockCommentPrefix() { + return null; + } + + @Nullable + public String getBlockCommentSuffix() { + return null; + } + + public String getCommentedBlockCommentPrefix() { + return null; + } + + public String getCommentedBlockCommentSuffix() { + return null; + } + } + + public static class MyPairedBraceMatcher implements PairedBraceMatcher { + private BracePair[] myBracePairs; + + public BracePair[] getPairs() { + if (myBracePairs == null) { + myBracePairs = new BracePair[]{ + new BracePair(RncTokenTypes.LBRACE, RncTokenTypes.RBRACE, true), + new BracePair(RncTokenTypes.LPAREN, RncTokenTypes.RPAREN, false), + new BracePair(RncTokenTypes.LBRACKET, RncTokenTypes.RBRACKET, false), + }; + } + return myBracePairs; + } + + public boolean isPairedBracesAllowedBeforeType(@NotNull IElementType lbraceType, @Nullable IElementType contextType) { + return false; + } + + public int getCodeConstructStart(PsiFile file, int openingBraceOffset) { + // TODO + return openingBraceOffset; + } + } + + public static class MyNamesValidator implements NamesValidator { + public boolean isKeyword(String name, Project project) { + return RenameUtil.isKeyword(PsiManager.getInstance(project), name); + } + + public boolean isIdentifier(String name, Project project) { + return RenameUtil.isIdentifier(PsiManager.getInstance(project), name); + } + } + + public static class MyDocumentationProvider implements DocumentationProvider { + @Nullable + public String getQuickNavigateInfo(PsiElement element) { + return null; + } + + public List getUrlFor(PsiElement element, PsiElement originalElement) { + return null; + } + + @Nullable + public String generateDoc(PsiElement element, PsiElement originalElement) { + if (element instanceof RncElement) { + PsiElement comment = element.getPrevSibling(); + while (comment instanceof PsiWhiteSpace) { + comment = comment.getPrevSibling(); + } + if (comment instanceof PsiComment) { + final StringBuilder sb = new StringBuilder(); + do { + sb.insert(0, EscapeUtil.unescapeText(comment).replaceAll("\n?##?", "") + "
"); + comment = comment.getPrevSibling(); + } while (comment instanceof PsiComment); + + if (element instanceof RncDefine) { + sb.insert(0, "Define: " + ((RncDefine)element).getName() + "
"); + } + + return sb.toString(); + } + } + return null; + } + + @Nullable + public PsiElement getDocumentationElementForLookupItem(PsiManager psiManager, Object object, PsiElement element) { + return null; + } + + @Nullable + public PsiElement getDocumentationElementForLink(PsiManager psiManager, String link, PsiElement context) { + return null; + } + } + + public static class MySyntaxHighlighterFactory extends SingleLazyInstanceSyntaxHighlighterFactory { + @NotNull + protected SyntaxHighlighter createHighlighter() { + return new RncHighlighter(); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/folding/RncFoldingBuilder.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/folding/RncFoldingBuilder.java new file mode 100644 index 000000000000..4db9314ee4d8 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/folding/RncFoldingBuilder.java @@ -0,0 +1,158 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.folding; + +import org.intellij.plugins.relaxNG.compact.RncElementTypes; +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; +import org.intellij.plugins.relaxNG.compact.psi.RncAnnotation; +import org.intellij.plugins.relaxNG.compact.psi.RncName; +import org.intellij.plugins.relaxNG.compact.psi.util.EscapeUtil; + +import com.intellij.codeInsight.folding.CodeFoldingSettings; +import com.intellij.lang.ASTNode; +import com.intellij.lang.folding.FoldingBuilder; +import com.intellij.lang.folding.FoldingDescriptor; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiWhiteSpace; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 10.08.2007 + */ +public class RncFoldingBuilder implements FoldingBuilder { + @NotNull + public FoldingDescriptor[] buildFoldRegions(@NotNull ASTNode node, @NotNull Document document) { + + final ArrayList regions = new ArrayList(); + process(node, document, regions); + + return regions.size() > 0 + ? regions.toArray(new FoldingDescriptor[regions.size()]) + : FoldingDescriptor.EMPTY; + } + + public String getPlaceholderText(@NotNull ASTNode node) { + final IElementType type = node.getElementType(); + if (type == RncTokenTypes.LBRACE) { + return "{ ... }"; + } else if (isCommentLike(type)) { + return "# ..."; + } else if (isAnnotation(type)) { + final RncName element = ((RncAnnotation)node.getPsi()).getNameElement(); + if (element != null) { + final ASTNode n = element.getNode(); + assert n != null; + return EscapeUtil.unescapeText(n) + " [ ... ]"; + } + return "[ ... ]"; + } else { + return "..."; + } + } + + private static boolean isAnnotation(IElementType type) { + return RncElementTypes.ANNOTATION == type || RncElementTypes.ANNOTATION_ELEMENT == type || RncElementTypes.FORWARD_ANNOTATION == type; + } + + private static boolean isCommentLike(IElementType type) { + return RncTokenTypes.COMMENTS.contains(type) || RncTokenTypes.DOC_TOKENS.contains(type); + } + + public boolean isCollapsedByDefault(@NotNull ASTNode node) { + return isCommentLike(node.getElementType()) && CodeFoldingSettings.getInstance().COLLAPSE_DOC_COMMENTS; + } + + private static void process(@Nullable ASTNode node, Document document, ArrayList regions) { + if (node == null) { + return; + } + + final ASTNode[] braces = node.getChildren(RncTokenTypes.BRACES); + if (braces.length == 2) { + final ASTNode lbrace = braces[0]; + final ASTNode rbrace = braces[1]; + if (shouldFold(lbrace, rbrace, document)) { + final TextRange range = new TextRange(lbrace.getStartOffset(), rbrace.getTextRange().getEndOffset()); + regions.add(new FoldingDescriptor(lbrace, range)); + } + } else if (isAnnotation(node.getElementType())) { + if (isOnDifferentLine(node.getFirstChildNode(), node.getLastChildNode(), document)) { + regions.add(new FoldingDescriptor(node, node.getTextRange())); + } + } + + node = node.getFirstChildNode(); + while (node != null) { + node = checkNodeAndSiblings(node, RncTokenTypes.DOC_TOKENS, regions, document); + + node = checkNodeAndSiblings(node, RncTokenTypes.COMMENTS, regions, document); + + process(node, document, regions); + + if (node != null) { + node = node.getTreeNext(); + } + } + } + + @Nullable + private static ASTNode checkNodeAndSiblings(@Nullable ASTNode node, TokenSet tokens, ArrayList regions, Document document) { + if (node != null && tokens.contains(node.getElementType())) { + final ASTNode start = node; + ASTNode end = start; + + node = node.getTreeNext(); + if (node != null) { + do { + end = node; + node = node.getTreeNext(); + } while (node != null && tokens.contains(node.getElementType())); + } + if (end != start) { + while (end.getPsi() instanceof PsiWhiteSpace) { + end = end.getTreePrev(); + } + if (isOnDifferentLine(start, end, document)) { + regions.add(new FoldingDescriptor(start, new TextRange(start.getStartOffset(), end.getTextRange().getEndOffset()))); + } + } + } + return node; + } + + private static boolean shouldFold(ASTNode first, ASTNode second, Document document) { + if (first.getElementType() != RncTokenTypes.LBRACE) { + return false; + } else if (second.getElementType() != RncTokenTypes.RBRACE) { + return false; + } else { + return isOnDifferentLine(first, second, document); + } + } + + private static boolean isOnDifferentLine(ASTNode first, ASTNode second, Document document) { + return document.getLineNumber(first.getStartOffset()) != document.getLineNumber(second.getStartOffset()); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/formatting/RncBlock.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/formatting/RncBlock.java new file mode 100644 index 000000000000..a181cc9d67d4 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/formatting/RncBlock.java @@ -0,0 +1,127 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.formatting; + +import org.intellij.plugins.relaxNG.compact.RncElementTypes; +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; +import org.intellij.plugins.relaxNG.compact.psi.RncDecl; +import org.intellij.plugins.relaxNG.compact.psi.RncDefine; +import org.intellij.plugins.relaxNG.compact.psi.RncFile; +import org.intellij.plugins.relaxNG.compact.psi.RncGrammar; +import org.intellij.plugins.relaxNG.compact.psi.impl.RncDocument; + +import com.intellij.formatting.*; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +class RncBlock implements Block { + private final ASTNode myNode; + + public RncBlock(ASTNode element) { + myNode = element; + } + + @NotNull + public TextRange getTextRange() { + return myNode.getTextRange(); + } + + @NotNull + public List getSubBlocks() { + final List list = new ArrayList(); + ASTNode node = myNode.getFirstChildNode(); + while (node != null) { + if (!RncTokenTypes.WHITESPACE.contains(node.getElementType()) && node.getTextLength() > 0) { + list.add(new RncBlock(node)); + } + node = node.getTreeNext(); + } + return list; + } + + @Nullable + public Wrap getWrap() { + // TODO + return null; + } + + @Nullable + public Indent getIndent() { + if (isTopLevel()) { + return Indent.getAbsoluteNoneIndent(); + } else if (myNode.getTreeParent().getPsi() instanceof RncGrammar && !RncTokenTypes.BRACES.contains(myNode.getElementType())) { + // TODO: fix block psi + return Indent.getNormalIndent(); + } + return null; + } + + private boolean isTopLevel() { + final PsiElement parent = myNode.getTreeParent().getPsi(); + return parent instanceof RncDocument || + parent instanceof RncFile || + parent instanceof RncGrammar && parent.getParent() instanceof RncDocument; + } + + @Nullable + public Alignment getAlignment() { + // TODO + return null; + } + + @Nullable + public Spacing getSpacing(Block child1, Block child2) { + final ASTNode lnode = ((RncBlock)child1).myNode; + final PsiElement lpsi = lnode.getPsi(); + final PsiElement rpsi = ((RncBlock)child2).myNode.getPsi(); + + if (lpsi instanceof RncDecl && rpsi instanceof RncDecl) { + return makeNewline(); + } + if ((lpsi instanceof RncDecl || lpsi instanceof RncDefine || + lnode.getElementType() == RncElementTypes.START) && + (rpsi instanceof RncDefine || rpsi instanceof RncGrammar)) { + return makeNewline(); + } + return null; + } + + private static Spacing makeNewline() { + return Spacing.createSpacing(0, Integer.MAX_VALUE, 1, true, 100); + } + + @NotNull + public ChildAttributes getChildAttributes(int newChildIndex) { + return new ChildAttributes(null, null); + } + + public boolean isIncomplete() { + // TODO + return false; + } + + public boolean isLeaf() { + // TODO + return false; + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/formatting/RncFormattingModelBuilder.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/formatting/RncFormattingModelBuilder.java new file mode 100644 index 000000000000..1861127d4b57 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/formatting/RncFormattingModelBuilder.java @@ -0,0 +1,39 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.formatting; + +import com.intellij.formatting.FormattingModel; +import com.intellij.formatting.FormattingModelBuilder; +import com.intellij.formatting.FormattingModelProvider; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import org.jetbrains.annotations.NotNull; + +public class RncFormattingModelBuilder implements FormattingModelBuilder { + @NotNull + public FormattingModel createModel(PsiElement element, CodeStyleSettings settings) { + return FormattingModelProvider.createFormattingModelForPsiFile(element.getContainingFile(), new RncBlock(element.getNode()), settings); + } + + public TextRange getRangeAffectingIndent(PsiFile file, int offset, ASTNode elementAtOffset) { + // TODO + return null; + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/lexer/CompactSyntaxLexerAdapter.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/lexer/CompactSyntaxLexerAdapter.java new file mode 100644 index 000000000000..aa4b288cd4b6 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/lexer/CompactSyntaxLexerAdapter.java @@ -0,0 +1,258 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.lexer; + +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; + +import com.intellij.lexer.LexerBase; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.psi.TokenType; +import com.intellij.psi.tree.IElementType; +import com.intellij.util.text.CharArrayCharSequence; +import com.intellij.util.text.CharArrayUtil; +import org.jetbrains.annotations.Nullable; + +import gnu.trove.TIntIntHashMap; +import org.kohsuke.rngom.parse.compact.CompactSyntaxConstants; +import org.kohsuke.rngom.parse.compact.CompactSyntaxTokenManager; +import org.kohsuke.rngom.parse.compact.Token; +import org.kohsuke.rngom.parse.compact.TokenMgrError; + +import java.io.CharArrayReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.lang.reflect.Field; +import java.util.LinkedList; + +/** + * An adapter to use the lexer ("TokenManager") generated from a javacc grammar. + * + * Not sure if it was easier to write this than hacking my own lexer... + */ +public class CompactSyntaxLexerAdapter extends LexerBase { + private static final Logger LOG = Logger.getInstance(CompactSyntaxLexerAdapter.class.getName()); + + private static final Field myStateField; + + static { + try { + myStateField = CompactSyntaxTokenManager.class.getDeclaredField("curLexState"); + myStateField.setAccessible(true); + } catch (NoSuchFieldException e) { + throw new Error(e); + } + } + + private static final Token START = new Token(); + + private CompactSyntaxTokenManager myLexer; + private final LinkedList myTokenQueue = new LinkedList(); + private Token myCurrentToken; + private int myCurrentOffset; + private int myCurrentEnd; + + private IElementType myCurrentTokenType; + private CharSequence myBuffer; + private int myEndOffset; + private TIntIntHashMap myLengthMap; + + public void advance() { + try { + myCurrentToken = nextToken(); + myCurrentOffset = myCurrentEnd; + + if (myCurrentToken != null) { + + myCurrentEnd = myCurrentOffset + myCurrentToken.image.length(); + for (int i = myCurrentOffset; i < myCurrentEnd; i++) { + myCurrentEnd += myLengthMap.get(i); + } + + if (myCurrentToken.kind == CompactSyntaxConstants.EOF) { + assert myCurrentOffset == myEndOffset : "actual: " + myCurrentOffset + ", expected: " + myEndOffset; + myCurrentToken = null; + } + } + +// if (myCurrentToken != null) { +// System.out.println("token = <" + RncTokenTypes.get(myCurrentToken.kind).toString() + "> [" + myCurrentToken.image + "]"); +// } + } catch (TokenMgrError e) { + LOG.error(e); + myCurrentToken = null; + } + + if (myCurrentToken == null) { + myCurrentTokenType = null; + } else { + myCurrentTokenType = RncTokenTypes.get(myCurrentToken.kind); + + // collapse whitespace tokens into TokenType.WHITE_SPACE [IDEA-12106] + if (RncTokenTypes.WHITESPACE.contains(myCurrentTokenType)) { + myCurrentTokenType = TokenType.WHITE_SPACE; + } + } + } + + private Token nextToken() { + if (myTokenQueue.size() > 0) { + return myTokenQueue.removeFirst(); + } + + final Token t = myLexer.getNextToken(); + if (t.specialToken != null) { + myTokenQueue.addFirst(t); + for (Token s = t.specialToken; s != null; s = s.specialToken) { + myTokenQueue.addFirst(s); + } + return myTokenQueue.removeFirst(); + } else { + return t; + } + } + + @Deprecated + public char[] getBuffer() { + return CharArrayUtil.fromSequence(myBuffer); + } + + @Override + public CharSequence getBufferSequence() { + return myBuffer; + } + + public int getBufferEnd() { + return myEndOffset; + } + + public int getState() { + try { + return (Integer)myStateField.get(myLexer); + } catch (Exception e) { + return -1; + } + } + + public int getTokenEnd() { + return myCurrentEnd; + } + + public int getTokenStart() { + return myCurrentToken == null ? 0 : myCurrentOffset; + } + + @Nullable + public IElementType getTokenType() { + if (myCurrentToken == null) { + return null; + } else { + return myCurrentTokenType; + } + } + + @Deprecated + public void start(char[] buffer, int startOffset, int endOffset, int initialState) { + myBuffer = new CharArrayCharSequence(buffer, startOffset, endOffset); + + final CharArrayReader reader = new CharArrayReader(buffer, startOffset, endOffset - startOffset); + init(startOffset, endOffset, reader, initialState); + } + + public void start(CharSequence buffer, int startOffset, int endOffset, int initialState) { + myBuffer = buffer; + + final Reader reader = new CharSequenceReader(buffer, startOffset, endOffset); + init(startOffset, endOffset, reader, initialState); + } + + private void init(int startOffset, int endOffset, Reader reader, int initialState) { + myEndOffset = endOffset; + myLengthMap = new TIntIntHashMap(); + + final EscapePreprocessor preprocessor = new EscapePreprocessor(reader, startOffset, myLengthMap); + myLexer = new CompactSyntaxTokenManager(new SimpleCharStream(preprocessor, 1, 1), initialState); + + myCurrentToken = START; + myCurrentOffset = startOffset; + myCurrentEnd = startOffset; + myTokenQueue.clear(); + advance(); + } + + public static void main(String[] args) throws IOException { + final CompactSyntaxLexerAdapter lexer = new CompactSyntaxLexerAdapter(); + lexer.start(new CharArrayCharSequence(FileUtil.adaptiveLoadText(new FileReader(args[0])))); + while (lexer.getTokenType() != null) { + System.out.println("token = " + lexer.getTokenType()); + final int start = lexer.getTokenStart(); + System.out.println("start = " + start); + final int end = lexer.getTokenEnd(); + System.out.println("end = " + end); + final CharSequence t = lexer.getBufferSequence().subSequence(start, end); + System.out.println("t = " + t); + lexer.advance(); + } + } + + // adapted from com.intellij.util.text.CharSequenceReader with start- and endOffset support + static class CharSequenceReader extends Reader { + private final CharSequence myText; + private final int myEndOffset; + private int myCurPos; + + public CharSequenceReader(final CharSequence text, int startOffset, int endOffset) { + myText = text; + myEndOffset = endOffset; + myCurPos = startOffset; + } + + public void close() { + } + + public int read(char[] cbuf, int off, int len) { + if ((off < 0) || (off > cbuf.length) || (len < 0) || ((off + len) > cbuf.length) || ((off + len) < 0)) { + throw new IndexOutOfBoundsException(); + } else if (len == 0) { + return 0; + } + + if (myText instanceof CharArrayCharSequence) { // Optimization + final int readChars = ((CharArrayCharSequence)myText).readCharsTo(myCurPos, cbuf, off, len); + if (readChars < 0) return -1; + myCurPos += readChars; + return readChars; + } + + int charsToCopy = Math.min(len, myEndOffset - myCurPos); + if (charsToCopy <= 0) return -1; + + for (int n = 0; n < charsToCopy; n++) { + cbuf[n + off] = myText.charAt(n + myCurPos); + } + + myCurPos += charsToCopy; + return charsToCopy; + } + + public int read() { + if (myCurPos >= myEndOffset) return -1; + return myText.charAt(myCurPos++); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/lexer/EscapePreprocessor.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/lexer/EscapePreprocessor.java new file mode 100644 index 000000000000..1fa192ff6810 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/lexer/EscapePreprocessor.java @@ -0,0 +1,140 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.lexer; + +import gnu.trove.TIntArrayList; +import gnu.trove.TIntIntHashMap; +import org.kohsuke.rngom.util.Utf16; + +import java.io.FilterReader; +import java.io.IOException; +import java.io.Reader; + +/** + * A reader that deals with escape sequences in RNC files (\x{xx}) and keeps track of their positions to build correct + * token ranges in the lexer. + *

+ * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 05.08.2007 + */ +class EscapePreprocessor extends FilterReader { + private final TIntArrayList myQueuedChars; + private final TIntIntHashMap myLengthMap; + + private int myOffset; + + public EscapePreprocessor(Reader reader, int startOffset, TIntIntHashMap map) { + super(reader); + myOffset = startOffset; + myQueuedChars = new TIntArrayList(); + myLengthMap = map; + } + + @Override + public int read(char cbuf[], int off, int len) throws IOException { + final int i = read(); + if (i == -1) { + return -1; + } + cbuf[off] = (char)i; // not really efficient, but acceptable since we're usually not having to deal with megabytes of RNC files... + return 1; + } + + @Override + public int read() throws IOException { + if (myQueuedChars.size() > 0) { + return consume(); + } + final int i = super.read(); + if (i == -1) { + return -1; + } + myOffset++; + + switch (i) { + case '\r': + assert false : "Unexpected newline character"; // IDEA document's are supposed to newlines normalized to \n + if (peek() == '\n') { + consume(); + myLengthMap.put(myOffset - 1, 2); + } + case '\n': + return '\u0000'; + + case '\\': + int n = 0; + int x; + while ((x = peek()) == 'x') { + n++; + } + if (n > 0 && x == '{') { + n++; + } else { + return i; + } + int value = 0; + while (isHexChar((char)(x = peek()))) { + n++; + value <<= 4; + value |= Character.digit(x, 16); + } + if (x == '}') { + n++; + } + consume(n); + + myLengthMap.put(myOffset - 1, n); + myOffset += n; + + if (value <= 0xFFFF) { + return value; + } + + myQueuedChars.add(Utf16.surrogate2(value)); + return Utf16.surrogate1(value); + } + + return i; + } + + private static boolean isHexChar(char i) { + if (Character.isDigit(i)) return true; + final char c = Character.toLowerCase(i); + return c >= 'a' && c <= 'f'; + } + + private int consume() { + if (myQueuedChars.size() > 0) { + return myQueuedChars.remove(0); + } + return -1; + } + + private void consume(int n) { + myQueuedChars.remove(0, n); + } + + private int peek() throws IOException { + final int i = super.read(); + if (i == -1) { + return -1; + } + myQueuedChars.add(i); + return i; + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/lexer/SimpleCharStream.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/lexer/SimpleCharStream.java new file mode 100644 index 000000000000..85a9dada7f2c --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/lexer/SimpleCharStream.java @@ -0,0 +1,420 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 3.0 */ +package org.intellij.plugins.relaxNG.compact.lexer; + +import org.kohsuke.rngom.parse.compact.CharStream; +import org.kohsuke.rngom.parse.compact.EOFException; + +/** + * An implementation of interface CharStream, where the stream is assumed to + * contain only ASCII characters (without unicode processing). + */ + +@SuppressWarnings({ "ALL" }) +public class SimpleCharStream implements CharStream +{ + int bufsize; + int available; + int tokenBegin; + public int bufpos = -1; + protected int bufline[]; + protected int bufcolumn[]; + + protected int column = 0; + protected int line = 1; + + protected boolean prevCharIsCR = false; + protected boolean prevCharIsLF = false; + + protected java.io.Reader inputStream; + + protected char[] buffer; + protected int maxNextCharInd = 0; + protected int inBuf = 0; + + protected void ExpandBuff(boolean wrapAround) + { + char[] newbuffer = new char[bufsize + 2048]; + int newbufline[] = new int[bufsize + 2048]; + int newbufcolumn[] = new int[bufsize + 2048]; + + try + { + if (wrapAround) + { + System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); + System.arraycopy(buffer, 0, newbuffer, + bufsize - tokenBegin, bufpos); + buffer = newbuffer; + + System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); + System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); + bufline = newbufline; + + System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); + System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); + bufcolumn = newbufcolumn; + + maxNextCharInd = (bufpos += (bufsize - tokenBegin)); + } + else + { + System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); + buffer = newbuffer; + + System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); + bufline = newbufline; + + System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); + bufcolumn = newbufcolumn; + + maxNextCharInd = (bufpos -= tokenBegin); + } + } + catch (Throwable t) + { + throw new Error(t.getMessage()); + } + + + bufsize += 2048; + available = bufsize; + tokenBegin = 0; + } + + protected void FillBuff() throws EOFException + { + if (maxNextCharInd == available) + { + if (available == bufsize) + { + if (tokenBegin > 2048) + { + bufpos = maxNextCharInd = 0; + available = tokenBegin; + } + else if (tokenBegin < 0) + bufpos = maxNextCharInd = 0; + else + ExpandBuff(false); + } + else if (available > tokenBegin) + available = bufsize; + else if ((tokenBegin - available) < 2048) + ExpandBuff(true); + else + available = tokenBegin; + } + + int i; + try { + if ((i = inputStream.read(buffer, maxNextCharInd, + available - maxNextCharInd)) == -1) + { + inputStream.close(); + throw new java.io.IOException(); + } + else + maxNextCharInd += i; + return; + } + catch(java.io.IOException e) { + --bufpos; + backup(0); + if (tokenBegin == -1) + tokenBegin = bufpos; + throw new EOFException(); + } + } + + public char BeginToken() throws EOFException + { + tokenBegin = -1; + char c = readChar(); + tokenBegin = bufpos; + + return c; + } + + protected void UpdateLineColumn(char c) + { + column++; + + if (prevCharIsLF) + { + prevCharIsLF = false; + line += (column = 1); + } + else if (prevCharIsCR) + { + prevCharIsCR = false; + if (c == '\n') + { + prevCharIsLF = true; + } + else + line += (column = 1); + } + + switch (c) + { + case '\r' : + prevCharIsCR = true; + break; + case '\n' : + prevCharIsLF = true; + break; + case '\t' : + column--; + column += (8 - (column & 07)); + break; + default : + break; + } + + bufline[bufpos] = line; + bufcolumn[bufpos] = column; + } + + public char readChar() throws EOFException + { + if (inBuf > 0) + { + --inBuf; + + if (++bufpos == bufsize) + bufpos = 0; + + return buffer[bufpos]; + } + + if (++bufpos >= maxNextCharInd) + FillBuff(); + + char c = buffer[bufpos]; + + UpdateLineColumn(c); + return (c); + } + + /** + * @deprecated + * @see #getEndColumn + */ + + public int getColumn() { + return bufcolumn[bufpos]; + } + + /** + * @deprecated + * @see #getEndLine + */ + + public int getLine() { + return bufline[bufpos]; + } + + public int getEndColumn() { + return bufcolumn[bufpos]; + } + + public int getEndLine() { + return bufline[bufpos]; + } + + public int getBeginColumn() { + return bufcolumn[tokenBegin]; + } + + public int getBeginLine() { + return bufline[tokenBegin]; + } + + public void backup(int amount) { + + inBuf += amount; + if ((bufpos -= amount) < 0) + bufpos += bufsize; + } + + public SimpleCharStream(java.io.Reader dstream, int startline, + int startcolumn, int buffersize) + { + inputStream = dstream; + line = startline; + column = startcolumn - 1; + + available = bufsize = buffersize; + buffer = new char[buffersize]; + bufline = new int[buffersize]; + bufcolumn = new int[buffersize]; + } + + public SimpleCharStream(java.io.Reader dstream, int startline, + int startcolumn) + { + this(dstream, startline, startcolumn, 4096); + } + + public SimpleCharStream(java.io.Reader dstream) + { + this(dstream, 1, 1, 4096); + } + public void ReInit(java.io.Reader dstream, int startline, + int startcolumn, int buffersize) + { + inputStream = dstream; + line = startline; + column = startcolumn - 1; + + if (buffer == null || buffersize != buffer.length) + { + available = bufsize = buffersize; + buffer = new char[buffersize]; + bufline = new int[buffersize]; + bufcolumn = new int[buffersize]; + } + prevCharIsLF = prevCharIsCR = false; + tokenBegin = inBuf = maxNextCharInd = 0; + bufpos = -1; + } + + public void ReInit(java.io.Reader dstream, int startline, + int startcolumn) + { + ReInit(dstream, startline, startcolumn, 4096); + } + + public void ReInit(java.io.Reader dstream) + { + ReInit(dstream, 1, 1, 4096); + } + public SimpleCharStream(java.io.InputStream dstream, int startline, + int startcolumn, int buffersize) + { + this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096); + } + + public SimpleCharStream(java.io.InputStream dstream, int startline, + int startcolumn) + { + this(dstream, startline, startcolumn, 4096); + } + + public SimpleCharStream(java.io.InputStream dstream) + { + this(dstream, 1, 1, 4096); + } + + public void ReInit(java.io.InputStream dstream, int startline, + int startcolumn, int buffersize) + { + ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096); + } + + public void ReInit(java.io.InputStream dstream) + { + ReInit(dstream, 1, 1, 4096); + } + public void ReInit(java.io.InputStream dstream, int startline, + int startcolumn) + { + ReInit(dstream, startline, startcolumn, 4096); + } + public String GetImage() + { + if (bufpos >= tokenBegin) + return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); + else + return new String(buffer, tokenBegin, bufsize - tokenBegin) + + new String(buffer, 0, bufpos + 1); + } + + public char[] GetSuffix(int len) + { + char[] ret = new char[len]; + + if ((bufpos + 1) >= len) + System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); + else + { + System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, + len - bufpos - 1); + System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); + } + + return ret; + } + + public void Done() + { + buffer = null; + bufline = null; + bufcolumn = null; + } + + /** + * Method to adjust line and column numbers for the start of a token. + */ + public void adjustBeginLineColumn(int newLine, int newCol) + { + int start = tokenBegin; + int len; + + if (bufpos >= tokenBegin) + { + len = bufpos - tokenBegin + inBuf + 1; + } + else + { + len = bufsize - tokenBegin + bufpos + 1 + inBuf; + } + + int i = 0, j = 0, k = 0; + int nextColDiff = 0, columnDiff = 0; + + while (i < len && + bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) + { + bufline[j] = newLine; + nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; + bufcolumn[j] = newCol + columnDiff; + columnDiff = nextColDiff; + i++; + } + + if (i < len) + { + bufline[j] = newLine++; + bufcolumn[j] = newCol + columnDiff; + + while (i++ < len) + { + if (bufline[j = start % bufsize] != bufline[++start % bufsize]) + bufline[j] = newLine++; + else + bufline[j] = newLine; + } + } + + line = bufline[j]; + column = bufcolumn[j]; + } + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/AbstractParsing.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/AbstractParsing.java new file mode 100644 index 000000000000..7f07debcba78 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/AbstractParsing.java @@ -0,0 +1,156 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.parser; + +import org.intellij.plugins.relaxNG.compact.RncElementTypes; +import static org.intellij.plugins.relaxNG.compact.RncTokenTypes.*; + +import com.intellij.lang.PsiBuilder; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 09.08.2007 + */ +public abstract class AbstractParsing { + protected static final TokenSet LA_INCLUDE_CONTENT = TokenSet.orSet(TokenSet.create( + KEYWORD_DIV, KEYWORD_START), IDENTIFIERS); + + protected static final TokenSet LA_GRAMMAR_CONTENT = TokenSet.orSet(TokenSet.create( + KEYWORD_INCLUDE), LA_INCLUDE_CONTENT); + + protected static final TokenSet ATTR_OR_ELEMENT = TokenSet.create( + KEYWORD_ATTRIBUTE, KEYWORD_ElEMENT); + + protected static final TokenSet CONTENT = TokenSet.create( + KEYWORD_LIST, KEYWORD_MIXED); + + protected static final TokenSet LA_DATATYPE = TokenSet.create( + KEYWORD_STRING, KEYWORD_TOKEN); + + protected static final TokenSet LA_DECL = TokenSet.create( + KEYWORD_DATATYPES, KEYWORD_NAMESPACE, KEYWORD_DEFAULT); + + protected static final TokenSet NS_URI_LITERAL = TokenSet.create(KEYWORD_INHERIT, LITERAL); + protected static final TokenSet ASSIGN_METHOD = TokenSet.create(EQ, CHOICE_EQ, INTERLEAVE_EQ); + protected final PsiBuilder myBuilder; + + public AbstractParsing(PsiBuilder builder) { + myBuilder = builder; + } + + protected final PsiBuilder.Marker begin() { + final PsiBuilder.Marker marker = myBuilder.mark(); + advance(); + return marker; + } + + protected final boolean matches(TokenSet set) { + if (set.contains(currentToken())) { + advance(); + return true; + } + return false; + } + + protected final boolean matches(IElementType t) { + if (t == currentToken()) { + advance(); + return true; + } + return false; + } + + protected final void match(IElementType token, String msg) { + if (!matches(token)) { + error(msg); + advance(); + } + } + + protected final void match(TokenSet set, String msg) { + if (!matches(set)) { + error(msg); + advance(); + } + } + + protected final void error(String s) { + myBuilder.error(s); + } + + protected final void advance() { + myBuilder.advanceLexer(); + } + + protected final IElementType currentToken() { + final IElementType token = myBuilder.getTokenType(); + if (isName(token)) { + final PsiBuilder.Marker marker = myBuilder.mark(); + makeName(); + if (myBuilder.getTokenType() == LBRACKET) { + skipAnnotation(marker, RncElementTypes.ANNOTATION_ELEMENT); + return currentToken(); + } else { + marker.rollbackTo(); + } + } else if (token == LBRACKET) { + final PsiBuilder.Marker marker = myBuilder.mark(); + skipAnnotation(marker, RncElementTypes.ANNOTATION); + return currentToken(); + } else if (token == GTGT) { + final PsiBuilder.Marker marker = myBuilder.mark(); + advance(); + if (isName(myBuilder.getTokenType())) { + makeName(); + if (myBuilder.getTokenType() == LBRACKET) { + skipAnnotation(marker, RncElementTypes.FORWARD_ANNOTATION); + return currentToken(); + } + } + marker.done(RncElementTypes.FORWARD_ANNOTATION); + return currentToken(); + } + return token; + } + + protected static boolean isName(IElementType token) { + return IDENTIFIER_OR_KEYWORD.contains(token) || token == PREFIXED_NAME; + } + + private void skipAnnotation(PsiBuilder.Marker marker, IElementType annotationType) { + final boolean b = myBuilder.getTokenType() == LBRACKET; + advance(); + assert b; + + while (!myBuilder.eof() && currentToken() != RBRACKET) { + advance(); + } + if (myBuilder.getTokenType() == RBRACKET) { + advance(); + } + marker.done(annotationType); + } + + protected final void makeName() { + final PsiBuilder.Marker name = myBuilder.mark(); + advance(); + name.done(RncElementTypes.NAME); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/DeclarationParsing.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/DeclarationParsing.java new file mode 100644 index 000000000000..2f1fac3e6357 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/DeclarationParsing.java @@ -0,0 +1,178 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.parser; + +import org.intellij.plugins.relaxNG.compact.RncElementTypes; +import static org.intellij.plugins.relaxNG.compact.RncTokenTypes.*; + +import com.intellij.lang.PsiBuilder; +import com.intellij.psi.tree.IElementType; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 09.08.2007 + */ +public abstract class DeclarationParsing extends AbstractParsing { + + public DeclarationParsing(PsiBuilder builder) { + super(builder); + } + + protected void parseTopLevel() { + while (!myBuilder.eof() && LA_DECL.contains(currentToken())) { + parseDecl(myBuilder); + } + + if (LA_GRAMMAR_CONTENT.contains(currentToken())) { + final PsiBuilder.Marker marker = myBuilder.mark(); + parseGrammarContents(); + marker.done(RncElementTypes.GRAMMAR_PATTERN); + } else if (currentToken() == KEYWORD_GRAMMAR) { + parsePattern(); + } else { + final PsiBuilder.Marker marker = myBuilder.mark(); + while (!myBuilder.eof()) { + if (!parsePattern()) { + break; + } + } + marker.done(RncElementTypes.GRAMMAR_PATTERN); + } + } + + protected abstract boolean parsePattern(); + + protected void parseGrammarContents() { + while (LA_GRAMMAR_CONTENT.contains(currentToken())) { + parseGrammarContent(true); + } + } + + private void parseIncludeContents() { + while (LA_INCLUDE_CONTENT.contains(currentToken())) { + parseGrammarContent(false); + } + } + + private void parseGrammarContent(boolean allowInclude) { + final IElementType t = currentToken(); + if (t == KEYWORD_START) { + parseStart(); + } else if (t == KEYWORD_DIV) { + parseDiv(); + } else if (allowInclude && t == KEYWORD_INCLUDE) { + parseInclude(); + } else if (IDENTIFIERS.contains(t)) { + parseDefine(); + } else { + error("Unexpected token"); + advance(); + } + } + + private void parseDefine() { + final PsiBuilder.Marker marker = begin(); + match(ASSIGN_METHOD, "'=', '|=' or '&=' expected"); + if (!parsePattern()) { + error("Pattern expected"); + } + marker.done(RncElementTypes.DEFINE); + } + + private void parseInclude() { + final PsiBuilder.Marker marker = begin(); + + parseAnyUriLiteral(); + + parseInherit(); + + if (matches(LBRACE)) { + parseIncludeContents(); + match(RBRACE, "'}' expected"); + } + marker.done(RncElementTypes.INCLUDE); + } + + protected final void parseAnyUriLiteral() { + match(LITERAL, "URI literal expected"); + } + + protected final void parseInherit() { + if (matches(KEYWORD_INHERIT)) { + match(EQ, "'=' expected"); + match(IDENTIFIER_OR_KEYWORD, "Identifier expected"); + } + } + + private void parseDiv() { + final PsiBuilder.Marker marker = begin(); + parseBracedGrammarContents(); + marker.done(RncElementTypes.DIV); + } + + private void parseStart() { + final PsiBuilder.Marker marker = begin(); + match(ASSIGN_METHOD, "'=', '|=' or '&=' expected"); + if (!parsePattern()) { + error("Pattern expected"); + } + marker.done(RncElementTypes.START); + } + + protected void parseBracedGrammarContents() { + match(LBRACE, "'{' expected"); + parseGrammarContents(); + match(RBRACE, "'}' expected"); + } + + protected void parseDecl(PsiBuilder builder) { + final IElementType t = builder.getTokenType(); + if (t == KEYWORD_NAMESPACE) { + parseNamespaceDecl(false); + } else if (t == KEYWORD_DEFAULT) { + parseNamespaceDecl(true); + } else if (t == KEYWORD_DATATYPES) { + parseDataTypesDecl(); + } + } + + private void parseDataTypesDecl() { + final PsiBuilder.Marker marker = begin(); + match(IDENTIFIER_OR_KEYWORD, "Identifier expected"); + match(EQ, "'=' expected"); + parseNsUriLiteral(); + marker.done(RncElementTypes.DATATYPES_DECL); + } + + private void parseNamespaceDecl(boolean isDefault) { + final PsiBuilder.Marker marker = begin(); + if (isDefault) { + match(KEYWORD_NAMESPACE, "'namespace' expected"); + matches(IDENTIFIER_OR_KEYWORD); + } else { + match(IDENTIFIER_OR_KEYWORD, "Identifier expected"); + } + match(EQ, "'=' expected"); + parseNsUriLiteral(); + marker.done(RncElementTypes.NS_DECL); + } + + private void parseNsUriLiteral() { + match(NS_URI_LITERAL, "Namespace URI or 'inherit' expected"); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/NameClassParsing.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/NameClassParsing.java new file mode 100644 index 000000000000..904052c9ce87 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/NameClassParsing.java @@ -0,0 +1,88 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.parser; + +import org.intellij.plugins.relaxNG.compact.RncElementTypes; +import static org.intellij.plugins.relaxNG.compact.RncTokenTypes.*; + +import com.intellij.lang.PsiBuilder; +import com.intellij.psi.tree.IElementType; + +public class NameClassParsing extends AbstractParsing { + + public NameClassParsing(PsiBuilder builder) { + super(builder); + } + + public boolean parseNameClass() { + PsiBuilder.Marker marker = myBuilder.mark(); + + if (!parseNameClassPart()) { + marker.drop(); + return false; + } + + if (currentToken() == PIPE) { + do { + advance(); + if (!parseNameClassPart()) { + error("NameClass expected"); + } + } while (currentToken() == PIPE); + marker.done(RncElementTypes.NAME_CLASS_CHOICE); + } else { + marker.drop(); + } + return true; + } + + private boolean parseNameClassPart() { + final IElementType t = currentToken(); + PsiBuilder.Marker marker = myBuilder.mark(); + if (IDENTIFIER_OR_KEYWORD.contains(t)) { + advance(); + } else if (PREFIXED_NAME == t) { // CName + makeName(); + } else if (STAR == t) { // anyName + advance(); + parseExceptNameClass(); + } else if (PREFIXED_STAR == t) { // nsName + makeName(); + parseExceptNameClass(); + } else if (LPAREN == t) { + advance(); + if (parseNameClass()) { + match(RPAREN, "')' expected"); + } + } else { + marker.drop(); + return false; + } + marker.done(RncElementTypes.NAME_CLASS); + return true; + } + + private void parseExceptNameClass() { + if (MINUS == currentToken()) { + final PsiBuilder.Marker marker = begin(); + if (!parseNameClass()) { + error("NameClass expected"); + } + marker.done(RncElementTypes.EXCEPT_NAME_CLASS); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/PatternParsing.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/PatternParsing.java new file mode 100644 index 000000000000..69b9fd4ccd5b --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/PatternParsing.java @@ -0,0 +1,191 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.parser; + +import org.intellij.plugins.relaxNG.compact.RncElementTypes; +import static org.intellij.plugins.relaxNG.compact.RncTokenTypes.*; + +import com.intellij.lang.PsiBuilder; +import com.intellij.psi.tree.IElementType; + +import gnu.trove.THashMap; +import gnu.trove.TObjectHashingStrategy; + +import java.util.Map; + +/** + * Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 09.08.2007 +*/ +public class PatternParsing extends DeclarationParsing { + + @SuppressWarnings({ "unchecked" }) + protected static final Map TOKEN_MAP = + new THashMap(TObjectHashingStrategy.IDENTITY); + + static { + TOKEN_MAP.put(COMMA, RncElementTypes.SEQUENCE); + TOKEN_MAP.put(PIPE, RncElementTypes.CHOICE); + TOKEN_MAP.put(AND, RncElementTypes.INTERLEAVE); + TOKEN_MAP.put(STAR, RncElementTypes.ZERO_OR_MORE); + TOKEN_MAP.put(PLUS, RncElementTypes.ONE_OR_MORE); + TOKEN_MAP.put(QUEST, RncElementTypes.OPTIONAL); + } + + private final NameClassParsing myNameClassParsing; + + public PatternParsing(PsiBuilder builder) { + super(builder); + myNameClassParsing = new NameClassParsing(builder); + } + + public void parse() { + parseTopLevel(); + } + + protected boolean parsePattern() { + PsiBuilder.Marker marker = myBuilder.mark(); + if (!parseQuantifiedPattern()) { + marker.drop(); + return false; + } + + while (BINARY_OPS.contains(currentToken())) { + IElementType t; + if (BINARY_OPS.contains(t = currentToken())) { + do { + advance(); + if (!parseQuantifiedPattern()) { + error("Pattern expected"); + } + } while (currentToken() == t); + marker.done(TOKEN_MAP.get(t)); + marker = marker.precede(); + } + } + marker.drop(); + return true; + } + + private boolean parseQuantifiedPattern() { + final PsiBuilder.Marker marker = myBuilder.mark(); + if (!parseSinglePattern()) { + marker.drop(); + return false; + } + + final IElementType t = currentToken(); + if (matches(QUANTIFIER_OPS)) { + marker.done(TOKEN_MAP.get(t)); + } else { + marker.drop(); + } + return true; + } + + private boolean parseSinglePattern() { + final PsiBuilder.Marker marker = myBuilder.mark(); + if (matches(ATTR_OR_ELEMENT)) { + if (!myNameClassParsing.parseNameClass()) { + error("Name class expected"); + marker.drop(); + return false; + } + parseBracedPattern(); + marker.done(RncElementTypes.PATTERN); + } else if (matches(KEYWORD_LIST)) { + parseBracedPattern(); + marker.done(RncElementTypes.LIST_PATTERN); + } else if (matches(KEYWORD_MIXED)) { + parseBracedPattern(); + marker.done(RncElementTypes.MIXED_PATTERN); + } else if (matches(KEYWORD_EXTERNAL)) { + parseAnyUriLiteral(); + parseInherit(); + marker.done(RncElementTypes.EXTERNAL_REF); + } else if (matches(KEYWORD_NOT_ALLOWED)) { + marker.done(RncElementTypes.NOT_ALLOWED_PATTERN); + } else if (matches(KEYWORD_TEXT)) { + marker.done(RncElementTypes.TEXT_PATTERN); + } else if (matches(KEYWORD_EMPTY)) { + marker.done(RncElementTypes.EMPTY_PATTERN); + } else if (matches(KEYWORD_PARENT)) { + match(IDENTIFIERS, "Identifier expected"); + marker.done(RncElementTypes.PARENT_REF); + } else if (matches(KEYWORD_GRAMMAR)) { + parseBracedGrammarContents(); + marker.done(RncElementTypes.GRAMMAR_PATTERN); + } else if (matches(LPAREN)) { + if (!parsePattern()) { + error("Pattern expected"); + } + match(RPAREN, "')' expected"); + marker.done(RncElementTypes.GROUP_PATTERN); + } else if (matches(IDENTIFIERS)) { + marker.done(RncElementTypes.REF_PATTERN); + } else if (matches(LA_DATATYPE)) { + parseDatatype(); + marker.done(RncElementTypes.DATATYPE_PATTERN); + } else if (currentToken() == PREFIXED_NAME) { + makeName(); + parseDatatype(); + marker.done(RncElementTypes.DATATYPE_PATTERN); + } else if (matches(LITERAL)) { + marker.done(RncElementTypes.DATATYPE_PATTERN); + } else { + marker.drop(); + return false; + } + return true; + } + + private void parseDatatype() { + if (currentToken() == LITERAL) { + advance(); + } else if (matches(LBRACE)) { + parseParams(); + if (matches(MINUS)) { + if (!parsePattern()) { + error("Pattern expected"); + } + } + match(RBRACE, "'}' expected"); + } + } + + private void parseBracedPattern() { + match(LBRACE, "'{' expected"); + if (!parsePattern()) { + error("Pattern expected"); + } + match(RBRACE, "'}' expected"); + } + + private void parseParams() { + final IElementType t = currentToken(); + if (t != RBRACE) { + do { + final PsiBuilder.Marker marker = myBuilder.mark(); + match(IDENTIFIER_OR_KEYWORD, "Identifier expected"); + match(EQ, "'=' expected"); + match(LITERAL, "Literal expected"); + marker.done(RncElementTypes.PARAM); + } while (IDENTIFIER_OR_KEYWORD.contains(currentToken())); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/RncParser.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/RncParser.java new file mode 100644 index 000000000000..a60ef22eeb45 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/parser/RncParser.java @@ -0,0 +1,50 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.parser; + +import org.intellij.plugins.relaxNG.compact.RncElementTypes; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.PsiBuilder; +import com.intellij.lang.PsiParser; +import com.intellij.psi.tree.IElementType; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 07.08.2007 +*/ +public class RncParser implements PsiParser { + + @NotNull + public ASTNode parse(IElementType root, PsiBuilder builder) { + final PsiBuilder.Marker fileMarker = builder.mark(); + final PsiBuilder.Marker docMarker = builder.mark(); + + new PatternParsing(builder).parse(); + + while (!builder.eof()) { + builder.error("Unexpected token"); + builder.advanceLexer(); + } + + docMarker.done(RncElementTypes.DOCUMENT); + fileMarker.done(root); + return builder.getTreeBuilt(); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncAnnotation.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncAnnotation.java new file mode 100644 index 000000000000..77759d922fdd --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncAnnotation.java @@ -0,0 +1,30 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import com.intellij.psi.PsiComment; +import org.jetbrains.annotations.Nullable; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 24.08.2007 +*/ +public interface RncAnnotation extends RncElement, PsiComment { + @Nullable + RncName getNameElement(); +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncDecl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncDecl.java new file mode 100644 index 000000000000..c1a7e65b5fea --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncDecl.java @@ -0,0 +1,30 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import com.intellij.psi.PsiNamedElement; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 16.08.2007 + */ +public interface RncDecl extends RncElement, PsiNamedElement { + String getPrefix(); + + String getDeclaredNamespace(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncDefine.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncDefine.java new file mode 100644 index 000000000000..09e96ece9012 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncDefine.java @@ -0,0 +1,32 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import org.intellij.plugins.relaxNG.model.Define; + +import com.intellij.psi.PsiNamedElement; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 13.08.2007 + */ +public interface RncDefine extends RncPattern, PsiNamedElement, Define { + @Nullable + RncPattern getPattern(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncDiv.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncDiv.java new file mode 100644 index 000000000000..b54102388057 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncDiv.java @@ -0,0 +1,27 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import org.intellij.plugins.relaxNG.model.Div; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 24.08.2007 +*/ +public interface RncDiv extends RncElement, Div { +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncElement.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncElement.java new file mode 100644 index 000000000000..92017fcaab6d --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncElement.java @@ -0,0 +1,27 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import com.intellij.psi.PsiElement; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 10.08.2007 + */ +public interface RncElement extends PsiElement { +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncElementVisitor.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncElementVisitor.java new file mode 100644 index 000000000000..75fa0580e61e --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncElementVisitor.java @@ -0,0 +1,76 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; + +public class RncElementVisitor extends PsiElementVisitor { + + @Override + public final void visitElement(PsiElement element) { + if (element instanceof RncElement) { + visitElement((RncElement)element); + } else { + superVisitElement(element); + } + } + + protected void superVisitElement(PsiElement element) { + super.visitElement(element); + } + + public void visitElement(RncElement element) { + super.visitElement(element); + } + + public void visitInclude(RncInclude include) { + visitElement(include); + } + + public void visitDiv(RncDiv div) { + visitElement(div); + } + + public void visitRef(RncRef pattern) { + visitElement(pattern); + } + + public void visitParentRef(RncParentRef pattern) { + visitElement(pattern); + } + + public void visitDefine(RncDefine pattern) { + visitElement(pattern); + } + + public void visitGrammar(RncGrammar pattern) { + visitElement(pattern); + } + + public void visitName(RncName name) { + visitElement(name); + } + + public void visitAnnotation(RncAnnotation annotation) { + visitElement(annotation); + } + + public void visitExternalRef(RncExternalRef ref) { + visitElement(ref); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncExternalRef.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncExternalRef.java new file mode 100644 index 000000000000..14b538feb1d0 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncExternalRef.java @@ -0,0 +1,26 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 11.08.2007 + */ +public interface RncExternalRef extends RncFileReference { + +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncFile.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncFile.java new file mode 100644 index 000000000000..5a32210a9dde --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncFile.java @@ -0,0 +1,32 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 11.08.2007 + */ +public interface RncFile extends PsiFile { + RncDecl[] getDeclarations(); + + @Nullable + RncGrammar getGrammar(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncFileReference.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncFileReference.java new file mode 100644 index 000000000000..d6d0ff945abb --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncFileReference.java @@ -0,0 +1,35 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import com.intellij.openapi.util.TextRange; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 29.08.2007 + */ +public interface RncFileReference extends RncElement { + @Nullable + RncFile getReferencedFile(); + + @Nullable + String getFileReference(); + + TextRange getReferenceRange(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncGrammar.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncGrammar.java new file mode 100644 index 000000000000..e1c06203160b --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncGrammar.java @@ -0,0 +1,31 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import org.intellij.plugins.relaxNG.model.Grammar; + +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 13.08.2007 + */ +public interface RncGrammar extends RncElement, Grammar { + @Nullable + RncPattern getStart(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncInclude.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncInclude.java new file mode 100644 index 000000000000..97848207cc1d --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncInclude.java @@ -0,0 +1,31 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import org.intellij.plugins.relaxNG.model.Include; + +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 11.08.2007 + */ +public interface RncInclude extends RncFileReference, Include { + @NotNull + RncDefine[] getOverrides(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncName.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncName.java new file mode 100644 index 000000000000..4b60e1a85653 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncName.java @@ -0,0 +1,33 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 14.08.2007 + */ +public interface RncName extends RncElement { + @Nullable + String getPrefix(); + + @NotNull + String getLocalPart(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncNsDecl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncNsDecl.java new file mode 100644 index 000000000000..81a842b4b440 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncNsDecl.java @@ -0,0 +1,26 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 14.08.2007 + */ +public interface RncNsDecl extends RncDecl { + boolean isDefault(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncParentRef.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncParentRef.java new file mode 100644 index 000000000000..5da7525ed196 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncParentRef.java @@ -0,0 +1,25 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 13.08.2007 + */ +public interface RncParentRef extends RncRef { +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncPattern.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncPattern.java new file mode 100644 index 000000000000..c661a4f3edf0 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncPattern.java @@ -0,0 +1,27 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import org.intellij.plugins.relaxNG.model.Pattern; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 05.09.2007 + */ +public interface RncPattern extends RncElement, Pattern { +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncRef.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncRef.java new file mode 100644 index 000000000000..a2d0d8393c97 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/RncRef.java @@ -0,0 +1,34 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi; + +import org.intellij.plugins.relaxNG.model.Ref; + +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 11.08.2007 + */ +public interface RncRef extends RncPattern, Ref { + @Nullable + RncDefine getPattern(); + + @Nullable + String getReferencedName(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/FollowFileHint.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/FollowFileHint.java new file mode 100644 index 000000000000..bde26528235c --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/FollowFileHint.java @@ -0,0 +1,32 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.psi.RncFile; + +import com.intellij.openapi.util.Key; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 13.08.2007 + */ +public interface FollowFileHint { + Key KEY = Key.create("FollowFileHint"); + + public boolean doFollow(RncFile file); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/PatternReference.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/PatternReference.java new file mode 100644 index 000000000000..9a9d56647e68 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/PatternReference.java @@ -0,0 +1,227 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; +import org.intellij.plugins.relaxNG.compact.psi.*; +import org.intellij.plugins.relaxNG.compact.psi.util.EscapeUtil; +import org.intellij.plugins.relaxNG.compact.psi.util.RenameUtil; +import org.intellij.plugins.relaxNG.model.Define; +import org.intellij.plugins.relaxNG.model.resolve.DefinitionResolver; + +import com.intellij.codeInsight.daemon.EmptyResolveMessageProvider; +import com.intellij.codeInsight.daemon.QuickFixProvider; +import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction; +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.ScrollType; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.Set; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 13.08.2007 + */ +class PatternReference extends PsiReferenceBase.Poly implements Function, + QuickFixProvider, EmptyResolveMessageProvider { + + public PatternReference(RncRef ref) { + super(ref); + } + + public TextRange getRangeInElement() { + final ASTNode node = findNameNode(); + if (node == null) return TextRange.from(0, 0); + final int offset = myElement.getTextOffset(); + return TextRange.from(offset - myElement.getTextRange().getStartOffset(), node.getTextLength()); + } + + private ASTNode findNameNode() { + final ASTNode node = myElement.getNode(); + assert node != null; + return node.findChildByType(RncTokenTypes.IDENTIFIERS); + } + + @Nullable + public PsiElement resolve() { + final ResolveResult[] results = multiResolve(false); + return results.length == 1 ? results[0].getElement() : null; + } + + @NotNull + public ResolveResult[] multiResolve(boolean incompleteCode) { + final RncGrammar scope = getScope(); + if (scope == null) { + return ResolveResult.EMPTY_ARRAY; + } + + final Set set = DefinitionResolver.resolve(scope, getCanonicalText()); + if (set == null || set.size() == 0) return ResolveResult.EMPTY_ARRAY; + + return ContainerUtil.map2Array(set, ResolveResult.class, this); + } + + public ResolveResult fun(Define rncDefine) { + final PsiElement element = rncDefine.getPsiElement(); + return element != null ? new PsiElementResolveResult(element) : new ResolveResult() { + @Nullable + public PsiElement getElement() { + return null; + } + public boolean isValidResult() { + return false; + } + }; + } + + @Nullable + protected RncGrammar getScope() { + return PsiTreeUtil.getParentOfType(myElement, RncGrammar.class, true, PsiFile.class); + } + + public String getCanonicalText() { + final ASTNode node = findNameNode(); + return node != null ? EscapeUtil.unescapeText(node) : ""; + } + + public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException { + final ASTNode newNode = RenameUtil.createIdentifierNode(getElement().getManager(), newElementName); + + final ASTNode nameNode = findNameNode(); + nameNode.getTreeParent().replaceChild(nameNode, newNode); + return getElement(); + } + + public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException { + throw new UnsupportedOperationException(); + } + + @NotNull + public Object[] getVariants() { + final RncGrammar scope = getScope(); + if (scope == null) { + return ResolveResult.EMPTY_ARRAY; + } + + final Map> map = DefinitionResolver.getAllVariants(scope); + if (map == null || map.size() == 0) return ArrayUtil.EMPTY_OBJECT_ARRAY; + + return ContainerUtil.mapNotNull(map.values(), new Function, Object>() { + public Object fun(Set defines) { + return defines.size() == 0 ? null : defines.iterator().next().getPsiElement(); + } + }).toArray(); + } + + public boolean isSoft() { + return false; + } + + public String getUnresolvedMessagePattern() { + return "Unresolved pattern reference ''{0}''"; + } + + public void registerQuickfix(HighlightInfo info, final PatternReference reference) { + if (reference.getScope() == null) { + return; + } + QuickFixAction.registerQuickFixAction(info, new CreatePatternFix(reference)); + } + + static class CreatePatternFix implements IntentionAction { + private final PatternReference myReference; + + public CreatePatternFix(PatternReference reference) { + myReference = reference; + } + + @NotNull + public String getText() { + return "Create Pattern '" + myReference.getCanonicalText() + "'"; + } + + @NotNull + public String getFamilyName() { + return "Create Pattern"; + } + + public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { + return myReference.getElement().isValid() && myReference.getScope() != null; + } + + public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + final RncFile rncfile = (RncFile)PsiFileFactory.getInstance(myReference.getElement().getProject()).createFileFromText("dummy.rnc", RncFileType.getInstance(), "dummy = xxx"); + + final RncGrammar grammar = rncfile.getGrammar(); + assert grammar != null; + + final RncDefine def = (RncDefine)grammar.getFirstChild(); + + final RncGrammar scope = myReference.getScope(); + assert scope != null; + + assert def != null; + final RncDefine e = (RncDefine)scope.add(def); + + // ensures proper escaping (start -> \start) + def.setName(myReference.getCanonicalText()); + + final SmartPsiElementPointer p = SmartPointerManager.getInstance(project).createSmartPsiElementPointer(e); + + final ASTNode blockNode = e.getParent().getNode(); + assert blockNode != null; + + final ASTNode newNode = e.getNode(); + assert newNode != null; + + e.getManager().getCodeStyleManager().reformatNewlyAddedElement(blockNode, newNode); + + PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.getDocument()); + + final RncDefine d = p.getElement(); + assert d != null; + + final RncElement definition = d.getPattern(); + assert definition != null; + + final int offset = definition.getTextRange().getStartOffset(); + + editor.getCaretModel().moveToOffset(offset); + editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE); + editor.getDocument().deleteString(offset, definition.getTextRange().getEndOffset()); + } + + public boolean startInWriteAction() { + return true; + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncAnnotationImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncAnnotationImpl.java new file mode 100644 index 000000000000..49ed702bbbbd --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncAnnotationImpl.java @@ -0,0 +1,50 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.psi.RncAnnotation; +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; +import org.intellij.plugins.relaxNG.compact.psi.RncName; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.tree.IElementType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 24.08.2007 +*/ +public class RncAnnotationImpl extends RncElementImpl implements RncAnnotation { + public RncAnnotationImpl(ASTNode node) { + super(node); + } + + public void accept(@NotNull RncElementVisitor visitor) { + visitor.visitAnnotation(this); + } + + public IElementType getTokenType() { + return getNode().getElementType(); + } + + @Nullable + public RncName getNameElement() { + return findChildByClass(RncName.class); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDeclImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDeclImpl.java new file mode 100644 index 000000000000..7ccc587833da --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDeclImpl.java @@ -0,0 +1,88 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; +import org.intellij.plugins.relaxNG.compact.psi.RncDecl; +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; +import org.intellij.plugins.relaxNG.compact.psi.util.EscapeUtil; +import org.intellij.plugins.relaxNG.compact.psi.util.RenameUtil; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 16.08.2007 + */ +public class RncDeclImpl extends RncElementImpl implements RncDecl { + public RncDeclImpl(ASTNode node) { + super(node); + } + + public String getPrefix() { + final ASTNode ns = findIdentifierNode(); + return ns != null ? EscapeUtil.unescapeText(ns) : null; + } + + public String getDeclaredNamespace() { + final ASTNode ns = getNode().findChildByType(RncTokenTypes.LITERAL); + return ns != null ? EscapeUtil.parseLiteralValue(ns) : null; + } + + @Override + public int getTextOffset() { + final ASTNode ns = findIdentifierNode(); + if (ns != null) { + return ns.getStartOffset(); + } + return super.getTextOffset(); + } + + private ASTNode findIdentifierNode() { + // namespace text = "..." is valid - "text" is parsed as a keyword though + final ASTNode node = getNode().findChildByType(RncTokenTypes.IDENTIFIERS); + if (node == null) { + final ASTNode[] nodes = getNode().getChildren(RncTokenTypes.KEYWORDS); + if (nodes.length > 1) { + return nodes[1]; + } + } + return node; + } + + @Override + public String getName() { + final String s = getPrefix(); + return s != null ? s : ""; + } + + public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException { + final ASTNode node = findIdentifierNode(); + if (node == null) return this; + node.getTreeParent().replaceChild(node, RenameUtil.createIdentifierNode(getManager(), name)); + return this; + } + + public void accept(@NotNull RncElementVisitor visitor) { + visitor.visitElement(this); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDefineImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDefineImpl.java new file mode 100644 index 000000000000..55f5e45a90ea --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDefineImpl.java @@ -0,0 +1,171 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.IconLoader; +import com.intellij.openapi.util.Iconable; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.psi.PsiReferenceBase; +import com.intellij.psi.meta.PsiMetaData; +import com.intellij.psi.meta.PsiMetaOwner; +import com.intellij.psi.meta.PsiPresentableMetaData; +import com.intellij.util.ArrayUtil; +import com.intellij.util.IncorrectOperationException; +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; +import org.intellij.plugins.relaxNG.compact.psi.*; +import org.intellij.plugins.relaxNG.compact.psi.util.EscapeUtil; +import org.intellij.plugins.relaxNG.compact.psi.util.RenameUtil; +import org.intellij.plugins.relaxNG.model.Define; +import org.intellij.plugins.relaxNG.model.resolve.DefinitionResolver; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.Map; +import java.util.Set; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 13.08.2007 + */ +public class RncDefineImpl extends RncElementImpl implements RncDefine, PsiMetaOwner { + public RncDefineImpl(ASTNode node) { + super(node); + } + + public void accept(@NotNull RncElementVisitor visitor) { + visitor.visitDefine(this); + } + + public void accept(Visitor visitor) { + visitor.visitDefine(this); + } + + @Override + public String getName() { + final ASTNode node = getNameNode(); + return EscapeUtil.unescapeText(node); + } + + public PsiElement getNameElement() { + return getNameNode().getPsi(); + } + + @NotNull + public ASTNode getNameNode() { + final ASTNode node = getNode().findChildByType(RncTokenTypes.IDENTIFIERS); + assert node != null; + return node; + } + + public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException { + final ASTNode node = getNameNode(); + node.getTreeParent().replaceChild(node, RenameUtil.createIdentifierNode(getManager(), name)); + return this; + } + + @Nullable + public RncPattern getPattern() { + return findChildByClass(RncPattern.class); + } + + public PsiReference getReference() { + if (getParent() instanceof RncInclude) { + final TextRange range = TextRange.from(0, getNameNode().getTextLength()); + return new PsiReferenceBase(this, range, true) { + public PsiElement resolve() { + return RncDefineImpl.this; + } + + @NotNull + public Object[] getVariants() { + final RncInclude parent = (RncInclude)getParent(); + final RncFile referencedFile = parent.getReferencedFile(); + if (referencedFile == null) { + return EMPTY_ARRAY; + } + final RncGrammar grammar = referencedFile.getGrammar(); + if (grammar == null) { + return EMPTY_ARRAY; + } + + final Map> map = DefinitionResolver.getAllVariants(grammar); + if (map != null) { + return map.keySet().toArray(); + } + return EMPTY_ARRAY; + } + }; + } + return super.getReference(); + } + + @Nullable + public Icon getIcon(int flags) { + return IconLoader.findIcon("/nodes/property.png"); + } + + public boolean isMetaEnough() { + return true; + } + + @Nullable + public PsiMetaData getMetaData() { + return new MyMetaData(); + } + + private class MyMetaData implements PsiMetaData, PsiPresentableMetaData { + /*public boolean processDeclarations(PsiElement context, PsiScopeProcessor processor, PsiSubstitutor substitutor, PsiElement lastElement, PsiElement place) { + return false; + }*/ + + @Nullable + public Icon getIcon() { + return RncDefineImpl.this.getIcon(Iconable.ICON_FLAG_CLOSED); + } + + public String getTypeName() { + return "Pattern Definition"; + } + + public PsiElement getDeclaration() { + return RncDefineImpl.this; + } + + @NonNls + public String getName(PsiElement context) { + return RncDefineImpl.this.getName(); + } + + @NonNls + public String getName() { + return RncDefineImpl.this.getName(); + } + + public void init(PsiElement element) { + } + + public Object[] getDependences() { + return ArrayUtil.EMPTY_OBJECT_ARRAY; + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDivImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDivImpl.java new file mode 100644 index 000000000000..6fbc0f601735 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDivImpl.java @@ -0,0 +1,43 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.psi.RncDiv; +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 24.08.2007 +*/ +public class RncDivImpl extends RncElementImpl implements RncDiv { + public RncDivImpl(ASTNode node) { + super(node); + } + + public void accept(@NotNull RncElementVisitor visitor) { + visitor.visitDiv(this); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitDiv(this); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDocument.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDocument.java new file mode 100644 index 000000000000..e8d7667fb7de --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncDocument.java @@ -0,0 +1,82 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; +import org.intellij.plugins.relaxNG.compact.psi.RncGrammar; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.impl.meta.MetaRegistry; +import com.intellij.psi.meta.PsiMetaData; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.xml.XmlDocument; +import com.intellij.psi.xml.XmlProlog; +import com.intellij.psi.xml.XmlTag; +import com.intellij.xml.XmlNSDescriptor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class RncDocument extends RncElementImpl implements XmlDocument { + public RncDocument(ASTNode node) { + super(node); + } + + public XmlNSDescriptor getDefaultNSDescriptor(String namespace, boolean strict) { + return null; + } + + public XmlProlog getProlog() { + return null; + } + + @Nullable + public XmlTag getRootTag() { + return null; + } + + public XmlNSDescriptor getRootTagNSDescriptor() { + return null; + } + + public boolean processElements(PsiElementProcessor processor, PsiElement place) { + return false; + } + + @Nullable + public PsiMetaData getMetaData() { + return MetaRegistry.getMeta(this); + } + + public boolean isMetaEnough() { + return true; + } + + public RncGrammar getGrammar() { + return findChildByClass(RncGrammar.class); + } + + @Override + @NotNull + protected T[] findChildrenByClass(Class aClass) { + return super.findChildrenByClass(aClass); + } + + public void accept(@NotNull RncElementVisitor visitor) { + visitor.visitElement(this); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncElementImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncElementImpl.java new file mode 100644 index 000000000000..3785dbbeb9c4 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncElementImpl.java @@ -0,0 +1,138 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.RncElementTypes; +import org.intellij.plugins.relaxNG.compact.psi.RncElement; +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; +import org.intellij.plugins.relaxNG.model.CommonElement; + +import com.intellij.extapi.psi.ASTWrapperPsiElement; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.ResolveState; +import com.intellij.psi.scope.PsiScopeProcessor; +import com.intellij.psi.tree.TokenSet; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; + +public abstract class RncElementImpl extends ASTWrapperPsiElement implements RncElement, CommonElement { + private static final TokenSet GRAMMAR_CONTENT = TokenSet.create( + RncElementTypes.START, + RncElementTypes.DEFINE, RncElementTypes.DIV, + RncElementTypes.GRAMMAR_PATTERN, RncElementTypes.PATTERN, + RncElementTypes.INCLUDE + ); + + public RncElementImpl(ASTNode node) { + super(node); + } + + public String toString() { + return getNode().getElementType().toString(); + } + + @Override + public void delete() throws IncorrectOperationException { + getNode().getTreeParent().removeChild(getNode()); + } + + @Override + public PsiElement add(@NotNull PsiElement psiElement) throws IncorrectOperationException { + final ASTNode astNode = psiElement.getNode(); + assert astNode != null; + + getNode().addChild(astNode); + final PsiElement r = getNode().getLastChildNode().getPsi(); + + assert r.getClass() == psiElement.getClass(); + return r; + } + + @Override + public PsiElement addBefore(@NotNull PsiElement psiElement, PsiElement anchor) throws IncorrectOperationException { + final ASTNode child = psiElement.getNode(); + assert child != null; + + final ASTNode anchorNode = anchor.getNode(); + assert anchorNode != null; + + getNode().addChild(child, anchorNode); + final PsiElement r = anchorNode.getTreePrev().getPsi(); + + assert r.getClass() == psiElement.getClass(); + return r; + } + + @Override + public PsiElement addAfter(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { + final ASTNode astNode = anchor.getNode(); + assert astNode != null; + + final ASTNode node = astNode.getTreeNext(); + if (node == null) { + return add(element); + } else { + return addBefore(element, node.getPsi()); + } + } + + public final void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof RncElementVisitor) { + accept((RncElementVisitor)visitor); + } else { + visitor.visitElement(this); + } + } + + @Override + public boolean processDeclarations(@NotNull PsiScopeProcessor processor, @NotNull ResolveState substitutor, PsiElement lastParent, @NotNull PsiElement place) { + final ASTNode astNode = getNode(); + + final ASTNode[] children = astNode.getChildren(GRAMMAR_CONTENT); + processor.handleEvent(PsiScopeProcessor.Event.SET_DECLARATION_HOLDER, this); + for (ASTNode element : children) { + if (!processor.execute(element.getPsi(), substitutor)) { + return false; + } + } + processor.handleEvent(PsiScopeProcessor.Event.SET_DECLARATION_HOLDER, null); + return true; + } + + public abstract void accept(@NotNull RncElementVisitor visitor); + + public void accept(Visitor visitor) { + visitor.visitElement(this); + } + + public void acceptChildren(Visitor visitor) { + final PsiElement[] elements = getChildren(); + //noinspection ForLoopReplaceableByForEach + for (int i = 0; i < elements.length; i++) { + PsiElement element = elements[i]; + if (element instanceof CommonElement) { + ((CommonElement)element).accept(visitor); + } + } + } + + public RncElement getPsiElement() { + return this; + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncExternalRefImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncExternalRefImpl.java new file mode 100644 index 000000000000..5d00ab200f70 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncExternalRefImpl.java @@ -0,0 +1,38 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; +import org.intellij.plugins.relaxNG.compact.psi.RncExternalRef; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 10.08.2007 + */ +public class RncExternalRefImpl extends RncFileReferenceImpl implements RncExternalRef { + public RncExternalRefImpl(ASTNode node) { + super(node); + } + + public void accept(@NotNull RncElementVisitor visitor) { + visitor.visitExternalRef(this); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncFileImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncFileImpl.java new file mode 100644 index 000000000000..37636492d5be --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncFileImpl.java @@ -0,0 +1,126 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import com.intellij.extapi.psi.PsiFileBase; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.ResolveState; +import com.intellij.psi.scope.PsiScopeProcessor; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.ProjectScope; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.tree.TokenSet; +import com.intellij.psi.xml.XmlDocument; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.IncorrectOperationException; +import org.intellij.plugins.relaxNG.compact.RncElementTypes; +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.intellij.plugins.relaxNG.compact.RngCompactLanguage; +import org.intellij.plugins.relaxNG.compact.psi.RncDecl; +import org.intellij.plugins.relaxNG.compact.psi.RncFile; +import org.intellij.plugins.relaxNG.compact.psi.RncGrammar; +import org.jetbrains.annotations.NotNull; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 01.08.2007 +*/ +public class RncFileImpl extends PsiFileBase implements RncFile, XmlFile { + private static final TokenSet DECLS = TokenSet.create(RncElementTypes.NS_DECL, RncElementTypes.DATATYPES_DECL); + + public RncFileImpl(FileViewProvider viewProvider) { + super(viewProvider, RngCompactLanguage.INSTANCE); + } + + @NotNull + public FileType getFileType() { + return RncFileType.getInstance(); + } + + @NotNull + public XmlDocument getDocument() { + // this needs to be a seperate child element because of com.intellij.util.xml.impl.ExternalChangeProcessor.visitDocumentChanged() + final XmlDocument document = findChildByClass(XmlDocument.class); + assert document != null; + return document; + } + + @Override + public boolean processDeclarations(@NotNull PsiScopeProcessor processor, @NotNull ResolveState substitutor, PsiElement lastParent, @NotNull PsiElement place) { + //processor.handleEvent(JavaScopeProcessorEvent.SET_CURRENT_FILE_CONTEXT, this); + try { + final ASTNode docNode = getDocument().getNode(); + assert docNode != null; + final ASTNode[] nodes = docNode.getChildren(DECLS); + for (ASTNode node : nodes) { + if (!processor.execute(node.getPsi(), substitutor)) { + return false; + } + } + + final RncGrammar grammar = getGrammar(); + if (grammar != null) { + return grammar.processDeclarations(processor, substitutor, lastParent, place); + } else { + return true; + } + } finally { + //processor.handleEvent(JavaScopeProcessorEvent.SET_CURRENT_FILE_CONTEXT, null); + } + } + + @Override + public PsiElement add(@NotNull PsiElement element) throws IncorrectOperationException { + return getDocument().add(element); + } + + @Override + public PsiElement addAfter(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { + return getDocument().addAfter(element, anchor); + } + + @Override + public PsiElement addBefore(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { + return getDocument().addBefore(element, anchor); + } + + public boolean processElements(PsiElementProcessor processor, PsiElement place) { + return false; + } + + public GlobalSearchScope getFileResolveScope() { + return ProjectScope.getAllScope(getProject()); + } + + @Override + public String toString() { + return getClass().getSimpleName() + ":" + getName(); + } + + public RncDecl[] getDeclarations() { + return ((RncDocument)getDocument()).findChildrenByClass(RncDecl.class); + } + + public RncGrammar getGrammar() { + final XmlDocument document = getDocument(); + return ((RncDocument)document).getGrammar(); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncFileReferenceImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncFileReferenceImpl.java new file mode 100644 index 000000000000..9cfb4668ccfb --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncFileReferenceImpl.java @@ -0,0 +1,99 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; +import org.intellij.plugins.relaxNG.compact.psi.RncFile; +import org.intellij.plugins.relaxNG.compact.psi.RncFileReference; +import org.intellij.plugins.relaxNG.compact.psi.util.EscapeUtil; +import org.intellij.plugins.relaxNG.references.FileReferenceUtil; + +import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiReference; +import com.intellij.psi.ResolveState; +import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet; +import com.intellij.psi.scope.PsiScopeProcessor; +import com.intellij.xml.util.XmlUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 29.08.2007 + */ +abstract class RncFileReferenceImpl extends RncElementImpl implements RncFileReference { + public RncFileReferenceImpl(ASTNode node) { + super(node); + } + + @NotNull + @Override + @SuppressWarnings({ "SSBasedInspection" }) + public PsiReference[] getReferences() { + final ASTNode literal = getNode().findChildByType(RncTokenTypes.LITERAL); + if (literal == null) return PsiReference.EMPTY_ARRAY; + + final String s = literal.getText(); + final FileReferenceSet set = + new FileReferenceSet(s.substring(1, s.length() - 1), this, + getReferenceRange().getStartOffset(), + null, true, false); + + return FileReferenceUtil.restrict(set, FileReferenceUtil.byType(RncFileType.getInstance())); + } + + public RncFile getReferencedFile() { + final String href = getFileReference(); + if (href != null) { + final PsiFile file = XmlUtil.findRelativeFile(href, getContainingFile()); + if (file instanceof RncFile) { + return (RncFile)file; + } + } + return null; + } + + @Nullable + public String getFileReference() { + final ASTNode element = getNode().findChildByType(RncTokenTypes.LITERAL); + if (element == null) return null; + final String s = EscapeUtil.unescapeText(element); + return s.substring(1, s.length() - 1); + } + + public TextRange getReferenceRange() { + final ASTNode literal = getNode().findChildByType(RncTokenTypes.LITERAL); + if (literal == null) return TextRange.from(0, 0); + final int startInElement = literal.getStartOffset() - getTextOffset() + 1; + return TextRange.from(startInElement, literal.getTextLength() - 2); + } + + @Override + public boolean processDeclarations(@NotNull PsiScopeProcessor processor, @NotNull ResolveState substitutor, PsiElement lastParent, @NotNull PsiElement place) { + final FollowFileHint hint = processor.getHint(FollowFileHint.KEY); + final RncFile file = getReferencedFile(); + if (file != null && hint != null && hint.doFollow(file)) { + file.processDeclarations(processor, substitutor, lastParent, place); + } + return true; + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncGrammarImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncGrammarImpl.java new file mode 100644 index 000000000000..bb5f23103540 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncGrammarImpl.java @@ -0,0 +1,62 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.RncElementTypes; +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; +import org.intellij.plugins.relaxNG.compact.psi.RncGrammar; +import org.intellij.plugins.relaxNG.compact.psi.RncPattern; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 13.08.2007 + */ +public class RncGrammarImpl extends RncElementImpl implements RncGrammar { + public RncGrammarImpl(ASTNode node) { + super(node); + } + + public void accept(@NotNull RncElementVisitor visitor) { + visitor.visitGrammar(this); + } + + public void accept(Visitor visitor) { + visitor.visitGrammar(this); + } + + public RncPattern getStart() { + final ASTNode node = getNode().findChildByType(RncElementTypes.START); + return node != null ? (RncPattern)node.getPsi() : null; + } + + @Override + public PsiElement add(@NotNull PsiElement psiElement) throws IncorrectOperationException { + final PsiElement rbrace = findChildByType(RncTokenTypes.RBRACE); + // TODO: fix block psi + if (rbrace != null) { + return addBefore(psiElement, rbrace); + } + return super.add(psiElement); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncIncludeImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncIncludeImpl.java new file mode 100644 index 000000000000..a76e65a69101 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncIncludeImpl.java @@ -0,0 +1,69 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.psi.RncDefine; +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; +import org.intellij.plugins.relaxNG.compact.psi.RncInclude; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.ResolveState; +import com.intellij.psi.scope.PsiScopeProcessor; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 10.08.2007 + */ +public class RncIncludeImpl extends RncFileReferenceImpl implements RncInclude { + public RncIncludeImpl(ASTNode node) { + super(node); + } + + @Override + public boolean processDeclarations(@NotNull PsiScopeProcessor processor, @NotNull ResolveState substitutor, PsiElement lastParent, @NotNull PsiElement place) { + final PsiElement[] children = getChildren(); + for (PsiElement child : children) { + if (!processor.execute(child, substitutor)) { + return false; + } + } + return super.processDeclarations(processor, substitutor, lastParent, place); + } + + public void accept(@NotNull RncElementVisitor visitor) { + visitor.visitInclude(this); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitInclude(this); + } + + public PsiFile getInclude() { + return getReferencedFile(); + } + + @NotNull + public RncDefine[] getOverrides() { + // TODO: DIVs? + return findChildrenByClass(RncDefine.class); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncNameImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncNameImpl.java new file mode 100644 index 000000000000..271cc117d6c9 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncNameImpl.java @@ -0,0 +1,277 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.RncElementTypes; +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; +import org.intellij.plugins.relaxNG.compact.psi.*; +import org.intellij.plugins.relaxNG.compact.psi.util.EscapeUtil; +import org.intellij.plugins.relaxNG.compact.psi.util.RenameUtil; + +import com.intellij.codeInsight.daemon.EmptyResolveMessageProvider; +import com.intellij.codeInsight.daemon.QuickFixProvider; +import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction; +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.codeInsight.lookup.LookupItem; +import com.intellij.codeInsight.template.*; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.*; +import com.intellij.psi.scope.BaseScopeProcessor; +import com.intellij.psi.tree.IElementType; +import com.intellij.util.ArrayUtil; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 14.08.2007 + */ +public class RncNameImpl extends RncElementImpl implements RncName, PsiReference, + EmptyResolveMessageProvider, QuickFixProvider { + private enum Kind { + NAMESPACE, DATATYPES + } + private final Kind myKind; + + public RncNameImpl(ASTNode node) { + super(node); + + final IElementType parent = node.getTreeParent().getElementType(); + if (parent == RncElementTypes.DATATYPE_PATTERN) { + myKind = Kind.DATATYPES; + } else { + myKind = Kind.NAMESPACE; + } + } + + @Nullable + public String getPrefix() { + final String[] parts = EscapeUtil.unescapeText(getNode()).split(":", 2); + return parts.length == 2 ? parts[0] : null; + } + + @NotNull + public String getLocalPart() { + final String[] parts = EscapeUtil.unescapeText(getNode()).split(":", 2); + return parts.length == 1 ? parts[0] : parts[1]; + } + + @Override + public void accept(@NotNull RncElementVisitor visitor) { + visitor.visitName(this); + } + + @Override + public PsiReference getReference() { + return getPrefix() == null ? null : this; + } + + public PsiElement getElement() { + return this; + } + + public TextRange getRangeInElement() { + return TextRange.from(0, getText().indexOf(':')); + } + + @Nullable + public PsiElement resolve() { + final MyResolver resolver = new MyResolver(getPrefix(), myKind); + getContainingFile().processDeclarations(resolver, ResolveState.initial(), this, this); + return resolver.getResult(); + } + + public String getCanonicalText() { + return getRangeInElement().substring(getText()); + } + + public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException { + final ASTNode node = getNode(); + final ASTNode child = RenameUtil.createPrefixedNode(getManager(), newElementName, getLocalPart()); + node.getTreeParent().replaceChild(node, child); + return child.getPsi(); + } + + public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException { + throw new UnsupportedOperationException(); + } + + public boolean isReferenceTo(PsiElement element) { + return element instanceof RncElement && Comparing.equal(resolve(), element); + } + + @NotNull + public Object[] getVariants() { + return ArrayUtil.EMPTY_OBJECT_ARRAY; + } + + public boolean isSoft() { + final String prefix = getPrefix(); + return "xsd".equals(prefix) || "xml".equals(prefix); + } + + public String getUnresolvedMessagePattern() { + return "Unresolved namespace prefix ''{0}''"; + } + + public void registerQuickfix(HighlightInfo info, final RncNameImpl reference) { + if (reference.getPrefix() == null) return; // huh? + + QuickFixAction.registerQuickFixAction(info, new CreateDeclFix(reference)); + } + + private static class MyResolver extends BaseScopeProcessor { + private final String myPrefix; + private final Kind myKind; + private PsiElement myResult; + + public MyResolver(String prefix, Kind kind) { + myPrefix = prefix; + myKind = kind; + } + + public boolean execute(PsiElement element, ResolveState substitutor) { + final ASTNode node = element.getNode(); + if (node == null) return true; + + if (!(element instanceof RncDecl)) { + return false; + } + + final IElementType type = node.getElementType(); + if (myKind == Kind.NAMESPACE && type == RncElementTypes.NS_DECL) { + if (checkDecl(element)) return false; + } else if (myKind == Kind.DATATYPES && type == RncElementTypes.DATATYPES_DECL) { + if (checkDecl(element)) return false; + } + + return true; + } + + private boolean checkDecl(PsiElement element) { + if (myPrefix.equals(((RncDecl)element).getPrefix())) { + myResult = element; + return true; + } + return false; + } + + public PsiElement getResult() { + return myResult; + } + } + + public static class CreateDeclFix implements IntentionAction { + private final RncNameImpl myReference; + + public CreateDeclFix(RncNameImpl reference) { + myReference = reference; + } + + @NotNull + public String getText() { + return getFamilyName() + " '" + myReference.getPrefix() + "'"; + } + + @NotNull + public String getFamilyName() { + return "Create " + myReference.myKind.name().toLowerCase() + " declaration"; + } + + public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { + return myReference.isValid(); + } + + public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + final String prefix = myReference.getPrefix(); + final RncFile psiFile = (RncFile)PsiFileFactory.getInstance(myReference.getProject()).createFileFromText("dummy.rnc", myReference.myKind.name().toLowerCase() + " " + prefix + " = \"###\""); + final RncFile rncFile = (RncFile)myReference.getContainingFile(); + final RncDecl[] declarations = rncFile.getDeclarations(); + final RncDecl decl = psiFile.getDeclarations()[0]; + final RncDecl e; + if (declarations.length > 0) { + e = (RncDecl)rncFile.addAfter(decl, declarations[declarations.length - 1]); + } else { + final RncGrammar rncGrammar = rncFile.getGrammar(); + if (rncGrammar != null) { + e = (RncDecl)rncFile.addBefore(decl, rncGrammar); + } else { + e = (RncDecl)rncFile.add(decl); + } + } + + final ASTNode blockNode = e.getParent().getNode(); + assert blockNode != null; + + final ASTNode newNode = e.getNode(); + assert newNode != null; + + e.getManager().getCodeStyleManager().reformatNewlyAddedElement(blockNode, newNode); + + final SmartPsiElementPointer p = SmartPointerManager.getInstance(project).createLazyPointer(e); + PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.getDocument()); + + final RncDecl d = p.getElement(); + assert d != null; + + final PsiElement literal = d.getLastChild(); + assert literal != null; + + final ASTNode literalNode = literal.getNode(); + assert literalNode != null; + + assert literalNode.getElementType() == RncTokenTypes.LITERAL; + + final int offset = literal.getTextRange().getStartOffset(); + editor.getDocument().deleteString(literal.getTextRange().getStartOffset(), literal.getTextRange().getEndOffset()); + + final TemplateManager manager = TemplateManager.getInstance(project); + final Template t = manager.createTemplate("", ""); + t.addTextSegment("\""); + final Expression expression = new Expression() { + public Result calculateResult(ExpressionContext context) { + return new TextResult(""); + } + + public Result calculateQuickResult(ExpressionContext context) { + return calculateResult(context); + } + + public LookupItem[] calculateLookupItems(ExpressionContext context) { + return LookupItem.EMPTY_ARRAY; + } + }; + t.addVariable("uri", expression, expression, true); + t.addTextSegment("\""); + t.addEndVariable(); + + editor.getCaretModel().moveToOffset(offset); + manager.startTemplate(editor, t); + } + + public boolean startInWriteAction() { + return true; + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncNsDeclImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncNsDeclImpl.java new file mode 100644 index 000000000000..ed1569f6c952 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncNsDeclImpl.java @@ -0,0 +1,37 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; +import org.intellij.plugins.relaxNG.compact.psi.RncNsDecl; + +import com.intellij.lang.ASTNode; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 14.08.2007 + */ +public class RncNsDeclImpl extends RncDeclImpl implements RncNsDecl { + public RncNsDeclImpl(ASTNode node) { + super(node); + } + + public boolean isDefault() { + return getNode().findChildByType(RncTokenTypes.KEYWORD_DEFAULT) != null; + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncParentRefImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncParentRefImpl.java new file mode 100644 index 000000000000..b7cab162298d --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncParentRefImpl.java @@ -0,0 +1,72 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; +import org.intellij.plugins.relaxNG.compact.psi.RncGrammar; +import org.intellij.plugins.relaxNG.compact.psi.RncParentRef; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiReference; +import com.intellij.psi.util.PsiTreeUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 11.08.2007 + */ +public class RncParentRefImpl extends RncRefImpl implements RncParentRef { + public RncParentRefImpl(ASTNode node) { + super(node); + } + + @Override // super asserts nameNode != null + public String getReferencedName() { + final ASTNode node = findNameNode(); + return node == null ? null : super.getReferencedName(); + } + + @Override + public void accept(@NotNull RncElementVisitor visitor) { + visitor.visitParentRef(this); + } + + @Override + public int getTextOffset() { + final ASTNode astNode = findNameNode(); + return astNode != null ? astNode.getStartOffset() : getTextRange().getStartOffset(); + } + + @Override + @Nullable + public PsiReference getReference() { + return new PatternReference(this) { + @Override + protected RncGrammar getScope() { + final PsiElement scope = PsiTreeUtil.getParentOfType(getElement(), RncGrammar.class, true, PsiFile.class); + if (scope == null) { + return null; + } + return PsiTreeUtil.getParentOfType(scope, RncGrammar.class, true, PsiFile.class); + } + }; + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncRefImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncRefImpl.java new file mode 100644 index 000000000000..d5d69155424f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncRefImpl.java @@ -0,0 +1,70 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.impl; + +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; +import org.intellij.plugins.relaxNG.compact.psi.RncDefine; +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; +import org.intellij.plugins.relaxNG.compact.psi.RncRef; +import org.intellij.plugins.relaxNG.compact.psi.util.EscapeUtil; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiReference; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 11.08.2007 + */ +public class RncRefImpl extends RncElementImpl implements RncRef { + public RncRefImpl(ASTNode node) { + super(node); + } + + @Nullable + public RncDefine getPattern() { + final PsiReference ref = getReference(); + // TODO: honor combine & return virtual element if multiResolve().length > 0 + return ref instanceof PatternReference ? (RncDefine)ref.resolve() : null; + } + + public String getReferencedName() { + final ASTNode node = findNameNode(); + assert node != null; + return EscapeUtil.unescapeText(node); + } + + protected ASTNode findNameNode() { + return getNode().findChildByType(RncTokenTypes.IDENTIFIERS); + } + + @Override + public void accept(@NotNull RncElementVisitor visitor) { + visitor.visitRef(this); + } + + public void accept(Visitor visitor) { + visitor.visitRef(this); + } + + @Override + public PsiReference getReference() { + return new PatternReference(this); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/util/EscapeUtil.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/util/EscapeUtil.java new file mode 100644 index 000000000000..d696b57527f8 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/util/EscapeUtil.java @@ -0,0 +1,67 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.util; + +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 13.08.2007 + */ +public class EscapeUtil { + @SuppressWarnings({ "SSBasedInspection" }) + public static String unescapeText(@NotNull PsiElement element) { + final ASTNode node = element.getNode(); + if (node != null) { + return unescapeText(node); + } else { + return element.getText(); + } + } + + @SuppressWarnings({ "SSBasedInspection" }) + public static String unescapeText(@NotNull ASTNode node) { + final String text = node.getText(); + + // TODO: unescape \x{xx} sequences + + if (node.getElementType() == RncTokenTypes.ESCAPED_IDENTIFIER) { + assert text.charAt(0) == '\\'; + return text.length() > 1 ? text.substring(1) : ""; + } else { + return text; + } + } + + public static String parseLiteralValue(ASTNode ns) { + return unquote(unescapeText(ns)); + } + + private static String unquote(String s) { + if (s.length() >= 6 && s.charAt(0) == s.charAt(1)) { + s = s.replace('\u0000', '\n'); + return s.substring(3, s.length() - 3); + } else { + return s.substring(1, s.length() - 1); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/util/PsiFunction.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/util/PsiFunction.java new file mode 100644 index 000000000000..ce3a96afce18 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/util/PsiFunction.java @@ -0,0 +1,36 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.util; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.util.NotNullFunction; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 13.08.2007 +*/ +public final class PsiFunction implements NotNullFunction { + public static final PsiFunction INSTANCE = new PsiFunction(); + + @NotNull + public PsiElement fun(ASTNode astNode) { + return astNode.getPsi(); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/util/RenameUtil.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/util/RenameUtil.java new file mode 100644 index 000000000000..2751f2fd40ab --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/util/RenameUtil.java @@ -0,0 +1,111 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.compact.psi.util; + +import org.intellij.plugins.relaxNG.compact.RncElementTypes; +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.intellij.plugins.relaxNG.compact.RncTokenTypes; +import org.intellij.plugins.relaxNG.compact.RngCompactLanguage; +import org.intellij.plugins.relaxNG.compact.psi.RncFile; +import org.intellij.plugins.relaxNG.compact.psi.RncGrammar; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.LanguageParserDefinitions; +import com.intellij.lang.ParserDefinition; +import com.intellij.lexer.Lexer; +import com.intellij.psi.PsiFileFactory; +import com.intellij.psi.PsiManager; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 14.08.2007 + */ +public class RenameUtil { + @NotNull + public static ASTNode createIdentifierNode(PsiManager manager, String name) throws IncorrectOperationException { + if (isKeyword(manager, name)) { + name = "\\" + name; + } else if (!isIdentifier(manager, name)) { + throw new IncorrectOperationException("Illegal identifier: " + name); + } + + final PsiFileFactory f = PsiFileFactory.getInstance(manager.getProject()); + final RncFile file = (RncFile)f.createFileFromText("dummy.rnc", RncFileType.getInstance(), name + " = bar"); + final ASTNode astNode = findFirstGrammarNode(file); + final ASTNode newNode = astNode.findChildByType(RncTokenTypes.IDENTIFIERS); + assert newNode != null; + return newNode; + } + + public static boolean isIdentifier(PsiManager manager, String name) { + return isTokenOfType(manager, name, RncTokenTypes.IDENTIFIER_OR_KEYWORD); + } + + public static boolean isKeyword(PsiManager manager, String name) { + return isTokenOfType(manager, name, RncTokenTypes.KEYWORDS); + } + + private static boolean isTokenOfType(PsiManager manager, String name, TokenSet set) { + final ParserDefinition definition = LanguageParserDefinitions.INSTANCE.forLanguage(RngCompactLanguage.INSTANCE); + assert definition != null; + final Lexer lexer = definition.createLexer(manager.getProject()); + + lexer.start(name, 0, name.length(), 0); + final IElementType t = lexer.getTokenType(); + lexer.advance(); + return lexer.getTokenType() == null && set.contains(t); + } + + public static ASTNode createPrefixedNode(PsiManager manager, String prefix, String localPart) { + final PsiFileFactory f = PsiFileFactory.getInstance(manager.getProject()); + final RncFile file = (RncFile)f.createFileFromText("dummy.rnc", RncFileType.getInstance(), "element " + prefix + ":" + localPart + " { text }"); + + final ASTNode node = findFirstGrammarNode(file); + final ASTNode nameClassNode = node.findChildByType(RncElementTypes.NAME_CLASS); + assert nameClassNode != null; + + final ASTNode astNode = nameClassNode.findChildByType(RncElementTypes.NAME); + assert astNode != null; + return astNode; + } + + @NotNull + private static ASTNode findFirstGrammarNode(RncFile file) { + final RncGrammar grammar = file.getGrammar(); + assert grammar != null; + final ASTNode grammarNode = grammar.getNode(); + assert grammarNode != null; + final ASTNode astNode = grammarNode.getFirstChildNode(); + assert astNode != null; + return astNode; + } + + public static ASTNode createLiteralNode(PsiManager manager, String content) { + final PsiFileFactory f = PsiFileFactory.getInstance(manager.getProject()); + final RncFile file = (RncFile)f.createFileFromText("dummy.rnc", RncFileType.getInstance(), "include \"" + content + "\""); + + final ASTNode include = findFirstGrammarNode(file); + final ASTNode literal = include.findChildByType(RncTokenTypes.LITERAL); + assert literal != null; + return literal; + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfig.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfig.java new file mode 100644 index 000000000000..243ea9eaf1fd --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfig.java @@ -0,0 +1,41 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.config; + +import com.intellij.openapi.components.ProjectComponent; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 26.11.2007 + */ +public abstract class NoNamespaceConfig implements ProjectComponent { + @Nullable + public abstract String getMapping(@NotNull PsiFile file); + public abstract VirtualFile getMappedFile(@NotNull PsiFile file); + + public abstract void setMapping(@NotNull PsiFile file, @Nullable String location); + + public static NoNamespaceConfig getInstance(@NotNull Project project) { + return project.getComponent(NoNamespaceConfig.class); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfigImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfigImpl.java new file mode 100644 index 000000000000..a1d06fd297ec --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfigImpl.java @@ -0,0 +1,175 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.config; + +import com.intellij.openapi.components.PersistentStateComponent; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import com.intellij.openapi.editor.HectorComponentPanel; +import com.intellij.openapi.editor.HectorComponentPanelsProvider; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.pointers.VirtualFilePointer; +import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager; +import com.intellij.psi.PsiFile; +import com.intellij.psi.xml.XmlFile; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.xmlb.annotations.MapAnnotation; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 25.11.2007 + */ +@State( + name = "NoNamespaceConfig.Mappings", + storages = { @Storage( + id = "other", + file = "$WORKSPACE_FILE$") }) +class NoNamespaceConfigImpl extends NoNamespaceConfig implements PersistentStateComponent { + + private final Map myMappings = new HashMap(); + private final Project myProject; + + NoNamespaceConfigImpl(Project project) { + myProject = project; + } + + private VirtualFilePointer getMappedPointer(@NotNull PsiFile file) { + final VirtualFile virtualFile = file.getVirtualFile(); + if (virtualFile == null) return null; + + final String url = virtualFile.getUrl(); + for (VirtualFilePointer pointer : myMappings.keySet()) { + if (url.equals(pointer.getUrl())) { + return myMappings.get(pointer); + } + } + return null; + } + + @Nullable + public String getMapping(@NotNull PsiFile file) { + final VirtualFilePointer pointer = getMappedPointer(file); + return pointer != null ? pointer.getUrl() : null; + } + + public VirtualFile getMappedFile(@NotNull PsiFile file) { + final VirtualFilePointer url = getMappedPointer(file); + return url != null ? url.getFile() : null; + } + + public void setMapping(@NotNull PsiFile file, String location) { + final VirtualFile virtualFile = file.getVirtualFile(); + assert virtualFile != null; + + final String url = virtualFile.getUrl(); + final VirtualFilePointerManager manager = VirtualFilePointerManager.getInstance(); + for (VirtualFilePointer pointer : myMappings.keySet()) { + if (url.equals(pointer.getUrl())) { + if (location == null) { + myMappings.remove(pointer); + return; + } else if (!location.equals(myMappings.get(pointer).getUrl())) { + myMappings.remove(pointer); + myMappings.put(pointer, manager.create(location, myProject, null)); + return; + } + } + } + + if (location != null) { + myMappings.put(manager.create(url, myProject, null), manager.create(location, myProject, null)); + } + } + + public void initComponent() { + } + + public void disposeComponent() { + } + + @NotNull + public String getComponentName() { + return "RELAX-NG.NoNamespaceConfig"; + } + + public void projectOpened() { + } + + public void projectClosed() { + reset(); + } + + public Mappings getState() { + final HashMap map = new HashMap(); + for (Map.Entry entry : myMappings.entrySet()) { + map.put(entry.getKey().getUrl(), entry.getValue().getUrl()); + } + return new Mappings(map); + } + + public void loadState(Mappings state) { + reset(); + + final VirtualFilePointerManager manager = VirtualFilePointerManager.getInstance(); + final Map map = state.myMappings; + for (String file : map.keySet()) { + myMappings.put(manager.create(file, myProject, null), manager.create(map.get(file), myProject, null)); + } + } + + private void reset() { + myMappings.clear(); + } + + @SuppressWarnings({ "CanBeFinal", "UnusedDeclaration" }) + public static class Mappings { + @MapAnnotation(surroundWithTag = false, entryTagName = "mapping", keyAttributeName = "file", valueAttributeName = "schema") + public Map myMappings; + + public Mappings() { + myMappings = new HashMap(); + } + + Mappings(Map map) { + myMappings = map; + } + } + + public static class HectorProvider implements HectorComponentPanelsProvider { + @Nullable + public HectorComponentPanel createConfigurable(@NotNull PsiFile file) { + if (file instanceof XmlFile) { + try { + final XmlTag rootTag = ((XmlFile)file).getDocument().getRootTag(); + if (rootTag.getNamespace().length() == 0) { + return new NoNamespaceConfigPanel(NoNamespaceConfig.getInstance(file.getProject()), file); + } + } catch (NullPointerException e) { + return null; + } + } + return null; + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfigPanel.form b/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfigPanel.form new file mode 100644 index 000000000000..cb962a695f7c --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfigPanel.form @@ -0,0 +1,29 @@ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfigPanel.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfigPanel.java new file mode 100644 index 000000000000..690dac40a8c1 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceConfigPanel.java @@ -0,0 +1,133 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.config; + +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.editor.HectorComponentPanel; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.ui.ComponentWithBrowseButton; +import com.intellij.openapi.ui.TextComponentAccessor; +import com.intellij.openapi.ui.TextFieldWithBrowseButton; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import org.intellij.plugins.relaxNG.compact.RncFileType; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.io.File; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 25.11.2007 + */ +class NoNamespaceConfigPanel extends HectorComponentPanel { + private final NoNamespaceConfig myConfig; + private final PsiFile myFile; + private final String myMapping; + + private TextFieldWithBrowseButton mySchemaFile; + private JPanel myRoot; + private boolean myDialogOpen; + + NoNamespaceConfigPanel(NoNamespaceConfig noNamespaceConfig, PsiFile file) { + myConfig = noNamespaceConfig; + myFile = file; + myMapping = myConfig.getMapping(file); + + final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false) { + public boolean isFileSelectable(VirtualFile file) { + final boolean b = super.isFileSelectable(file); + if (b) { + final FileType type = file.getFileType(); + if (type != StdFileTypes.XML) { + return type == RncFileType.getInstance(); + } + } + return b; + } + }; + + final Project project = file.getProject(); + final VirtualFile virtualFile = file.getVirtualFile(); + if (virtualFile != null) { + final Module module = ProjectRootManager.getInstance(project).getFileIndex().getModuleForFile(virtualFile); + descriptor.putUserData(LangDataKeys.MODULE_CONTEXT, module); + } + + // that's kind of a hack that ensures the Hector Panel stays open when selecting a file. otherwise it will close + // as soon as a file selected. + final ComponentWithBrowseButton.BrowseFolderActionListener actionListener = + new ComponentWithBrowseButton.BrowseFolderActionListener("Select Schema", "Select a RELAX-NG file to associate with the document", + mySchemaFile, project, descriptor, TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT) { + public void actionPerformed(ActionEvent e) { + myDialogOpen = true; + try { + super.actionPerformed(e); + } finally { + myDialogOpen = false; + } + } + }; + + mySchemaFile.addActionListener(actionListener); + } + + public boolean canClose() { + return super.canClose() && !myDialogOpen; + } + + public JComponent createComponent() { + return myRoot; + } + + public boolean isModified() { + final String s = mySchemaFile.getText(); + final String m = myMapping != null ? myMapping : ""; + return !s.equals(m); + } + + public void apply() throws ConfigurationException { + final String s = getMapping(); + if (s != null) { + myConfig.setMapping(myFile, s); + } else { + myConfig.setMapping(myFile, null); + } + } + + private String getMapping() { + final String s = mySchemaFile.getText().trim(); + return s.length() > 0 ? VfsUtil.pathToUrl(s.replace(File.separatorChar, '/')) : null; + } + + public void reset() { + mySchemaFile.setText(myMapping != null ? VfsUtil.urlToPath(myMapping).replace('/', File.separatorChar) : ""); + } + + public void disposeUIResources() { + // doesn't help - updating the validation needs a hard modification +// DaemonCodeAnalyzer.getInstance(myFile.getProject()).restart(); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceSchemaProvider.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceSchemaProvider.java new file mode 100644 index 000000000000..556b68eb7c98 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/config/NoNamespaceSchemaProvider.java @@ -0,0 +1,55 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.config; + +import com.intellij.ide.highlighter.XmlFileType; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.xml.XmlFile; +import com.intellij.xml.XmlSchemaProvider; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 22.11.2007 +*/ +public class NoNamespaceSchemaProvider extends XmlSchemaProvider { + @Nullable + public XmlFile getSchema(@NotNull @NonNls String url, @Nullable Module module, @NotNull PsiFile baseFile) { + if ("".equals(url)) { + final Project project = baseFile.getProject(); + final VirtualFile file = NoNamespaceConfig.getInstance(project).getMappedFile(baseFile); + if (file == null) return null; + final PsiFile f = PsiManager.getInstance(project).findFile(file); + if (f instanceof XmlFile) { + return (XmlFile)f; + } + } + return null; + } + + @Override + public boolean isAvailable(@NotNull XmlFile file) { + return file.getFileType() == XmlFileType.INSTANCE; + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedDtdOptions.form b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedDtdOptions.form new file mode 100644 index 000000000000..f6607f923e2f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedDtdOptions.form @@ -0,0 +1,191 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedDtdOptions.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedDtdOptions.java new file mode 100644 index 000000000000..7c3c3e457863 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedDtdOptions.java @@ -0,0 +1,258 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.convert; + +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.IconLoader; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.PsiRecursiveElementVisitor; +import com.intellij.psi.xml.XmlAttributeDecl; +import com.intellij.psi.xml.XmlElementDecl; +import org.jetbrains.annotations.NonNls; + +import javax.swing.*; +import javax.swing.table.AbstractTableModel; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.*; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 18.11.2007 + */ +public class AdvancedDtdOptions implements AdvancedOptions { + @NonNls + private static final String COLON_REPLACEMENT = "colon-replacement"; + @NonNls + private static final String ELEMENT_DEFINE = "element-define"; + @NonNls + private static final String ATTLIST_DEFINE = "attlist-define"; + @NonNls + private static final String INLINE_ATTLIST = "inline-attlist"; + @NonNls + private static final String ANY_NAME = "any-name"; + @NonNls + private static final String STRICT_ANY = "strict-any"; + @NonNls + private static final String ANNOTATION_PREFIX = "annotation-prefix"; + @NonNls + private static final String GENERATE_START = "generate-start"; + @NonNls + private static final String XMLNS = "xmlns"; + + private JComponent myRoot; + + private JCheckBox myInlineAttlistCheckBox; + private JTextField myColonReplacement; + private JTextField myElementDefine; + private JTextField myAttlistDefine; + private JTextField myAnyName; + private JCheckBox myStrictAnyCheckBox; + private JTextField myAnnotationPrefix; + private JCheckBox myGenerateStartCheckBox; + private JTextField myDefaultNS; + private JTable myNamespaceMap; + + private JPanel myToolbar; + + public AdvancedDtdOptions() { + myInlineAttlistCheckBox.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange() == ItemEvent.SELECTED) { + myAttlistDefine.setEnabled(false); + } else { + myAttlistDefine.setEnabled(true); + } + } + }); + myNamespaceMap.setModel(new NamespaceMapModel()); + myNamespaceMap.getColumnModel().getColumn(0).setMaxWidth((int)(new JLabel("Prefix").getPreferredSize().width * 1.2)); + + final DefaultActionGroup group = new DefaultActionGroup(); + group.add(new AnAction(null, "Remove Entry", IconLoader.findIcon("/general/remove.png")) { + public void update(AnActionEvent e) { + if (myNamespaceMap.getModel().getRowCount() == 0 || myNamespaceMap.getSelectedRow() == -1) { + e.getPresentation().setEnabled(false); + } else { + e.getPresentation().setEnabled(true); + } + } + + public void actionPerformed(AnActionEvent e) { + ((NamespaceMapModel)myNamespaceMap.getModel()).removeRow(myNamespaceMap.getSelectedRow()); + } + }); + + final ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, group, false); + myToolbar.add(toolbar.getComponent()); + } + + public JComponent getRoot() { + return myRoot; + } + + public Map getOptions() { + final HashMap map = new LinkedHashMap(); + + map.put(INLINE_ATTLIST, myInlineAttlistCheckBox.isSelected()); + + setText(map, COLON_REPLACEMENT, myColonReplacement); + setText(map, ELEMENT_DEFINE, myElementDefine); + setText(map, ATTLIST_DEFINE, myAttlistDefine); + setText(map, ANY_NAME, myAnyName); + + if (myStrictAnyCheckBox.isSelected()) { + map.put(STRICT_ANY, Boolean.TRUE); + } + + setText(map, ANNOTATION_PREFIX, myAnnotationPrefix); + + map.put(GENERATE_START, myGenerateStartCheckBox.isSelected()); + + if (myDefaultNS.getText().trim().length() > 0) { + map.put(XMLNS, myDefaultNS.getText() ); + } + + final List data = ((NamespaceMapModel)myNamespaceMap.getModel()).getData(); + for (String[] parts : data) { + map.put(XMLNS + ":" + parts[0], parts[1]); + } + + return map; + } + + private static void setText(HashMap map, String option, JTextField field) { + final String colonReplacement = field.getText(); + if (colonReplacement != null && colonReplacement.trim().length() > 0) { + map.put(option, colonReplacement); + } + } + + public void setOptions(Map inputOptions) { + if (inputOptions.containsKey(COLON_REPLACEMENT)) { + myColonReplacement.setText((String)inputOptions.get(COLON_REPLACEMENT)); + } + myInlineAttlistCheckBox.setSelected(inputOptions.get(INLINE_ATTLIST) == Boolean.TRUE); + + if (inputOptions.containsKey(ELEMENT_DEFINE)) { + myElementDefine.setText((String)inputOptions.get(ELEMENT_DEFINE)); + } + if (inputOptions.containsKey(ATTLIST_DEFINE)) { + myAttlistDefine.setText((String)inputOptions.get(ATTLIST_DEFINE)); + } + if (inputOptions.containsKey(ANY_NAME)) { + myAnyName.setText((String)inputOptions.get(ANY_NAME)); + } + myStrictAnyCheckBox.setSelected(inputOptions.get(STRICT_ANY) == Boolean.TRUE); + if (inputOptions.containsKey(ANNOTATION_PREFIX)) { + myAnnotationPrefix.setText((String)inputOptions.get(ANNOTATION_PREFIX)); + } + myGenerateStartCheckBox.setSelected(inputOptions.get(GENERATE_START) == Boolean.TRUE); + if (inputOptions.containsKey(XMLNS)) { + myDefaultNS.setText((String)inputOptions.get(XMLNS)); + } + + final NamespaceMapModel model = (NamespaceMapModel)myNamespaceMap.getModel(); + final Set set = inputOptions.keySet(); + final String prefix = XMLNS + ":"; + for (String s : set) { + if (s.startsWith(prefix)) { + model.addMapping(s.substring(prefix.length()), (String)inputOptions.get(s)); + } + } + } + + public static Map prepareNamespaceMap(Project project, VirtualFile firstFile) { + final PsiFile file = PsiManager.getInstance(project).findFile(firstFile); + if (file == null) { + return Collections.emptyMap(); + } + + final HashMap map = new LinkedHashMap(); + file.accept(new PsiRecursiveElementVisitor() { + public void visitElement(PsiElement element) { + if (element instanceof XmlElementDecl) { + final String s = ((XmlElementDecl)element).getName(); + if (s != null) { + final String[] parts = s.split(":"); + if (parts.length > 1) { + map.put(XMLNS + ":" + parts[0], null); + } + } + } else if (element instanceof XmlAttributeDecl) { + final String s = ((XmlAttributeDecl)element).getName(); + if (s != null) { + final String[] parts = s.split(":"); + if (parts.length > 1) { + map.put(XMLNS + ":" + parts[0], null); + } + } + } + super.visitElement(element); + } + }); + + return map; + } + + private static class NamespaceMapModel extends AbstractTableModel { + private final List myList = new ArrayList(); + + public String getColumnName(int column) { + return column == 0 ? "Prefix" : "URI"; + } + + public int getRowCount() { + return myList.size(); + } + + public int getColumnCount() { + return 2; + } + + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnIndex == 1; + } + + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + myList.get(rowIndex)[columnIndex] = (String)aValue; + } + + public Object getValueAt(int rowIndex, int columnIndex) { + return myList.get(rowIndex)[columnIndex]; + } + + public void addMapping(String prefix, String uri) { + myList.add(new String[]{ prefix, uri }); + fireTableRowsInserted(myList.size() - 1, myList.size() - 1); + } + + public void removeRow(int row) { + myList.remove(row); + fireTableRowsDeleted(row - 1, row - 1); + } + + public List getData() { + return myList; + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedOptions.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedOptions.java new file mode 100644 index 000000000000..d0984784c66e --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedOptions.java @@ -0,0 +1,33 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.convert; + +import javax.swing.*; +import java.util.Map; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 19.11.2007 +*/ +public interface AdvancedOptions { + JComponent getRoot(); + + Map getOptions(); + + void setOptions(Map options); +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedOptionsDialog.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedOptionsDialog.java new file mode 100644 index 000000000000..fdcbed8cada1 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedOptionsDialog.java @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.convert; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.Map; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 16.11.2007 +*/ +public class AdvancedOptionsDialog extends DialogWrapper { + private AdvancedOptions myInputOptions; + private AdvancedOptions myOutputOptions; + + private Map myInputOptions_; + private Map myOutputOptions_; + + protected AdvancedOptionsDialog(Project project, SchemaType inputType, SchemaType outputType) { + super(project, false); + setTitle("Advanced Conversion Options"); + + if (inputType == SchemaType.DTD) { + myInputOptions = new AdvancedDtdOptions(); + } + if (outputType == SchemaType.XSD) { + myOutputOptions = new AdvancedXsdOptions(); + } + + init(); + } + + @Nullable + protected JComponent createCenterPanel() { + JComponent root; + if (myInputOptions != null && myOutputOptions != null) { + root = new JTabbedPane(); + ((JTabbedPane)root).addTab("Input", myInputOptions.getRoot()); + ((JTabbedPane)root).addTab("Output", myOutputOptions.getRoot()); + } else if (myInputOptions != null) { + root = myInputOptions.getRoot(); + } else { + root = myOutputOptions.getRoot(); + } + return root; + } + + public Map getInputOptions() { + if (myInputOptions != null) { + return myInputOptions.getOptions(); + } else { + return myInputOptions_; + } + } + + public Map getOutputOptions() { + if (myOutputOptions != null) { + return myOutputOptions.getOptions(); + } else { + return myOutputOptions_; + } + } + + public void setOptions(Map inputOptions, Map outputOptions) { + if (myInputOptions != null) { + myInputOptions.setOptions(inputOptions); + } else { + myInputOptions_ = inputOptions; + } + if (myOutputOptions != null) { + myOutputOptions.setOptions(outputOptions); + } else { + myOutputOptions_ = outputOptions; + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedXsdOptions.form b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedXsdOptions.form new file mode 100644 index 000000000000..b01a9a9bee75 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedXsdOptions.form @@ -0,0 +1,71 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedXsdOptions.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedXsdOptions.java new file mode 100644 index 000000000000..d29c7b29098e --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/AdvancedXsdOptions.java @@ -0,0 +1,70 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.convert; + +import com.intellij.openapi.ui.ComboBox; +import org.jetbrains.annotations.NonNls; + +import javax.swing.*; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 18.11.2007 + */ +public class AdvancedXsdOptions implements AdvancedOptions { + @NonNls + private static final String DISABLE_ABSTRACT_ELEMENTS = "disable-abstract-elements"; + @NonNls + private static final String ANY_PROCESS_CONTENTS = "any-process-contents"; + @NonNls + private static final String ANY_ATTRIBUTE_PROCESS_CONTENTS = "any-attribute-process-contents"; + + private JComponent myRoot; + + private JCheckBox myDisableAbstractElements; + private ComboBox myAnyProcessContents; + private ComboBox myAnyAttributeProcessContents; + + public JComponent getRoot() { + return myRoot; + } + + public Map getOptions() { + final Map strings = new HashMap(); + if (myDisableAbstractElements.isSelected()) { + strings.put(DISABLE_ABSTRACT_ELEMENTS, Boolean.TRUE); + } + strings.put(ANY_PROCESS_CONTENTS, myAnyProcessContents.getSelectedItem()); + strings.put(ANY_ATTRIBUTE_PROCESS_CONTENTS, myAnyAttributeProcessContents.getSelectedItem()); + return strings; + } + + public void setOptions(Map inputOptions) { + myDisableAbstractElements.setSelected(inputOptions.get(DISABLE_ABSTRACT_ELEMENTS) == Boolean.TRUE); + final Object o = inputOptions.get(ANY_PROCESS_CONTENTS); + if (o != null) { + myAnyProcessContents.setSelectedItem(o); + } + final Object o2 = inputOptions.get(ANY_ATTRIBUTE_PROCESS_CONTENTS); + if (o2 != null) { + myAnyAttributeProcessContents.setSelectedItem(o2); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaAction.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaAction.java new file mode 100644 index 000000000000..cd0ec5aba48f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaAction.java @@ -0,0 +1,121 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.convert; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.xml.XmlDocument; +import com.intellij.psi.xml.XmlFile; +import com.intellij.psi.xml.XmlTag; +import org.intellij.plugins.relaxNG.ProjectLoader; +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.intellij.plugins.relaxNG.validation.ValidateAction; + +import java.io.File; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 16.11.2007 +*/ +public class ConvertSchemaAction extends AnAction { + + public void update(AnActionEvent e) { + final VirtualFile[] files = e.getData(PlatformDataKeys.VIRTUAL_FILE_ARRAY); + final Project project = e.getData(PlatformDataKeys.PROJECT); + if (files != null && project != null) { + final SchemaType type = getInputType(project, files); + e.getPresentation().setEnabled(type != null); + if (type == SchemaType.XML) { + e.getPresentation().setText("Generate Schema from XML file" + (files.length > 1 ? "s" : "") + "..."); + } else { + e.getPresentation().setText("Convert Schema..."); + } + } else { + e.getPresentation().setEnabled(false); + } + } + + private static SchemaType getInputType(Project project, VirtualFile... files) { + if (files.length == 0) return null; + + final VirtualFile file = files[0]; + final FileType type = file.getFileType(); + if (type == StdFileTypes.XML) { + final PsiFile psiFile = PsiManager.getInstance(project).findFile(file); + if (psiFile instanceof XmlFile) { + final XmlDocument document = ((XmlFile)psiFile).getDocument(); + if (document != null && document.getRootTag() != null) { + final XmlTag rootTag = document.getRootTag(); + assert rootTag != null; + final String uri = rootTag.getNamespace(); + if (ProjectLoader.RNG_NAMESPACE.equals(uri) && files.length == 1) { + return SchemaType.RNG; + } + } + } + if (files.length > 1) { + for (VirtualFile virtualFile : files) { + if (virtualFile.getFileType() != StdFileTypes.XML || getInputType(project, virtualFile) != null) { + return null; + } + } + } + return SchemaType.XML; + } else if (type == StdFileTypes.DTD && files.length == 1) { + return SchemaType.DTD; + } else if (type == RncFileType.getInstance() && files.length == 1) { + return SchemaType.RNC; + } + return null; + } + + public void actionPerformed(AnActionEvent e) { + final VirtualFile file = e.getData(PlatformDataKeys.VIRTUAL_FILE); + final Project project = e.getData(PlatformDataKeys.PROJECT); + if (file != null && project != null) { + final VirtualFile[] files = e.getData(PlatformDataKeys.VIRTUAL_FILE_ARRAY); + assert files != null; + + final SchemaType type = getInputType(project, files); + final ConvertSchemaDialog dialog = new ConvertSchemaDialog(project, type, file); + dialog.show(); + if (!dialog.isOK()) { + return; + } + + ValidateAction.saveFiles(files); + + final ConvertSchemaSettings settings = dialog.getSettings(); + final IdeaErrorHandler errorHandler = new IdeaErrorHandler(project); + new IdeaDriver(settings, project).convert(type, errorHandler, files); + + final VirtualFile output = LocalFileSystem.getInstance().findFileByIoFile(new File(settings.getOutputDestination())); + if (output != null) { + output.refresh(false, true); + } + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaDialog.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaDialog.java new file mode 100644 index 000000000000..d0f3fc41c666 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaDialog.java @@ -0,0 +1,86 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.convert; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 16.11.2007 +*/ +public class ConvertSchemaDialog extends DialogWrapper implements PropertyChangeListener { + private final ConvertSchemaSettingsImpl mySettings; + private final AbstractAction myAdvancedAction; + + protected ConvertSchemaDialog(Project project, SchemaType input, VirtualFile firstFile) { + super(project, false); + setTitle("Convert Schema File"); + + mySettings = new ConvertSchemaSettingsImpl(project, input, firstFile); + mySettings.addPropertyChangeListener(ConvertSchemaSettingsImpl.OUTPUT_TYPE, this); + mySettings.addPropertyChangeListener(ConvertSchemaSettingsImpl.OUTPUT_PATH, this); + + myAdvancedAction = new AbstractAction("Advanced...") { + public void actionPerformed(ActionEvent e) { + mySettings.showAdvancedSettings(); + } + }; + myAdvancedAction.setEnabled(mySettings.hasAdvancedSettings()); + + init(); + + getOKAction().setEnabled(mySettings.getOutputDestination().trim().length() > 0); + } + + @Override + protected Action[] createLeftSideActions() { + return new Action[]{ + myAdvancedAction + }; + } + + @Override + public JComponent getPreferredFocusedComponent() { + return mySettings.getPreferredFocusedComponent(); + } + + @Nullable + protected JComponent createCenterPanel() { + return mySettings.getRoot(); + } + + public ConvertSchemaSettings getSettings() { + return mySettings; + } + + public void propertyChange(PropertyChangeEvent evt) { + if (ConvertSchemaSettingsImpl.OUTPUT_TYPE.equals(evt.getPropertyName())) { + myAdvancedAction.setEnabled(mySettings.hasAdvancedSettings()); + } else if (ConvertSchemaSettingsImpl.OUTPUT_PATH.equals(evt.getPropertyName())) { + getOKAction().setEnabled(((String)evt.getNewValue()).trim().length() > 0); + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaSettings.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaSettings.java new file mode 100644 index 000000000000..e838698aed68 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaSettings.java @@ -0,0 +1,41 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.convert; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 17.11.2007 + */ +public interface ConvertSchemaSettings { + @NotNull + SchemaType getOutputType(); + + String getOutputEncoding(); + + int getIndent(); + + int getLineLength(); + + String getOutputDestination(); + + void addAdvancedSettings(List inputParams, List outputParams); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaSettingsImpl.form b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaSettingsImpl.form new file mode 100644 index 000000000000..591cced9907e --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaSettingsImpl.form @@ -0,0 +1,152 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaSettingsImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaSettingsImpl.java new file mode 100644 index 000000000000..ed0533583ff6 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/ConvertSchemaSettingsImpl.java @@ -0,0 +1,257 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.convert; + +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.ui.ComboBox; +import com.intellij.openapi.ui.TextFieldWithBrowseButton; +import com.intellij.openapi.vfs.CharsetToolkit; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.encoding.EncodingManager; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.ui.DocumentAdapter; +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.io.File; +import java.nio.charset.Charset; +import java.util.*; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 16.11.2007 +*/ +public class ConvertSchemaSettingsImpl implements ConvertSchemaSettings { + static final String OUTPUT_TYPE = "output-type"; + static final String OUTPUT_PATH = "output-path"; + + private final PropertyChangeSupport myPropertyChangeSupport = new PropertyChangeSupport(this); + private final Project myProject; + private final SchemaType myInputType; + + private Map myInputOptions = Collections.emptyMap(); + private Map myOutputOptions = Collections.emptyMap(); + + private JPanel myRoot; + + private JRadioButton myOutputRng; + private JRadioButton myOutputRnc; + private JRadioButton myOutputXsd; + private JRadioButton myOutputDtd; + + private ComboBox myEncoding; + + private JTextField myIndent; + private JTextField myLineLength; + + private TextFieldWithBrowseButton myOutputDestination; + + public ConvertSchemaSettingsImpl(Project project, @NotNull SchemaType inputType, VirtualFile firstFile) { + myProject = project; + myInputType = inputType; + + final FileType type; + switch (inputType) { + case RNG: + myOutputRng.setVisible(false); + myOutputXsd.setSelected(true); + type = StdFileTypes.XML; + break; + case RNC: + myOutputRnc.setVisible(false); + myOutputRng.setSelected(true); + type = RncFileType.getInstance(); + break; + case XSD: + myOutputXsd.setVisible(false); + myOutputRng.setSelected(true); + type = StdFileTypes.XML; + break; + case DTD: + myOutputDtd.setVisible(false); + myOutputRng.setSelected(true); + type = StdFileTypes.DTD; + break; + case XML: + myOutputRng.setSelected(true); + type = StdFileTypes.XML; + break; + default: + assert false; + type = null; + } + + final Charset[] charsets = CharsetToolkit.getAvailableCharsets(); + final List suggestions = new ArrayList(charsets.length); + for (Charset charset : charsets) { + if (charset.canEncode()) { + String name = charset.name(); + suggestions.add(name); + } + } + + myEncoding.setModel(new DefaultComboBoxModel(suggestions.toArray())); + final Charset charset = EncodingManager.getInstance().getDefaultCharset(); + if (charset == null) { + myEncoding.setSelectedItem(System.getProperty("file.encoding", "UTF-8")); + } else { + myEncoding.setSelectedItem(charset.name()); + } + + final CodeStyleSettings styleSettings = CodeStyleSettingsManager.getSettings(project); + final int indent = styleSettings.getIndentSize(type); + myIndent.setText(String.valueOf(indent)); + + myLineLength.setText(String.valueOf(styleSettings.RIGHT_MARGIN)); + final SchemaType outputType = getOutputType(); + myLineLength.setEnabled(outputType == SchemaType.DTD || outputType == SchemaType.RNC); + + final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, false, false, false, false); + final Module module = ProjectRootManager.getInstance(project).getFileIndex().getModuleForFile(firstFile); + descriptor.putUserData(LangDataKeys.MODULE_CONTEXT, module); + + myOutputDestination.addBrowseFolderListener("Schema Conversion Destination", + "Please select the destination the generated file(s) should be placed at", project, descriptor); + + final JTextField tf = myOutputDestination.getTextField(); + tf.getDocument().addDocumentListener(new DocumentAdapter() { + protected void textChanged(DocumentEvent e) { + myPropertyChangeSupport.firePropertyChange(OUTPUT_PATH, null, getOutputDestination()); + } + }); + tf.setText(firstFile.getParent().getPath().replace('/', File.separatorChar)); + + final ItemListener listener = new ItemListener() { + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange() == ItemEvent.SELECTED) { + final SchemaType type = getOutputType(); + myPropertyChangeSupport.firePropertyChange(OUTPUT_TYPE, null, type); + myLineLength.setEnabled(type == SchemaType.DTD || type == SchemaType.RNC); + } + } + }; + myOutputRng.addItemListener(listener); + myOutputRnc.addItemListener(listener); + myOutputXsd.addItemListener(listener); + myOutputDtd.addItemListener(listener); + + if (inputType == SchemaType.DTD) { + myInputOptions = AdvancedDtdOptions.prepareNamespaceMap(project, firstFile); + } + } + + @NotNull + public SchemaType getOutputType() { + if (myOutputRng.isSelected()) { + return SchemaType.RNG; + } else if (myOutputRnc.isSelected()) { + return SchemaType.RNC; + } else if (myOutputXsd.isSelected()) { + return SchemaType.XSD; + } else { + assert myOutputDtd.isSelected(); + return SchemaType.DTD; + } + } + + public String getOutputEncoding() { + return (String)myEncoding.getSelectedItem(); + } + + public int getIndent() { + return parseInt(myIndent.getText().trim()); + } + + private static int parseInt(String s) { + try { + return s.length() > 0 ? Integer.parseInt(s) : -1; + } catch (NumberFormatException e) { + return -1; + } + } + + public int getLineLength() { + return parseInt(myLineLength.getText()); + } + + public String getOutputDestination() { + return myOutputDestination.getText(); + } + + public void addAdvancedSettings(List inputParams, List outputParams) { + setParams(myInputOptions, inputParams); + + if (getOutputType() == SchemaType.XSD) { + setParams(myOutputOptions, outputParams); + } + } + + private static void setParams(Map map, List inputParams) { + final Set set = map.keySet(); + for (String s : set) { + final Object value = map.get(s); + if (value == Boolean.TRUE) { + inputParams.add(s); + } else if (value == Boolean.FALSE) { + inputParams.add("no-" + s); + } else if (value != null) { + inputParams.add(s + "=" + value); + } + } + } + + public JComponent getRoot() { + return myRoot; + } + + public JComponent getPreferredFocusedComponent() { + return myOutputDestination; + } + + public void addPropertyChangeListener(String name, PropertyChangeListener listener) { + myPropertyChangeSupport.addPropertyChangeListener(name, listener); + } + + public void showAdvancedSettings() { + final AdvancedOptionsDialog dialog = new AdvancedOptionsDialog(myProject, myInputType, getOutputType()); + dialog.setOptions(myInputOptions, myOutputOptions); + + dialog.show(); + if (dialog.isOK()) { + myInputOptions = dialog.getInputOptions(); + myOutputOptions = dialog.getOutputOptions(); + } + } + + public boolean hasAdvancedSettings() { + return getOutputType() == SchemaType.XSD || myInputType == SchemaType.DTD; + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/IdeaDriver.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/IdeaDriver.java new file mode 100644 index 000000000000..35b767289515 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/IdeaDriver.java @@ -0,0 +1,210 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.convert; + +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.vfs.VirtualFile; + +import com.thaiopensource.relaxng.edit.SchemaCollection; +import com.thaiopensource.relaxng.input.InputFailedException; +import com.thaiopensource.relaxng.input.InputFormat; +import com.thaiopensource.relaxng.input.MultiInputFormat; +import com.thaiopensource.relaxng.input.dtd.DtdInputFormat; +import com.thaiopensource.relaxng.input.parse.compact.CompactParseInputFormat; +import com.thaiopensource.relaxng.input.parse.sax.SAXParseInputFormat; +import com.thaiopensource.relaxng.input.xml.XmlInputFormat; +import com.thaiopensource.relaxng.output.LocalOutputDirectory; +import com.thaiopensource.relaxng.output.OutputDirectory; +import com.thaiopensource.relaxng.output.OutputFailedException; +import com.thaiopensource.relaxng.output.OutputFormat; +import com.thaiopensource.relaxng.output.dtd.DtdOutputFormat; +import com.thaiopensource.relaxng.output.rnc.RncOutputFormat; +import com.thaiopensource.relaxng.output.rng.RngOutputFormat; +import com.thaiopensource.relaxng.output.xsd.XsdOutputFormat; +import com.thaiopensource.relaxng.translate.util.InvalidParamsException; +import com.thaiopensource.util.UriOrFile; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.nio.charset.Charset; +import java.util.ArrayList; + +public class IdeaDriver { + + private static final int DEFAULT_LINE_LENGTH = 72; + private static final int DEFAULT_INDENT = 2; + + private final ConvertSchemaSettings settings; + private final Project myProject; + + public IdeaDriver(ConvertSchemaSettings settings, Project project) { + this.settings = settings; + myProject = project; + } + + @SuppressWarnings({ "ThrowableInstanceNeverThrown" }) + public void convert(SchemaType inputType, IdeaErrorHandler errorHandler, VirtualFile... inputFiles) { + if (inputFiles.length == 0) { + throw new IllegalArgumentException(); + } + + try { + final InputFormat inFormat = getInputFormat(inputType); + if (inputFiles.length > 1) { + if (!(inFormat instanceof MultiInputFormat)) { + throw new IllegalArgumentException(); + } + } + + final VirtualFile inputFile = inputFiles[0]; + final SchemaType type = settings.getOutputType(); + final String outputType = type.toString().toLowerCase(); + + final ArrayList inputParams = new ArrayList(); + + if (inputType != SchemaType.DTD) { + final Charset charset = inputFile.getCharset(); + if (charset != null) { + inputParams.add("encoding=" + charset.name()); + } + } + + final ArrayList outputParams = new ArrayList(); + settings.addAdvancedSettings(inputParams, outputParams); + +// System.out.println("INPUT: " + inputParams); +// System.out.println("OUTPUT: " + outputParams); + + final SchemaCollection sc; + final String input = inputFile.getPath(); + final String uri = UriOrFile.toUri(input); + try { + if (inFormat instanceof MultiInputFormat) { + final MultiInputFormat format = (MultiInputFormat)inFormat; + final String[] uris = new String[inputFiles.length]; + for (int i = 0; i < inputFiles.length; i++) { + uris[i] = UriOrFile.toUri(inputFiles[i].getPath()); + } + sc = format.load(uris, inputParams.toArray(new String[inputParams.size()]), outputType, errorHandler); + } else { + sc = inFormat.load(uri, inputParams.toArray(new String[inputParams.size()]), outputType, errorHandler); + } + } catch (IOException e) { + errorHandler.fatalError(new SAXParseException(e.getMessage(), null, uri, -1, -1, e)); + return; + } + + final File destination = new File(settings.getOutputDestination()); + final File outputFile; + if (destination.isDirectory()) { + final String name = new File(input).getName(); + final int ext = name.lastIndexOf('.'); + outputFile = new File(destination, (ext > 0 ? name.substring(0, ext) : name) + "." + outputType); + } else { + outputFile = destination; + } + + try { + final int indent = settings.getIndent(); + final int length = settings.getLineLength(); + final OutputDirectory od = new LocalOutputDirectory(sc.getMainUri(), + outputFile, + "." + outputType, + settings.getOutputEncoding(), + length > 0 ? length : DEFAULT_LINE_LENGTH, + indent > 0 ? indent : DEFAULT_INDENT) + { + public Stream open(String sourceUri, String encoding) throws IOException { + final String s = super.reference(null, sourceUri); + final File file = new File(outputFile.getParentFile(), s); + if (file.exists()) { + final String msg = "The file '" + file.getAbsolutePath() + "' already exists. Overwrite it?"; + final int choice = Messages.showYesNoDialog(myProject, msg, "Output File Exists", Messages.getWarningIcon()); + if (choice == 0) { + return super.open(sourceUri, encoding); + } else if (choice == 1) { + throw new CanceledException(); + } + } + return super.open(sourceUri, encoding); + } + }; + + final OutputFormat of = getOutputFormat(settings.getOutputType()); + + of.output(sc, od, outputParams.toArray(new String[outputParams.size()]), inputType.toString().toLowerCase(), errorHandler); + } catch (IOException e) { + errorHandler.fatalError(new SAXParseException(e.getMessage(), null, UriOrFile.fileToUri(outputFile), -1, -1, e)); + } + } catch (CanceledException e) { + // user abort + } catch (SAXParseException e) { + errorHandler.error(e); + } catch (MalformedURLException e) { + Logger.getInstance(getClass().getName()).error(e); + } catch (InputFailedException e) { + // handled by ErrorHandler + } catch (InvalidParamsException e) { + // handled by ErrorHandler + } catch (OutputFailedException e) { + // handled by ErrorHandler + } catch (SAXException e) { + // cannot happen or is already handled + } + } + + + private OutputFormat getOutputFormat(SchemaType outputType) { + switch (outputType) { + case DTD: + return new DtdOutputFormat(); + case RNC: + return new RncOutputFormat(); + case RNG: + return new RngOutputFormat(); + case XSD: + return new XsdOutputFormat(); + default: + assert false : "Unsupported output type: " + outputType; + return null; + } + } + + private InputFormat getInputFormat(SchemaType type) { + switch (type) { + case DTD: + return new DtdInputFormat(); + case RNC: + return new CompactParseInputFormat(); + case RNG: + return new SAXParseInputFormat(); + case XML: + return new XmlInputFormat(); + default: + assert false : "Unsupported input type: " + type; + return null; + } + } + + private static class CanceledException extends RuntimeException { + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/IdeaErrorHandler.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/IdeaErrorHandler.java new file mode 100644 index 000000000000..e0c212823802 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/IdeaErrorHandler.java @@ -0,0 +1,57 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.convert; + +import org.intellij.plugins.relaxNG.validation.MessageViewHelper; + +import com.intellij.ide.errorTreeView.NewErrorTreeViewPanel; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; + +import com.thaiopensource.xml.sax.ErrorHandlerImpl; +import org.xml.sax.SAXParseException; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 16.11.2007 +*/ +public class IdeaErrorHandler extends ErrorHandlerImpl { + private static final String CONTENT_NAME = "Convert Schema"; + private static final Key KEY = Key.create("CONVERSION_ERRORS"); + + private final MessageViewHelper myMessageViewHelper; + + public IdeaErrorHandler(Project project) { + myMessageViewHelper = new MessageViewHelper(project, CONTENT_NAME, KEY); + } + + @Override + public void warning(SAXParseException e) throws SAXParseException { + myMessageViewHelper.processError(e, true); + } + + @Override + public void error(SAXParseException e) { + myMessageViewHelper.processError(e, false); + } + + @Override + public void fatalError(SAXParseException e) throws SAXParseException { + myMessageViewHelper.processError(e, false); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/SchemaType.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/SchemaType.java new file mode 100644 index 000000000000..87cb8409c53a --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/convert/SchemaType.java @@ -0,0 +1,28 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.convert; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 17.11.2007 + */ +public enum SchemaType { + RNG, RNC, DTD, + XSD, // output only + XML // input only +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/inspections/BaseInspection.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/inspections/BaseInspection.java new file mode 100644 index 000000000000..653f4187e02c --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/inspections/BaseInspection.java @@ -0,0 +1,220 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.inspections; + +import org.intellij.plugins.relaxNG.compact.psi.*; + +import com.intellij.codeInspection.ProblemsHolder; +import com.intellij.codeInspection.SuppressIntentionAction; +import com.intellij.codeInspection.XmlSuppressableInspectionTool; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.vfs.ReadonlyStatusHandler; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 25.11.2007 + */ +public abstract class BaseInspection extends XmlSuppressableInspectionTool { + @Nls + @NotNull + public final String getGroupDisplayName() { + return getRngGroupDisplayName(); + } + + public static String getRngGroupDisplayName() { + return "RELAX NG"; + } + + @SuppressWarnings({ "SSBasedInspection" }) + @Override + public boolean isSuppressedFor(PsiElement element) { + if (element.getContainingFile() instanceof RncFile) { + final RncDefine define = PsiTreeUtil.getParentOfType(element, RncDefine.class, false); + if (define != null) { + if (isSuppressedAt(define)) return true; + } + + final RncGrammar grammar = PsiTreeUtil.getParentOfType(define, RncGrammar.class); + if (grammar != null) { + if (isSuppressedAt(grammar)) return true; + } + + return false; + } else { + return super.isSuppressedFor(element); + } + } + + @SuppressWarnings({ "SSBasedInspection" }) + private boolean isSuppressedAt(RncElement location) { + PsiElement prev = location.getPrevSibling(); + while (prev instanceof PsiWhiteSpace || prev instanceof PsiComment) { + if (prev instanceof PsiComment) { + @NonNls String text = prev.getText(); + if (text.matches("\n*#\\s*suppress\\s.+") && (text.contains(getID()) || "ALL".equals(text))) return true; + } + prev = prev.getPrevSibling(); + } + return false; + } + + @Override + @Nullable + public SuppressIntentionAction[] getSuppressActions(PsiElement element) { + if (element.getContainingFile() instanceof RncFile) { + return ArrayUtil.mergeArrays(new SuppressIntentionAction[]{ + new SuppressAction("Define") { + protected PsiElement getTarget(PsiElement element) { + return PsiTreeUtil.getParentOfType(element, RncDefine.class, false); + } + }, + new SuppressAction("Grammar") { + protected PsiElement getTarget(PsiElement element) { + final RncDefine define = PsiTreeUtil.getParentOfType(element, RncDefine.class, false); + return define != null ? PsiTreeUtil.getParentOfType(define, RncGrammar.class, false) : null; + } + + @SuppressWarnings({ "SSBasedInspection" }) + public boolean isAvailable(@NotNull Project project, Editor editor, @Nullable PsiElement element) { + return super.isAvailable(project, editor, element) && getTarget(element).getText().startsWith("grammar "); + } + } + }, getXmlOnlySuppressions(element), SuppressIntentionAction.class); + } else { + return super.getSuppressActions(element); + } + } + + private SuppressIntentionAction[] getXmlOnlySuppressions(PsiElement element) { + return ContainerUtil.map(super.getSuppressActions(element), new Function() { + public SuppressIntentionAction fun(final SuppressIntentionAction action) { + return new SuppressIntentionAction() { + public void invoke(Project project, Editor editor, PsiElement element) throws IncorrectOperationException { + action.invoke(project, editor, element); + } + + public boolean isAvailable(@NotNull Project project, Editor editor, @Nullable PsiElement element) { + return element != null && element.getContainingFile().getFileType() == StdFileTypes.XML && + action.isAvailable(project, editor, element); + } + + @NotNull + public String getText() { + return action.getText(); + } + + public boolean startInWriteAction() { + return action.startInWriteAction(); + } + + @NotNull + public String getFamilyName() { + return action.getFamilyName(); + } + }; + } + }, new SuppressIntentionAction[0]); + } + + private void suppress(PsiFile file, @NotNull PsiElement location) { + suppress(file, location, "#suppress " + getID(), new Function() { + public String fun(final String text) { + return text + ", " + getID(); + } + }); + } + + @SuppressWarnings({ "SSBasedInspection" }) + private static void suppress(PsiFile file, @NotNull PsiElement location, String suppressComment, Function replace) { + final Project project = file.getProject(); + final VirtualFile vfile = file.getVirtualFile(); + if (vfile == null || ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(vfile).hasReadonlyFiles()) { + return; + } + + final Document doc = PsiDocumentManager.getInstance(project).getDocument(file); + assert doc != null; + + PsiElement leaf = location.getPrevSibling(); + + while (leaf instanceof PsiWhiteSpace) leaf = leaf.getPrevSibling(); + + while (leaf instanceof PsiComment || leaf instanceof PsiWhiteSpace) { + @NonNls String text = leaf.getText(); + if (text.matches("\n*#\\s*suppress\\s.+")) { + final TextRange textRange = leaf.getTextRange(); + doc.replaceString(textRange.getStartOffset(), textRange.getEndOffset(), replace.fun(text)); + return; + } + leaf = leaf.getPrevSibling(); + } + + final int offset = location.getTextRange().getStartOffset(); + doc.insertString(offset, suppressComment + "\n"); + CodeStyleManager.getInstance(project).adjustLineIndent(doc, offset + suppressComment.length()); +// UndoManager.getInstance(file.getProject()).markDocumentForUndo(file); + } + + @Override + @NotNull + public abstract RncElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly); + + private abstract class SuppressAction extends SuppressIntentionAction { + private final String myLocation; + + public SuppressAction(String location) { + myLocation = location; + } + + @NotNull + public String getText() { + return "Suppress for " + myLocation; + } + + @NotNull + public String getFamilyName() { + return getDisplayName(); + } + + public void invoke(Project project, Editor editor, PsiElement element) throws IncorrectOperationException { + suppress(element.getContainingFile(), getTarget(element)); + } + + public boolean isAvailable(@NotNull Project project, Editor editor, @Nullable PsiElement element) { + return getTarget(element) != null; + } + + protected abstract PsiElement getTarget(PsiElement element); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/inspections/RngDomInspection.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/inspections/RngDomInspection.java new file mode 100644 index 000000000000..3b70b62bdefb --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/inspections/RngDomInspection.java @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.inspections; + +import org.intellij.plugins.relaxNG.xml.dom.RngDomElement; + +import com.intellij.codeHighlighting.HighlightDisplayLevel; +import com.intellij.util.xml.highlighting.BasicDomElementsInspection; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 03.10.2007 + */ +public class RngDomInspection extends BasicDomElementsInspection { + public RngDomInspection() { + super(RngDomElement.class); + } + + @NotNull + @Override + public HighlightDisplayLevel getDefaultLevel() { + return HighlightDisplayLevel.ERROR; + } + + @Override + public boolean isEnabledByDefault() { + return true; + } + + @Nls + @NotNull + public String getGroupDisplayName() { + return BaseInspection.getRngGroupDisplayName(); + } + + @Nls + @NotNull + public String getDisplayName() { + return "Unresolved References"; + } + + @NonNls + @NotNull + public String getShortName() { + return "UnresolvedReference"; + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/inspections/UnusedDefineInspection.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/inspections/UnusedDefineInspection.java new file mode 100644 index 000000000000..9a406e7a911b --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/inspections/UnusedDefineInspection.java @@ -0,0 +1,230 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.inspections; + +import org.intellij.plugins.relaxNG.ProjectLoader; +import org.intellij.plugins.relaxNG.compact.psi.RncDefine; +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; +import org.intellij.plugins.relaxNG.compact.psi.RncGrammar; +import org.intellij.plugins.relaxNG.compact.psi.impl.RncDefineImpl; +import org.intellij.plugins.relaxNG.model.resolve.RelaxIncludeIndex; +import org.intellij.plugins.relaxNG.xml.dom.RngGrammar; + +import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.codeInspection.ProblemHighlightType; +import com.intellij.codeInspection.ProblemsHolder; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiReference; +import com.intellij.psi.XmlElementVisitor; +import com.intellij.psi.search.LocalSearchScope; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.psi.xml.XmlFile; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.Query; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.DomManager; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 26.07.2007 + */ +public class UnusedDefineInspection extends BaseInspection { + public boolean isEnabledByDefault() { + return false; + } + + @Nls + @NotNull + public String getDisplayName() { + return "Unused Define"; + } + + @NonNls + @NotNull + public String getShortName() { + return "UnusedDefine"; + } + + @NotNull + public RncElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { + return new MyElementVisitor(holder); + } + + private static final class MyElementVisitor extends RncElementVisitor { + private final ProblemsHolder myHolder; + + private final XmlElementVisitor myXmlVisitor = new XmlElementVisitor() { + @Override + public void visitXmlTag(XmlTag tag) { + MyElementVisitor.this.visitXmlTag(tag); + } + }; + + public MyElementVisitor(ProblemsHolder holder) { + myHolder = holder; + } + + protected void superVisitElement(PsiElement element) { + element.accept(myXmlVisitor); + } + + @Override + public void visitDefine(RncDefine pattern) { + final RncGrammar grammar = PsiTreeUtil.getParentOfType(pattern, RncGrammar.class); + final PsiFile file = pattern.getContainingFile(); + if (grammar != null) { + if (processRncUsages(pattern, new LocalSearchScope(grammar))) return; + } else { + if (processRncUsages(pattern, new LocalSearchScope(file))) return; + } + + final PsiElementProcessor.CollectElements collector = new PsiElementProcessor.CollectElements(); + RelaxIncludeIndex.processBackwardDependencies((XmlFile)file, collector); + + if (processRncUsages(pattern, new LocalSearchScope(collector.toArray()))) return; + + final ASTNode astNode = ((RncDefineImpl)pattern).getNameNode(); + myHolder.registerProblem(astNode.getPsi(), "Unreferenced define", ProblemHighlightType.LIKE_UNUSED_SYMBOL, new MyFix(pattern)); + } + + private static boolean processRncUsages(PsiElement tag, LocalSearchScope scope) { + final Query query = ReferencesSearch.search(tag, scope); + for (PsiReference reference : query) { + final PsiElement e = reference.getElement(); + final RncDefine t = PsiTreeUtil.getParentOfType(e, RncDefine.class, false); + if (t == null || !PsiTreeUtil.isAncestor(tag, t, true)) { + return true; + } + } + return false; + } + + public void visitXmlTag(XmlTag tag) { + final PsiFile file = tag.getContainingFile(); + if (file.getFileType() != StdFileTypes.XML) { + return; + } + if (!tag.getLocalName().equals("define")) { + return; + } + if (!tag.getNamespace().equals(ProjectLoader.RNG_NAMESPACE)) { + return; + } + if (tag.getAttribute("combine") != null) { + return; // ? + } + + final XmlAttribute attr = tag.getAttribute("name"); + if (attr == null) return; + + final XmlAttributeValue value = attr.getValueElement(); + if (value == null) return; + + final String s = value.getValue(); + if (s == null || s.length() == 0) { + return; + } + final PsiElement parent = value.getParent(); + if (!(parent instanceof XmlAttribute)) { + return; + } + if (!"name".equals(((XmlAttribute)parent).getName())) { + return; + } + final PsiElement grandParent = parent.getParent(); + if (!(grandParent instanceof XmlTag)) { + return; + } + + final DomElement element = DomManager.getDomManager(tag.getProject()).getDomElement(tag); + if (element == null) { + return; + } + + final RngGrammar rngGrammar = element.getParentOfType(RngGrammar.class, true); + if (rngGrammar != null) { + if (processUsages(tag, value, new LocalSearchScope(rngGrammar.getXmlTag()))) return; + } else { + if (processUsages(tag, value, new LocalSearchScope(file))) return; + } + + final PsiElementProcessor.CollectElements collector = new PsiElementProcessor.CollectElements(); + RelaxIncludeIndex.processBackwardDependencies((XmlFile)file, collector); + + if (processUsages(tag, value, new LocalSearchScope(collector.toArray()))) return; + + myHolder.registerProblem(value, "Unreferenced define", ProblemHighlightType.LIKE_UNUSED_SYMBOL, new MyFix(tag)); + } + + private static boolean processUsages(PsiElement tag, XmlAttributeValue value, LocalSearchScope scope) { + final Query query = ReferencesSearch.search(tag, scope, true); + for (PsiReference reference : query) { + final PsiElement e = reference.getElement(); + if (e != value) { + final XmlTag t = PsiTreeUtil.getParentOfType(e, XmlTag.class); + if (t != null && !PsiTreeUtil.isAncestor(tag, t, true)) { + return true; + } + } + } + return false; + } + + private static class MyFix implements LocalQuickFix { + private final T myTag; + + public MyFix(T tag) { + myTag = tag; + } + + @NotNull + public String getName() { + return "Remove Define"; + } + + @NotNull + public String getFamilyName() { + return getName(); + } + + public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + try { + if (myTag.isValid()) { + myTag.delete(); + } + } catch (IncorrectOperationException e) { + Logger.getInstance(UnusedDefineInspection.class.getName()).error(e); + } + } + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/CommonElement.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/CommonElement.java new file mode 100644 index 000000000000..77f3b6eb3454 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/CommonElement.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model; + +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 17.09.2007 + */ +public interface CommonElement { + void accept(Visitor visitor); + + void acceptChildren(Visitor visitor); + + @Nullable + E getPsiElement(); + + static abstract class Visitor { + public void visitElement(CommonElement pattern) { + } + + public void visitPattern(Pattern pattern) { + visitElement(pattern); + } + + public void visitGrammar(Grammar pattern) { + visitElement(pattern); + } + + public void visitDefine(Define define) { + visitElement(define); + } + + public void visitRef(Ref ref) { + visitElement(ref); + } + + public void visitDiv(Div div) { + visitElement(div); + } + + public void visitInclude(Include inc) { + visitElement(inc); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Define.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Define.java new file mode 100644 index 000000000000..b0de26147382 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Define.java @@ -0,0 +1,34 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model; + +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 05.09.2007 + */ +public interface Define

extends Pattern { + String getName(); + + PsiElement getNameElement(); + + @Nullable + P getPattern(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Div.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Div.java new file mode 100644 index 000000000000..e35343e0d572 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Div.java @@ -0,0 +1,27 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model; + +import com.intellij.psi.PsiElement; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 17.09.2007 + */ +public interface Div extends CommonElement { +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Grammar.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Grammar.java new file mode 100644 index 000000000000..27a269729046 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Grammar.java @@ -0,0 +1,28 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model; + +import com.intellij.psi.PsiElement; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 24.08.2007 +*/ +public interface Grammar

extends Pattern { + P getStart(); +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Include.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Include.java new file mode 100644 index 000000000000..3437f8ade19f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Include.java @@ -0,0 +1,35 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 17.09.2007 + */ +public interface Include extends CommonElement { + @Nullable + PsiFile getInclude(); + + @NotNull + D[] getOverrides(); +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Pattern.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Pattern.java new file mode 100644 index 000000000000..e0f849872e69 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Pattern.java @@ -0,0 +1,28 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model; + +import com.intellij.psi.PsiElement; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 24.08.2007 +*/ +public interface Pattern extends CommonElement { + +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Ref.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Ref.java new file mode 100644 index 000000000000..5fcf674be6ee --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/Ref.java @@ -0,0 +1,33 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model; + +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 05.09.2007 + */ +public interface Ref extends Pattern { + @Nullable + D getPattern(); + + @Nullable + String getReferencedName(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/CommonAnnotationHolder.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/CommonAnnotationHolder.java new file mode 100644 index 000000000000..946bba15e01c --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/CommonAnnotationHolder.java @@ -0,0 +1,72 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.annotation; + +import com.intellij.lang.annotation.Annotation; +import com.intellij.lang.annotation.AnnotationHolder; +import com.intellij.lang.annotation.HighlightSeverity; +import com.intellij.psi.PsiElement; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.highlighting.DomElementAnnotationHolder; + +abstract class CommonAnnotationHolder { + public static CommonAnnotationHolder create(DomElementAnnotationHolder holder) { + return new DomHolderAdapter(holder); + } + + public static CommonAnnotationHolder create(AnnotationHolder holder) { + return new HolderAdapter(holder); + } + + public abstract Annotation createAnnotation(C element, HighlightSeverity severity, String message); + + private static class DomHolderAdapter extends CommonAnnotationHolder { + private final DomElementAnnotationHolder myHolder; + + DomHolderAdapter(DomElementAnnotationHolder holder) { + myHolder = holder; + } + + public Annotation createAnnotation(DomElement element, HighlightSeverity severity, String message) { + final Annotation annotation = myHolder.createAnnotation(element, severity, message); + annotation.setTooltip(message); // no tooltip by default?? + return annotation; + } + } + + private static class HolderAdapter extends CommonAnnotationHolder { + private final AnnotationHolder myHolder; + + HolderAdapter(AnnotationHolder holder) { + myHolder = holder; + } + + public Annotation createAnnotation(T element, HighlightSeverity severity, String message) { + if (severity == HighlightSeverity.ERROR) { + return myHolder.createErrorAnnotation(element, message); + } else if (severity == HighlightSeverity.WARNING) { + return myHolder.createWarningAnnotation(element, message); + } else if (severity == HighlightSeverity.INFO) { + return myHolder.createInformationAnnotation(element, message); + } else if (severity == HighlightSeverity.INFORMATION) { + return myHolder.createInfoAnnotation(element, message); + } else { + return myHolder.createInformationAnnotation(element, message); + } + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/ModelAnnotator.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/ModelAnnotator.java new file mode 100644 index 000000000000..f86f9c8e8aa8 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/ModelAnnotator.java @@ -0,0 +1,130 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.annotation; + +import org.intellij.plugins.relaxNG.model.CommonElement; +import org.intellij.plugins.relaxNG.model.Define; +import org.intellij.plugins.relaxNG.model.Grammar; +import org.intellij.plugins.relaxNG.model.Include; +import org.intellij.plugins.relaxNG.model.resolve.DefinitionResolver; +import org.intellij.plugins.relaxNG.model.resolve.GrammarFactory; +import org.intellij.plugins.relaxNG.model.resolve.RelaxIncludeIndex; +import org.intellij.plugins.relaxNG.xml.dom.RngDomElement; + +import com.intellij.lang.annotation.Annotation; +import com.intellij.lang.annotation.AnnotationHolder; +import com.intellij.lang.annotation.Annotator; +import com.intellij.lang.annotation.HighlightSeverity; +import com.intellij.openapi.editor.markup.GutterIconRenderer; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.SmartList; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.highlighting.DomElementAnnotationHolder; +import com.intellij.util.xml.highlighting.DomElementsAnnotator; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 04.12.2007 +*/ +public final class ModelAnnotator implements Annotator, DomElementsAnnotator { + + public void annotate(@NotNull PsiElement psiElement, @NotNull AnnotationHolder holder) { + if (psiElement instanceof CommonElement) { + ((CommonElement)psiElement).accept(new MyAnnotator(CommonAnnotationHolder.create(holder))); + } + } + + public void annotate(DomElement element, DomElementAnnotationHolder holder) { + if (element instanceof RngDomElement) { + ((RngDomElement)element).accept(new MyAnnotator(CommonAnnotationHolder.create(holder))); + } + } + + private final class MyAnnotator extends CommonElement.Visitor { + private final CommonAnnotationHolder myHolder; + + public MyAnnotator(CommonAnnotationHolder holder) { + myHolder = holder; + } + + public void visitDefine(final Define define) { + final PsiElement element = define.getPsiElement(); + if (element != null) { + final XmlFile xmlFile = (XmlFile)element.getContainingFile(); + + final List result = new SmartList(); + final OverriddenDefineSearcher searcher = new OverriddenDefineSearcher(define, xmlFile, result); + + final PsiElementProcessor.FindElement processor = new PsiElementProcessor.FindElement() { + public boolean execute(XmlFile file) { + final Grammar grammar = GrammarFactory.getGrammar(file); + if (grammar == null) return true; + + grammar.acceptChildren(searcher); + + return result.size() == 0 || super.execute(file); + } + }; + + RelaxIncludeIndex.processBackwardDependencies(xmlFile, processor); + + if (processor.isFound()) { + createGutterAnnotation(define, new OverriddenDefineRenderer(define)); + } + } + } + + @SuppressWarnings({ "unchecked" }) + private void createGutterAnnotation(CommonElement t, GutterIconRenderer renderer) { + final Annotation a = myHolder.createAnnotation((T)t, HighlightSeverity.INFORMATION, null); + a.setGutterIconRenderer(renderer); + } + + public void visitInclude(Include inc) { + final Define[] overrides = inc.getOverrides(); + for (Define define : overrides) { + final PsiFile file = inc.getInclude(); + if (!(file instanceof XmlFile)) continue; // + + final Grammar grammar = GrammarFactory.getGrammar((XmlFile)file); + if (grammar == null) continue; + + final Map> map = DefinitionResolver.getAllVariants(grammar); + if (map == null) continue; + + final Set set = map.get(define.getName()); + if (set == null || set.size() == 0) { + //noinspection unchecked + myHolder.createAnnotation((T)define, HighlightSeverity.ERROR, "Definition doesn't override anything from " + file.getName()); + continue; + } + + final String message = "Overrides '" + define.getName() + "' in " + file.getName(); + createGutterAnnotation(define, new OverridingDefineRenderer(message, set)); + } + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/OverriddenDefineRenderer.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/OverriddenDefineRenderer.java new file mode 100644 index 000000000000..f9546da7b9c7 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/OverriddenDefineRenderer.java @@ -0,0 +1,88 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.annotation; + +import org.intellij.plugins.relaxNG.model.Define; +import org.intellij.plugins.relaxNG.model.Grammar; +import org.intellij.plugins.relaxNG.model.resolve.GrammarFactory; +import org.intellij.plugins.relaxNG.model.resolve.RelaxIncludeIndex; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.editor.markup.GutterIconRenderer; +import com.intellij.openapi.util.IconLoader; +import com.intellij.psi.PsiElement; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.SmartList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.Collection; +import java.util.List; + +class OverriddenDefineRenderer extends GutterIconRenderer { + private static final Icon ICON = IconLoader.getIcon("/gutter/overridenMethod.png"); + + private final Define myDefine; + + public OverriddenDefineRenderer(Define define) { + myDefine = define; + } + + @NotNull + public Icon getIcon() { + return ICON; + } + + @Nullable + public AnAction getClickAction() { + return new AnAction() { + public void actionPerformed(AnActionEvent e) { + final PsiElement element = myDefine.getPsiElement(); + if (element == null || !element.isValid()) return; + + final PsiElementProcessor.CollectElements collector = new PsiElementProcessor.CollectElements(); + final XmlFile localFile = (XmlFile)element.getContainingFile(); + RelaxIncludeIndex.processBackwardDependencies(localFile, collector); + final Collection files = collector.getCollection(); + + final List result = new SmartList(); + final OverriddenDefineSearcher searcher = new OverriddenDefineSearcher(myDefine, localFile, result); + for (XmlFile file : files) { + final Grammar grammar = GrammarFactory.getGrammar(file); + if (grammar == null) continue; + grammar.acceptChildren(searcher); + } + + if (result.size() > 0) { + OverridingDefineRenderer.doClickAction(e, result, "Go to overriding define(s)"); + } + } + }; + } + + public boolean isNavigateAction() { + return true; + } + + @Nullable + public String getTooltipText() { + return "Is overridden"; + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/OverriddenDefineSearcher.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/OverriddenDefineSearcher.java new file mode 100644 index 000000000000..fc14f258cf36 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/OverriddenDefineSearcher.java @@ -0,0 +1,55 @@ +package org.intellij.plugins.relaxNG.model.annotation; + +import org.intellij.plugins.relaxNG.model.*; + +import com.intellij.psi.xml.XmlFile; + +import gnu.trove.TIntArrayList; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 04.12.2007 +* Time: 18:41:39 +* To change this template use File | Settings | File Templates. +*/ +class OverriddenDefineSearcher extends CommonElement.Visitor { + private final Define myDefine; + private final TIntArrayList myIncludes = new TIntArrayList(); + private final XmlFile myLocalFile; + private final List myResult; + + public OverriddenDefineSearcher(Define define, XmlFile localFile, List result) { + myLocalFile = localFile; + myResult = result; + myDefine = define; + } + + public void visitInclude(Include inc) { + myIncludes.add(inc.getInclude() == myLocalFile ? 1 : 0); + try { + inc.acceptChildren(this); + } finally { + myIncludes.remove(myIncludes.size() - 1); + } + } + + public void visitDiv(Div ref) { + ref.acceptChildren(this); + } + + public void visitDefine(Define d) { + if (myIncludes.size() > 0 && myIncludes.get(myIncludes.size() - 1) == 1) { + if (d.getName().equals(myDefine.getName())) { + myResult.add(d); + } + } + d.acceptChildren(this); + } + + public void visitGrammar(Grammar pattern) { + pattern.acceptChildren(this); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/OverridingDefineRenderer.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/OverridingDefineRenderer.java new file mode 100644 index 000000000000..06cdf0c11c92 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/annotation/OverridingDefineRenderer.java @@ -0,0 +1,89 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.annotation; + +import org.intellij.plugins.relaxNG.model.Define; + +import com.intellij.codeInsight.navigation.NavigationUtil; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.editor.markup.GutterIconRenderer; +import com.intellij.openapi.util.IconLoader; +import com.intellij.pom.Navigatable; +import com.intellij.psi.PsiElement; +import com.intellij.ui.awt.RelativePoint; +import com.intellij.util.Function; +import com.intellij.util.OpenSourceUtil; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.awt.event.MouseEvent; +import java.util.Collection; +import java.util.Set; + +class OverridingDefineRenderer extends GutterIconRenderer { + private static final Icon ICON = IconLoader.getIcon("/gutter/overridingMethod.png"); + + private final Set mySet; + private final String myMessage; + + public OverridingDefineRenderer(String message, Set set) { + mySet = set; + myMessage = message; + } + + @NotNull + public Icon getIcon() { + return ICON; + } + + public boolean isNavigateAction() { + return true; + } + + @Nullable + public AnAction getClickAction() { + return new MyClickAction(); + } + + @Nullable + public String getTooltipText() { + return myMessage; + } + + private class MyClickAction extends AnAction { + public void actionPerformed(AnActionEvent e) { + doClickAction(e, mySet, "Go to overridden define"); + } + } + + static void doClickAction(AnActionEvent e, Collection set, String title) { + if (set.size() == 1) { + final Navigatable n = (Navigatable)set.iterator().next().getPsiElement(); + OpenSourceUtil.navigate(true, n); + } else { + final Define[] array = set.toArray(new Define[set.size()]); + NavigationUtil.getPsiElementPopup(ContainerUtil.map(array, new Function() { + public PsiElement fun(Define define) { + return define.getPsiElement(); + } + }, PsiElement.EMPTY_ARRAY), title).show(new RelativePoint((MouseEvent)e.getInputEvent())); + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/AttributeFinder.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/AttributeFinder.java new file mode 100644 index 000000000000..95547f0bbedd --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/AttributeFinder.java @@ -0,0 +1,126 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.descriptors; + +import com.intellij.openapi.util.Pair; + +import gnu.trove.THashMap; +import org.kohsuke.rngom.digested.*; + +import javax.xml.namespace.QName; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 30.07.2007 +*/ +class AttributeFinder extends RecursionSaveWalker { + private int depth; + private int optional; + private final QName myQname; + private final Map, Boolean>> myAttributes = + new THashMap, Boolean>>(); + private DAttributePattern myLastAttr; + + private AttributeFinder() { + myQname = null; + optional++; // everything will be optional + } + + private AttributeFinder(QName qname) { + myQname = qname; + } + + public Void onElement(DElementPattern p) { + depth++; + try { + myLastAttr = null; + if (depth < 2) { + return super.onElement(p); + } + return null; + } finally { + depth--; + } + } + + public Void onAttribute(DAttributePattern p) { + assert depth > 0; + + if (depth == 1 && (myQname == null || p.getName().contains(myQname))) { + myLastAttr = p; + myAttributes.put(p, Pair.create(new LinkedHashMap(), optional > 0)); + return super.onAttribute(p); + } + return null; + } + + public Void onValue(DValuePattern p) { + if (myLastAttr != null) { + myAttributes.get(myLastAttr).first.put(p.getValue(), p.getType()); + } + return super.onValue(p); + } + + public Void onOptional(DOptionalPattern p) { + optional++; + try { + return super.onOptional(p); + } finally { + optional--; + } + } + + public Void onZeroOrMore(DZeroOrMorePattern p) { + optional++; + try { + return super.onZeroOrMore(p); + } finally { + optional--; + } + } + + public Void onChoice(DChoicePattern p) { + optional++; + try { + return super.onChoice(p); + } finally { + optional--; + } + } + + public Void onData(DDataPattern p) { + if (depth == 1 && myLastAttr != null) { + myAttributes.get(myLastAttr).first.put(null, p.getType()); + } + return null; + } + + public static Map, Boolean>> find(QName qname, DPattern... patterns) { + final AttributeFinder finder = new AttributeFinder(qname); + finder.doAccept(patterns); + return finder.myAttributes; + } + + public static Map, Boolean>> find(DPattern... patterns) { + final AttributeFinder finder = new AttributeFinder(); + finder.doAccept(patterns); + return finder.myAttributes; + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/ChildElementFinder.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/ChildElementFinder.java new file mode 100644 index 000000000000..4e00ae32533b --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/ChildElementFinder.java @@ -0,0 +1,72 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.descriptors; + +import org.kohsuke.rngom.digested.DAttributePattern; +import org.kohsuke.rngom.digested.DElementPattern; +import org.kohsuke.rngom.digested.DPattern; +import org.kohsuke.rngom.digested.DRefPattern; + +import java.util.ArrayList; +import java.util.List; + +class ChildElementFinder extends RecursionSaveWalker { + private final List myRoots = new ArrayList(); + + private final int myTargetDepth; + private int myDepth; + + private ChildElementFinder(int targetDepth) { + myTargetDepth = targetDepth; + } + + public Void onRef(DRefPattern p) { + if (myDepth < myTargetDepth) { + return super.onRef(p); + } + return null; + } + + public Void onElement(DElementPattern p) { + myDepth++; + try { + if (myDepth == myTargetDepth) { + myRoots.add(p); + return null; + } else { + return super.onElement(p); + } + } finally { + myDepth--; + } + } + + @Override + public Void onAttribute(DAttributePattern p) { + return null; + } + + static List find(int targetDepth, DPattern p) { + final ChildElementFinder finder = new ChildElementFinder(targetDepth); + finder.doAccept(p); + return finder.myRoots; + } + + static List find(DPattern p) { + return find(1, p); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/CompositeDescriptor.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/CompositeDescriptor.java new file mode 100644 index 000000000000..05ab021bf593 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/CompositeDescriptor.java @@ -0,0 +1,119 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.descriptors; + +import com.intellij.openapi.util.Condition; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.xml.XmlAttributeDescriptor; +import com.intellij.xml.XmlElementDescriptor; +import org.jetbrains.annotations.Nullable; + +import org.kohsuke.rngom.digested.DElementPattern; +import org.kohsuke.rngom.digested.DPattern; + +import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class CompositeDescriptor extends RngElementDescriptor { + private final DElementPattern[] myPatterns; + + CompositeDescriptor(RngNsDescriptor nsDescriptor, DElementPattern pattern, List patterns) { + super(nsDescriptor, pattern); + myPatterns = patterns.toArray(new DElementPattern[patterns.size()]); + } + + protected XmlElementDescriptor findElementDescriptor(XmlTag childTag) { + final List patterns = new ArrayList(); + for (DElementPattern pattern : myPatterns) { + patterns.addAll(ChildElementFinder.find(2, pattern)); + } + // TODO: filter out impossible variants: + /* + while this needs both variants of -children + + + this does not, because inside is unambiguous: + + */ + final XmlElementDescriptor d = myNsDescriptor.findDescriptor(childTag, patterns); + if (d != null) { + return d; + } + return NULL; + } + + public XmlElementDescriptor[] getElementsDescriptors(XmlTag context) { + final List descriptors = new ArrayList(Arrays.asList(super.getElementsDescriptors(context))); + for (DElementPattern pattern : myPatterns) { + final List list = ContainerUtil.findAll(ChildElementFinder.find(2, pattern), NamedPatternFilter.INSTANCE); + descriptors.addAll(Arrays.asList(RngNsDescriptor.convertElementDescriptors(list, myNsDescriptor))); + } + return descriptors.toArray(new XmlElementDescriptor[descriptors.size()]); + } + + protected XmlAttributeDescriptor getAttributeDescriptor(String namespace, String localName) { + final QName qname = new QName(namespace, localName); + + return computeAttributeDescriptor(AttributeFinder.find(qname, myPatterns)); + } + + protected XmlAttributeDescriptor[] collectAttributeDescriptors(@Nullable XmlTag context) { + + final QName qName = context == null ? + null : + new QName(context.getNamespace(), context.getLocalName()); + + final DPattern[] patterns; + if (qName == null) { + patterns = myPatterns; + } else { + final List p = ContainerUtil.findAll(myPatterns, new Condition() { + public boolean value(DElementPattern pattern) { + return pattern.getName().contains(qName); + } + }); + patterns = p.toArray(new DPattern[p.size()]); + } + + return computeAttributeDescriptors(AttributeFinder.find(patterns)); + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + + final CompositeDescriptor that = (CompositeDescriptor)o; + + if (!Arrays.equals(myPatterns, that.myPatterns)) return false; + + return true; + } + + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + Arrays.hashCode(myPatterns); + return result; + } + + public DElementPattern[] getElementPatterns() { + return myPatterns; + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/NamedPatternFilter.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/NamedPatternFilter.java new file mode 100644 index 000000000000..b896acbc1676 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/NamedPatternFilter.java @@ -0,0 +1,29 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.descriptors; + +import com.intellij.openapi.util.Condition; + +import org.kohsuke.rngom.digested.DXmlTokenPattern; + +final class NamedPatternFilter implements Condition { + public static final NamedPatternFilter INSTANCE = new NamedPatternFilter(); + + public boolean value(DXmlTokenPattern pattern) { + return pattern.getName().listNames().size() > 0; + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RecursionSaveWalker.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RecursionSaveWalker.java new file mode 100644 index 000000000000..efaaef113c1b --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RecursionSaveWalker.java @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.descriptors; + +import com.intellij.util.SpinAllocator; + +import gnu.trove.THashSet; +import gnu.trove.TObjectHashingStrategy; +import org.kohsuke.rngom.digested.*; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 19.07.2007 +*/ +public class RecursionSaveWalker extends DPatternWalker { + private THashSet myVisited; + + protected RecursionSaveWalker() { + } + + @Override + public Void onGrammar(DGrammarPattern p) { + try { + return super.onGrammar(p); + } catch (NullPointerException e) { + return null; // missing start pattern + } + } + + public Void onRef(DRefPattern p) { + if (myVisited.add(p)) { + try { + return super.onRef(p); + } catch (NullPointerException e) { + return null; // unresolved ref + } + } + return null; + } + + protected Void onUnary(DUnaryPattern p) { + try { + return super.onUnary(p); + } catch (NullPointerException e) { + return null; // empty element + } + } + + protected void doAccept(DPattern... p) { + myVisited = ourAllocator.alloc(); + try { + //noinspection ForLoopReplaceableByForEach + for (int i = 0; i < p.length; i++) { + p[i].accept(this); + } + } finally { + ourAllocator.dispose(myVisited); + } + } + + private static final SpinAllocator> ourAllocator = new SpinAllocator>( + new SpinAllocator.ICreator>() { + @SuppressWarnings({ "unchecked" }) + public THashSet createInstance() { + return new THashSet(64, TObjectHashingStrategy.IDENTITY) { + public void clear() { + if (size() == 0) return; + super.clear(); + final int c = capacity(); + if (c > 64) { + super.compact(); + } + } + }; + } + }, + new SpinAllocator.IDisposer>() { + public void disposeInstance(THashSet instance) { + instance.clear(); + } + }); +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngElementDescriptor.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngElementDescriptor.java new file mode 100644 index 000000000000..897cebebf746 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngElementDescriptor.java @@ -0,0 +1,360 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.descriptors; + +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.intellij.plugins.relaxNG.validation.RngSchemaValidator; + +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.*; +import com.intellij.psi.util.*; +import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.xml.XmlAttributeDescriptor; +import com.intellij.xml.XmlElementDescriptor; +import com.intellij.xml.XmlNSDescriptor; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; + +import org.kohsuke.rngom.digested.*; +import org.kohsuke.rngom.nc.NameClass; +import org.kohsuke.rngom.nc.NameClassVisitor; +import org.xml.sax.Locator; + +import javax.xml.namespace.QName; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class RngElementDescriptor implements XmlElementDescriptor { + private static final Key> DESCR_KEY = Key.create("DESCR"); + private static final Key> ATTRS_KEY = Key.create("ATTRS"); + + protected static final XmlElementDescriptor NULL = null; + + private final DElementPattern myElementPattern; + protected final RngNsDescriptor myNsDescriptor; + + private volatile SmartPsiElementPointer myDeclaration; + + RngElementDescriptor(RngNsDescriptor nsDescriptor, DElementPattern pattern) { + myNsDescriptor = nsDescriptor; + myElementPattern = pattern; + } + + public String getQualifiedName() { + final QName qName = getQName(); + return qName != null ? format(qName, "") : "#unknown"; + } + + public String getDefaultName() { + return getName(); + } + + public XmlElementDescriptor[] getElementsDescriptors(XmlTag context) { + if (context == null) { + return EMPTY_ARRAY; + } + + // TODO: Not sure why this is needed. IDEA sometimes asks us for descriptors with a context that doesn't match our + // element pattern. At least at namespace boundaries... + final DElementPattern pattern; + final XmlElementDescriptor descriptor = myNsDescriptor.getElementDescriptor(context); + if (descriptor instanceof RngElementDescriptor) { + final DElementPattern p = ((RngElementDescriptor)descriptor).myElementPattern; + pattern = p != null ? p : myElementPattern; + } else { + pattern = myElementPattern; + } + + final List patterns = ChildElementFinder.find(2, pattern); + final List list = ContainerUtil.findAll(patterns, NamedPatternFilter.INSTANCE); + return RngNsDescriptor.convertElementDescriptors(list, myNsDescriptor); + } + + protected XmlElementDescriptor findElementDescriptor(XmlTag childTag) { + final List patterns = ChildElementFinder.find(2, myElementPattern); + final XmlElementDescriptor d = myNsDescriptor.findDescriptor(childTag, patterns); + return d == null ? NULL : d; + } + + public final XmlElementDescriptor getElementDescriptor(final XmlTag childTag) { + return getElementDescriptor(childTag, null); + } + + public final XmlElementDescriptor getElementDescriptor(final XmlTag childTag, XmlTag contextTag) { + final XmlElementDescriptor value = getCachedValue(childTag, this, DESCR_KEY, new ParameterizedCachedValueProvider() { + public CachedValueProvider.Result compute(RngElementDescriptor p) { + final XmlElementDescriptor descriptor = p.findElementDescriptor(childTag); + return CachedValueProvider.Result.create(descriptor, p.getDependences(), childTag); + } + }); + return value == NULL ? null : value; + } + + public final XmlAttributeDescriptor[] getAttributesDescriptors(@Nullable final XmlTag context) { + if (context != null) { + return getCachedValue(context, this, ATTRS_KEY, new ParameterizedCachedValueProvider() { + public CachedValueProvider.Result compute(RngElementDescriptor p) { + final XmlAttributeDescriptor[] value = p.collectAttributeDescriptors(context); + return CachedValueProvider.Result.create(value, p.getDependences(), context); + } + }); + } else { + return collectAttributeDescriptors(null); + } + } + + private static T getCachedValue(D context, P p, Key> key, ParameterizedCachedValueProvider provider) { + final CachedValuesManager mgr = context.getManager().getCachedValuesManager(); + return mgr.getParameterizedCachedValue(context, key, provider, false, p); + } + + protected XmlAttributeDescriptor[] collectAttributeDescriptors(@Nullable XmlTag context) { + return computeAttributeDescriptors(AttributeFinder.find((QName)null, myElementPattern)); + } + + protected XmlAttributeDescriptor[] computeAttributeDescriptors(final Map, Boolean>> map) { + final List list = ContainerUtil.findAll(map.keySet(), NamedPatternFilter.INSTANCE); + return ContainerUtil.map2Array(list, XmlAttributeDescriptor.class, new Function() { + public XmlAttributeDescriptor fun(DAttributePattern dAttributePattern) { + final Pair, Boolean> pair = map.get(dAttributePattern); + return new RngXmlAttributeDescriptor(RngElementDescriptor.this, dAttributePattern, pair.first, pair.second); + } + }); + } + + public final XmlAttributeDescriptor getAttributeDescriptor(String attributeName, @Nullable XmlTag context) { + return getAttributeDescriptor("", attributeName); + } + + public final XmlAttributeDescriptor getAttributeDescriptor(XmlAttribute attribute) { + return getAttributeDescriptor(attribute.getNamespace(), attribute.getLocalName()); + } + + protected XmlAttributeDescriptor getAttributeDescriptor(String namespace, String localName) { + final QName qname = new QName(namespace, localName); + + return computeAttributeDescriptor(AttributeFinder.find(qname, myElementPattern)); + } + + protected XmlAttributeDescriptor computeAttributeDescriptor(final Map, Boolean>> attributes) { + if (attributes.size() > 0) { + RngXmlAttributeDescriptor d = null; + final Set patterns = attributes.keySet(); + for (DAttributePattern pattern : patterns) { + final Pair, Boolean> pair = attributes.get(pattern); + final RngXmlAttributeDescriptor a = + new RngXmlAttributeDescriptor(this, pattern, pair.first, pair.second); + if (d == null) { + d = a; + } else { + d = d.mergeWith(a); + } + } + return d; + } else { + return null; + } + } + + public XmlNSDescriptor getNSDescriptor() { + return myNsDescriptor; + } + + // is this actually used anywhere? + public int getContentType() { + final DPattern child = myElementPattern.getChild(); + if (child instanceof DEmptyPattern) { + return CONTENT_TYPE_EMPTY; + } else if (child instanceof DTextPattern) { + return CONTENT_TYPE_MIXED; + } else if (child instanceof DElementPattern) { + return ((DElementPattern)child).getName().accept(MyNameClassVisitor.INSTANCE); + } else { + return CONTENT_TYPE_CHILDREN; + } + } + + public PsiElement getDeclaration() { + if (myDeclaration != null) { + final PsiElement element = myDeclaration.getElement(); + if (element != null && element.isValid()) { + return element; + } + } + + final PsiElement decl = myNsDescriptor.getDeclaration(); + if (decl == null/* || !decl.isValid()*/) { + myDeclaration = null; + System.out.println("decl is null"); + return null; + } + + final PsiElement element = getDeclarationImpl(decl, myElementPattern.getLocation()); + if (element != null && element != decl) { + myDeclaration = SmartPointerManager.getInstance(decl.getProject()).createSmartPsiElementPointer(element); + } + return element; + } + + public PsiElement getDeclaration(Locator location) { + final PsiElement element = myNsDescriptor.getDeclaration(); + if (element == null) { + return null; + } + return getDeclarationImpl(element, location); + } + + private PsiElement getDeclarationImpl(PsiElement decl, Locator location) { + final VirtualFile virtualFile = RngSchemaValidator.findVirtualFile(location.getSystemId()); + if (virtualFile == null) { + return decl; + } + + final Project project = decl.getProject(); + final PsiFile file = PsiManager.getInstance(project).findFile(virtualFile); + if (file == null) { + return decl; + } + + final int column = location.getColumnNumber(); + final int line = location.getLineNumber(); + + final Document document = PsiDocumentManager.getInstance(project).getDocument(file); + assert document != null; + + final int startOffset = document.getLineStartOffset(line - 1); + + final PsiElement at; + if (column > 0) { + if (decl.getContainingFile().getFileType() == RncFileType.getInstance()) { + return file.findElementAt(startOffset + column); + } + at = file.findElementAt(startOffset + column - 2); + } else { + at = PsiTreeUtil.nextLeaf(file.findElementAt(startOffset)); + } + + return PsiTreeUtil.getParentOfType(at, XmlTag.class); + } + + @NonNls + public String getName(PsiElement context) { + final QName qName = getQName(); + if (qName == null) { + return "#unknown"; + } + final XmlTag xmlTag = PsiTreeUtil.getParentOfType(context, XmlTag.class, false); + final String prefix = xmlTag != null ? xmlTag.getPrefixByNamespace(qName.getNamespaceURI()) : null; + return format(qName, prefix != null ? prefix : qName.getPrefix()); + } + + @NonNls + public String getName() { + final QName qName = getQName(); + if (qName == null) { + return "#unknown"; + } + return qName.getLocalPart(); + } + + private static String format(QName qName, String p) { + final String localPart = qName.getLocalPart(); + return p.length() > 0 ? p + ":" + localPart : localPart; + } + + @Nullable + private QName getQName() { + final Iterator iterator = myElementPattern.getName().listNames().iterator(); + if (!iterator.hasNext()) { + return null; + } + return iterator.next(); + } + + public void init(PsiElement element) { + + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final RngElementDescriptor that = (RngElementDescriptor)o; + + if (!myElementPattern.equals(that.myElementPattern)) return false; + + return true; + } + + public int hashCode() { + return myElementPattern.hashCode(); + } + + public Object[] getDependences() { + if (myDeclaration != null) { + return ArrayUtil.append(myNsDescriptor.getDependences(), myDeclaration.getElement()); + } else { + return myNsDescriptor.getDependences(); + } + } + + private static class MyNameClassVisitor implements NameClassVisitor { + public static final MyNameClassVisitor INSTANCE = new MyNameClassVisitor(); + + public Integer visitAnyName() { + return CONTENT_TYPE_ANY; + } + + public Integer visitAnyNameExcept(NameClass nc) { + return CONTENT_TYPE_ANY; + } + + public Integer visitChoice(NameClass nc1, NameClass nc2) { + return CONTENT_TYPE_CHILDREN; + } + + public Integer visitName(QName name) { + return CONTENT_TYPE_CHILDREN; + } + + public Integer visitNsName(String ns) { + return CONTENT_TYPE_CHILDREN; + } + + public Integer visitNsNameExcept(String ns, NameClass nc) { + return CONTENT_TYPE_CHILDREN; + } + + public Integer visitNull() { + return CONTENT_TYPE_EMPTY; + } + } + + public DElementPattern getElementPattern() { + return myElementPattern; + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngNsDescriptor.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngNsDescriptor.java new file mode 100644 index 000000000000..15818a639c4f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngNsDescriptor.java @@ -0,0 +1,252 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.descriptors; + +import org.intellij.plugins.relaxNG.ProjectLoader; +import org.intellij.plugins.relaxNG.model.resolve.RelaxIncludeIndex; +import org.intellij.plugins.relaxNG.validation.RngParser; +import org.intellij.plugins.relaxNG.validation.XmlInstanceValidator; + +import com.intellij.codeInsight.daemon.Validator; +import com.intellij.javaee.ExternalResourceManager; +import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.ModificationTracker; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.util.ParameterizedCachedValue; +import com.intellij.psi.util.ParameterizedCachedValueProvider; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.XmlDocument; +import com.intellij.psi.xml.XmlFile; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.xml.XmlElementDescriptor; +import com.intellij.xml.XmlNSDescriptor; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import org.kohsuke.rngom.digested.DElementPattern; +import org.kohsuke.rngom.digested.DPattern; +import org.kohsuke.rngom.nc.NameClass; + +import javax.xml.namespace.QName; +import java.util.LinkedList; +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 18.07.2007 + */ +public class RngNsDescriptor implements XmlNSDescriptor, Validator { + private static final Key> ROOT_KEY = Key.create("ROOT_DESCRIPTOR"); + + private XmlFile myFile; + private PsiElement myElement; + private String myUrl; + + private DPattern myPattern; + private PsiManager myManager; + + @Nullable + public XmlElementDescriptor getElementDescriptor(@NotNull XmlTag tag) { + if (myPattern == null) { + return null; + } + + XmlTag _tag = tag; + final LinkedList chain = new LinkedList(); + while (_tag != null) { + chain.addFirst(_tag); + _tag = _tag.getParentTag(); + } + + XmlElementDescriptor desc; + do { + desc = findRootDescriptor(chain.removeFirst()); + } while (desc == null && chain.size() > 0); + + if (desc != null) { + for (XmlTag xmlTag : chain) { + desc = desc.getElementDescriptor(xmlTag, xmlTag.getParentTag()); + if (desc == null) { + break; + } + } + } + + if (desc == null) { + return findRootDescriptor(tag); + } + + return desc; + } + + private XmlElementDescriptor findRootDescriptor(final XmlTag tag) { + return tag.getManager().getCachedValuesManager().getParameterizedCachedValue(tag, ROOT_KEY, new ParameterizedCachedValueProvider() { + public CachedValueProvider.Result compute(RngNsDescriptor o) { + final XmlElementDescriptor descr = o.findRootDescriptorInner(tag); + if (descr != null) { + return CachedValueProvider.Result.create(descr, tag, descr.getDependences(), o.getDependences()); + } else { + return CachedValueProvider.Result.create(null, tag, o.getDependences()); + } + } + }, false, this); + } + + private XmlElementDescriptor findRootDescriptorInner(XmlTag tag) { + return findDescriptor(tag, ChildElementFinder.find(myPattern)); + } + + public XmlElementDescriptor findDescriptor(XmlTag tag, List list) { + final QName qName = new QName(tag.getNamespace(), tag.getLocalName()); + + int max = -1; + DElementPattern maxPattern = null; + for (DElementPattern pattern : list) { + final NameClass nameClass = pattern.getName(); + if (nameClass.contains(qName)) { + final int spec = nameClass.containsSpecificity(qName); + if (spec > max) { + maxPattern = pattern; + max = spec; + } + } + } + final List patterns = ContainerUtil.findAll(list, new Condition() { + public boolean value(DElementPattern pattern) { + final NameClass nameClass = pattern.getName(); + return nameClass.contains(qName); + } + }); + + if (maxPattern != null) { + if (patterns.size() > 1) { + return new CompositeDescriptor(this, maxPattern, patterns); + } else { + return new RngElementDescriptor(this, maxPattern); + } + } else { + return null; + } + } + + @NotNull + public XmlElementDescriptor[] getRootElementsDescriptors(@Nullable XmlDocument document) { + if (myPattern == null) { + return XmlElementDescriptor.EMPTY_ARRAY; + } + + final List list = ContainerUtil.findAll(ChildElementFinder.find(myPattern), NamedPatternFilter.INSTANCE); + return convertElementDescriptors(list, this); + } + + static XmlElementDescriptor[] convertElementDescriptors(List finder, final RngNsDescriptor nsDescriptor) { + return ContainerUtil.map2Array(finder, XmlElementDescriptor.class, new Function() { + public XmlElementDescriptor fun(final DElementPattern elementPattern) { + return new RngElementDescriptor(nsDescriptor, elementPattern); + } + }); + } + + @NotNull + public XmlFile getDescriptorFile() { + return myFile; + } + + public boolean isHierarhyEnabled() { + return false; + } + + public synchronized PsiElement getDeclaration() { + if (!myElement.isValid() || !myFile.isValid()) { + if (myUrl != null) { + final VirtualFile fileByUrl = VirtualFileManager.getInstance().findFileByUrl(myUrl); + if (fileByUrl != null) { + final PsiFile file = myManager.findFile(fileByUrl); + if (file instanceof XmlFile) { + init(((XmlFile)file).getDocument()); + } + } + } + } + return myFile.isValid() ? myFile.getDocument() : null; + } + + @NonNls + public String getName(PsiElement context) { + return getName(); + } + + @NonNls + public String getName() { + return getDescriptorFile().getName(); + } + + public Object[] getDependences() { + if (myPattern != null) { + final Object[] a = { myElement, ExternalResourceManager.getInstance() }; + final PsiElementProcessor.CollectElements processor = new PsiElementProcessor.CollectElements(); + RelaxIncludeIndex.processForwardDependencies(myFile, processor); + if (processor.getCollection().size() > 0) { + return ArrayUtil.mergeArrays(a, processor.toArray(), Object.class); + } else { + return a; + } + } else { + return new Object[]{ ModificationTracker.EVER_CHANGED }; + } + } + + public synchronized void init(PsiElement element) { + myElement = element; + myFile = element instanceof XmlFile ? (XmlFile)element : (XmlFile)element.getContainingFile(); + myManager = myFile.getManager(); + + final VirtualFile file = myFile.getVirtualFile(); + if (file != null) { + myUrl = file.getUrl(); + } + + myPattern = RngParser.getCachedPattern(getDescriptorFile(), RngParser.DEFAULT_HANDLER); + } + + public void validate(@NotNull PsiElement context, @NotNull final ValidationHost host) { + final XmlDocument doc = PsiTreeUtil.getContextOfType(context, XmlDocument.class, false); + if (doc == null) { + return; + } + final XmlTag rootTag = doc.getRootTag(); + if (rootTag == null) { + return; + } + // RNG XML itself is validated by parsing it with Jing, so we don't want to schema-validate it + if (!ProjectLoader.RNG_NAMESPACE.equals(rootTag.getNamespace())) { + XmlInstanceValidator.doValidation(doc, host, getDescriptorFile()); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngXmlAttributeDescriptor.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngXmlAttributeDescriptor.java new file mode 100644 index 000000000000..234d5ad9e457 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngXmlAttributeDescriptor.java @@ -0,0 +1,205 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.descriptors; + +import com.intellij.openapi.util.Comparing; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.XmlElement; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.xml.impl.BasicXmlAttributeDescriptor; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; + +import gnu.trove.THashSet; +import gnu.trove.TObjectHashingStrategy; +import org.kohsuke.rngom.digested.DAttributePattern; +import org.xml.sax.Locator; + +import javax.xml.namespace.QName; +import java.util.*; + +public class RngXmlAttributeDescriptor extends BasicXmlAttributeDescriptor { + @NonNls + private static final QName UNKNOWN = new QName("", "#unknown"); + + private static final TObjectHashingStrategy HASHING_STRATEGY = new TObjectHashingStrategy() { + public int computeHashCode(Locator o) { + final String s = o.getSystemId(); + return o.getLineNumber() * 31 + o.getColumnNumber() * 23 + (s != null ? s.hashCode() * 11 : 0); + } + public boolean equals(Locator o, Locator o1) { + if ((o.getLineNumber() == o1.getLineNumber() && o.getColumnNumber() == o1.getColumnNumber())) { + if (Comparing.equal(o.getSystemId(), o1.getSystemId())) { + return true; + } + } + return false; + } + }; + + private final Map myValues; + private final boolean myOptional; + private final RngElementDescriptor myElementDescriptor; + private final THashSet myDeclarations = new THashSet(HASHING_STRATEGY); + private final QName myName; + + RngXmlAttributeDescriptor(RngElementDescriptor elementDescriptor, DAttributePattern pattern, Map values, boolean optional) { + this(elementDescriptor, getName(pattern), values, optional, pattern.getLocation()); + } + + private static QName getName(DAttributePattern pattern) { + final Iterator iterator = pattern.getName().listNames().iterator(); + return iterator.hasNext() ? iterator.next() : UNKNOWN; + } + + private RngXmlAttributeDescriptor(RngElementDescriptor elementDescriptor, QName name, Map values, boolean optional, Locator... locations) { + myElementDescriptor = elementDescriptor; + myValues = values; + myOptional = optional; + myName = name; + myDeclarations.addAll(Arrays.asList(locations)); + } + + public RngXmlAttributeDescriptor mergeWith(RngXmlAttributeDescriptor d) { + final QName name = d.myName.equals(UNKNOWN) ? myName : d.myName; + + final HashMap values = new HashMap(myValues); + values.putAll(d.myValues); + + final THashSet locations = new THashSet(myDeclarations, HASHING_STRATEGY); + locations.addAll(d.myDeclarations); + + return new RngXmlAttributeDescriptor(myElementDescriptor, name, values, myOptional || d.myOptional, locations.toArray(new Locator[locations.size()])); + } + + public boolean isRequired() { + return !myOptional; + } + + public boolean isFixed() { + return isEnumerated() && myValues.size() == 1; + } + + public boolean hasIdType() { + return myValues.values().contains("ID"); + } + + public boolean hasIdRefType() { + return myValues.values().contains("IDREF"); + } + + @Nullable + public String getDefaultValue() { + return isEnumerated() ? myValues.keySet().iterator().next() : null; + } + + public boolean isEnumerated() { + return myValues.size() > 0 && myValues.get(null) == null; + } + + public String[] getEnumeratedValues() { + if (myValues.size() > 0) { + final Map copy; + if (myValues.get(null) != null) { + copy = new HashMap(myValues); + copy.remove(null); + } else { + copy = myValues; + } + return copy.keySet().toArray(new String[copy.size()]); + } else { + return ArrayUtil.EMPTY_STRING_ARRAY; + } + } + + public PsiElement getDeclaration() { + final Iterator it = myDeclarations.iterator(); + if (!it.hasNext()) return null; + + return myElementDescriptor.getDeclaration(it.next()); + } + + public Collection getDeclarations() { + return ContainerUtil.map2List(myDeclarations, new Function() { + public PsiElement fun(Locator locator) { + return myElementDescriptor.getDeclaration(locator); + } + }); + } + + @Override + public String getName(PsiElement context) { + final XmlTag tag = PsiTreeUtil.getParentOfType(context, XmlTag.class, false, PsiFile.class); + if (tag != null) { + final String uri = myName.getNamespaceURI(); + final String prefix = tag.getPrefixByNamespace(uri); + if (prefix != null) { + if (prefix.length() == 0) { + return myName.getLocalPart(); + } else { + return prefix + ":" + myName.getLocalPart(); + } + } + } + if (myName.getNamespaceURI().length() > 0) { + final String prefix2 = myName.getPrefix(); + if (prefix2 != null && prefix2.length() > 0) { + return prefix2 + ":" + myName.getLocalPart(); + } + } + return myName.getLocalPart(); + } + + @NonNls + public String getName() { + return myName.getLocalPart(); + } + + public void init(PsiElement element) { + + } + + public Object[] getDependences() { + return myElementDescriptor.getDependences(); + } + + @Override + public String validateValue(XmlElement context, String value) { + if (isTokenDatatype(value)) { + value = normalizeSpace(value); + } + return super.validateValue(context, value); + } + + private boolean isTokenDatatype(String value) { + if (myValues.containsKey(value)) { + return "token".equals(myValues.get(value)); + } + + value = normalizeSpace(value); + return myValues.containsKey(value) && "token".equals(myValues.get(value)); + } + + private static String normalizeSpace(String value) { + return value.replaceAll("\\s+", " ").trim(); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/DefinitionResolver.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/DefinitionResolver.java new file mode 100644 index 000000000000..b13aa33dda7e --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/DefinitionResolver.java @@ -0,0 +1,217 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.resolve; + +import org.intellij.plugins.relaxNG.compact.psi.RncFile; +import org.intellij.plugins.relaxNG.model.*; +import org.intellij.plugins.relaxNG.xml.dom.RngGrammar; + +import com.intellij.openapi.util.Factory; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.ModificationTracker; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.util.CachedValue; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.util.CachedValuesManager; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.xml.DomFileElement; +import com.intellij.util.xml.DomManager; +import org.jetbrains.annotations.Nullable; + +import gnu.trove.THashSet; +import gnu.trove.TObjectHashingStrategy; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 24.08.2007 +*/ +public class DefinitionResolver extends CommonElement.Visitor implements + CachedValueProvider>>, Factory> { + + private static final Key>>> KEY = Key.create("CACHED_DEFINES"); + + private THashSet myVisitedFiles; + private Map> myDefines; + + private final Grammar myScope; + + private DefinitionResolver(Grammar scope) { + myScope = scope; + } + + @Override + public void visitInclude(Include include) { + include.acceptChildren(this); + + final PsiFile value = include.getInclude(); + if (myVisitedFiles == null) { + //noinspection unchecked + myVisitedFiles = new THashSet(TObjectHashingStrategy.IDENTITY); + } + if (value != null && myVisitedFiles.add(value)) { + if (value instanceof RncFile) { + final Grammar grammar = ((RncFile)value).getGrammar(); + if (grammar != null) { + grammar.acceptChildren(this); + } + } else if (value instanceof XmlFile) { + final DomManager mgr = DomManager.getDomManager(value.getProject()); + final DomFileElement element = mgr.getFileElement((XmlFile)value, RngGrammar.class); + if (element != null) { + element.getRootElement().acceptChildren(this); + } + } + } + } + + @Override + public void visitDiv(Div div) { + div.acceptChildren(this); + } + + @Override + public void visitDefine(Define def) { + ContainerUtil.getOrCreate(myDefines, def.getName(), this).add(def); + } + + public void visitPattern(Pattern pattern) { + } + + public void visitGrammar(Grammar pattern) { + } + + public void visitRef(Ref ref) { + } + + + public Set create() { + return new THashSet(); + } + + public Result>> compute() { + myDefines = new HashMap>(); + + myScope.acceptChildren(this); + + try { + final PsiElement psiElement = myScope.getPsiElement(); + if (psiElement == null || !psiElement.isValid()) { + return Result.create(null, ModificationTracker.EVER_CHANGED); + } + + final PsiFile file = psiElement.getContainingFile(); + if (myVisitedFiles != null) { + myVisitedFiles.add(file); + return Result.create(myDefines, myVisitedFiles.toArray()); + } else { + return Result.create(myDefines, file); + } + } finally { + myVisitedFiles = null; + myDefines = null; + } + } + + @Nullable + public static Set resolve(Grammar scope, final String value) { + final Map> map = getAllVariants(scope); + if (map == null) { + return null; + } + + final Set set = map.get(value); + + // actually we should always do this, but I'm a bit afraid of the performance impact + if (set == null || set.size() == 0) { + final PsiElement element = scope.getPsiElement(); + if (element != null) { + final PsiFile file = element.getContainingFile(); + if (file instanceof XmlFile) { + final BackwardDefinitionResolver resolver = new BackwardDefinitionResolver(value); + RelaxIncludeIndex.processBackwardDependencies((XmlFile)file, resolver); + return resolver.getResult(); + } + } + } + + return set; + } + + @Nullable + public static Map> getAllVariants(Grammar scope) { + final PsiElement psiElement = scope.getPsiElement(); + if (psiElement == null || !psiElement.isValid()) return null; + + final CachedValuesManager manager = psiElement.getManager().getCachedValuesManager(); + CachedValue>> data = psiElement.getUserData(KEY); + if (data == null || !((DefinitionResolver)data.getValueProvider()).isValid()) { + final DefinitionResolver resolver = new DefinitionResolver(scope); + data = manager.createCachedValue(resolver, false); + psiElement.putUserData(KEY, data); + } + return data.getValue(); + } + + private boolean isValid() { + final PsiElement element = myScope.getPsiElement(); + return element != null && element.isValid(); + } + + private static class BackwardDefinitionResolver implements PsiElementProcessor { + private final String myValue; + private Define myResult; + + public BackwardDefinitionResolver(String value) { + myValue = value; + } + + public boolean execute(XmlFile element) { + final Grammar g = GrammarFactory.getGrammar(element); + if (g != null) { + g.acceptChildren(new CommonElement.Visitor() { + @Override + public void visitElement(CommonElement pattern) { + if (myResult == null) { + super.visitElement(pattern); + } + } + + @Override + public void visitDefine(Define define) { + if (myValue.equals(define.getName())) { + myResult = define; + } + } + }); + } + return myResult == null; + } + + public Set getResult() { + return myResult != null ? Collections.singleton(myResult) : null; + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/GrammarFactory.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/GrammarFactory.java new file mode 100644 index 000000000000..6b78ea3784bb --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/GrammarFactory.java @@ -0,0 +1,43 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.model.resolve; + +import org.intellij.plugins.relaxNG.compact.psi.RncFile; +import org.intellij.plugins.relaxNG.model.Grammar; +import org.intellij.plugins.relaxNG.xml.dom.RngGrammar; + +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.xml.DomFileElement; +import com.intellij.util.xml.DomManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 24.11.2007 + */ +public class GrammarFactory { + @Nullable + public static Grammar getGrammar(@NotNull XmlFile element) { + if (element instanceof RncFile) { + return ((RncFile)element).getGrammar(); + } + final DomFileElement fileElement = DomManager.getDomManager(element.getProject()).getFileElement(element, RngGrammar.class); + return fileElement != null ? fileElement.getRootElement() : null; + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxIncludeIndex.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxIncludeIndex.java new file mode 100644 index 000000000000..2527fa8ff602 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxIncludeIndex.java @@ -0,0 +1,76 @@ +package org.intellij.plugins.relaxNG.model.resolve; + +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.intellij.plugins.relaxNG.xml.dom.RngGrammar; + +import com.intellij.ide.highlighter.XmlFileType; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.impl.include.FileIncludeManager; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.NullableFunction; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.xml.DomManager; +import org.jetbrains.annotations.NotNull; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 09.06.2010 +*/ +public class RelaxIncludeIndex { + public static boolean processForwardDependencies(XmlFile file, final PsiElementProcessor processor) { + final Project project = file.getProject(); + final VirtualFile[] files = FileIncludeManager.getManager(project).getIncludedFiles(file.getVirtualFile(), true); + + return processRelatedFiles(file, files, processor); + } + + public static boolean processBackwardDependencies(@NotNull XmlFile file, PsiElementProcessor processor) { + return processBackwardDependencies((PsiFile)file, processor); + } + + + private static boolean processBackwardDependencies(@NotNull PsiFile file, PsiElementProcessor processor) { + final Project project = file.getProject(); + final VirtualFile[] files = FileIncludeManager.getManager(project).getIncludingFiles(file.getVirtualFile(), true); + + return processRelatedFiles(file, files, processor); + } + + private static boolean processRelatedFiles(PsiFile file, VirtualFile[] files, PsiElementProcessor processor) { + Project project = file.getProject(); + final PsiManager psiManager = PsiManager.getInstance(project); + final PsiFile[] psiFiles = ContainerUtil.map2Array(files, PsiFile.class, new NullableFunction() { + public PsiFile fun(VirtualFile file) { + return psiManager.findFile(file); + } + }); + + for (final PsiFile psiFile : psiFiles) { + final FileType type = file.getFileType(); + if (type == XmlFileType.INSTANCE && isRngFile(psiFile)) { + if (!processor.execute((XmlFile)psiFile)) { + return false; + } + } else if (type == RncFileType.getInstance()) { + if (!processor.execute((XmlFile)psiFile)) { + return false; + } + } + } + return true; + } + + static boolean isRngFile(PsiFile psiFile) { + try { + return DomManager.getDomManager(psiFile.getProject()).getFileElement((XmlFile)psiFile, RngGrammar.class) != null; + } catch (ClassCastException e) { + return false; // fileType == XML && !instanceof XmlFile + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxIncludeProvider.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxIncludeProvider.java new file mode 100644 index 000000000000..709897edb17b --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxIncludeProvider.java @@ -0,0 +1,99 @@ +package org.intellij.plugins.relaxNG.model.resolve; + +import org.intellij.plugins.relaxNG.ProjectLoader; +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.intellij.plugins.relaxNG.compact.psi.RncElement; +import org.intellij.plugins.relaxNG.compact.psi.RncElementVisitor; +import org.intellij.plugins.relaxNG.compact.psi.RncInclude; + +import com.intellij.ide.highlighter.XmlFileType; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.impl.include.FileIncludeInfo; +import com.intellij.psi.impl.include.FileIncludeProvider; +import com.intellij.util.indexing.FileContent; +import com.intellij.util.xml.NanoXmlUtil; +import org.jetbrains.annotations.NotNull; + +import java.io.ByteArrayInputStream; +import java.util.ArrayList; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 09.06.2010 +*/ +public class RelaxIncludeProvider extends FileIncludeProvider { + @NotNull + @Override + public String getId() { + return "relax-ng"; + } + + @Override + public boolean acceptFile(VirtualFile file) { + final FileType type = file.getFileType(); + return type == XmlFileType.INSTANCE || type == RncFileType.getInstance(); + } + + @NotNull + @Override + public FileIncludeInfo[] getIncludeInfos(FileContent content) { + final ArrayList infos = new ArrayList(); + + if (content.getFileType() == XmlFileType.INSTANCE) { + NanoXmlUtil.parse(new ByteArrayInputStream(content.getContent()), new RngBuilderAdapter(infos)); + } else if (content.getFileType() == RncFileType.getInstance()) { + content.getPsiFile().acceptChildren(new RncElementVisitor() { + @Override + public void visitElement(RncElement element) { + element.acceptChildren(this); + } + + @Override + public void visitInclude(RncInclude include) { + final String path = include.getFileReference(); + if (path != null) { + infos.add(new FileIncludeInfo(path)); + } + } + }); + } + return infos.toArray(new FileIncludeInfo[infos.size()]); + } + + private static class RngBuilderAdapter extends NanoXmlUtil.IXMLBuilderAdapter { + boolean isRNG; + boolean isInclude; + private final ArrayList myInfos; + + public RngBuilderAdapter(ArrayList infos) { + myInfos = infos; + } + + @Override + public void startElement(String name, String nsPrefix, String nsURI, String systemID, int lineNr) throws Exception { + boolean isRngTag = ProjectLoader.RNG_NAMESPACE.equals(nsURI); + if (!isRNG) { // analyzing start tag + if (!isRngTag) { + throw new NanoXmlUtil.ParserStoppedException(); + } else { + isRNG = true; + } + } + isInclude = isRngTag && "include".equals(name); + } + + @Override + public void addAttribute(String key, String nsPrefix, String nsURI, String value, String type) throws Exception { + if (isInclude && "href".equals(key)) { + myInfos.add(new FileIncludeInfo(value)); + } + } + + @Override + public void endElement(String name, String nsPrefix, String nsURI) throws Exception { + isInclude = false; + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxSymbolIndex.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxSymbolIndex.java new file mode 100644 index 000000000000..8036a5dc6754 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxSymbolIndex.java @@ -0,0 +1,286 @@ +package org.intellij.plugins.relaxNG.model.resolve; + +import org.intellij.plugins.relaxNG.ProjectLoader; +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.intellij.plugins.relaxNG.model.CommonElement; +import org.intellij.plugins.relaxNG.model.Define; +import org.intellij.plugins.relaxNG.model.Grammar; + +import com.intellij.ide.highlighter.XmlFileType; +import com.intellij.navigation.ItemPresentation; +import com.intellij.navigation.NavigationItem; +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vcs.FileStatus; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.meta.PsiMetaData; +import com.intellij.psi.meta.PsiMetaOwner; +import com.intellij.psi.meta.PsiPresentableMetaData; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.indexing.*; +import com.intellij.util.io.EnumeratorStringDescriptor; +import com.intellij.util.io.KeyDescriptor; +import com.intellij.util.xml.NanoXmlUtil; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.io.ByteArrayInputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 09.06.2010 +*/ +public class RelaxSymbolIndex extends ScalarIndexExtension { + @NonNls + public static final ID NAME = ID.create("RelaxSymbolIndex"); + + public static Collection getSymbolNames(Project project) { + return FileBasedIndex.getInstance().getAllKeys(NAME, project); + } + + public static NavigationItem[] getSymbolsByName(final String name, Project project, boolean includeNonProjectItems) { + final GlobalSearchScope scope = includeNonProjectItems ? GlobalSearchScope.allScope(project) : GlobalSearchScope.projectScope(project); + final SymbolCollector processor = new SymbolCollector(name, project, scope); + FileBasedIndex.getInstance().processValues(NAME, name, null, processor, scope); + return processor.getResult(); + } + + @Override + public ID getName() { + return NAME; + } + + @Override + public DataIndexer getIndexer() { + return new DataIndexer() { + @NotNull + public Map map(FileContent inputData) { + final HashMap map = new HashMap(); + if (inputData.getFileType() == XmlFileType.INSTANCE) { + NanoXmlUtil.parse(new ByteArrayInputStream(inputData.getContent()), new NanoXmlUtil.IXMLBuilderAdapter() { + NanoXmlUtil.IXMLBuilderAdapter attributeHandler; + int depth; + + @Override + public void addAttribute(String key, String nsPrefix, String nsURI, String value, String type) throws Exception { + if (attributeHandler != null) { + attributeHandler.addAttribute(key, nsPrefix, nsURI, value, type); + } + } + + @Override + public void startElement(String name, String nsPrefix, String nsURI, String systemID, int lineNr) throws Exception { + attributeHandler = null; + if (depth == 1 && ProjectLoader.RNG_NAMESPACE.equals(nsURI)) { + if ("define".equals(name)) { + attributeHandler = new NanoXmlUtil.IXMLBuilderAdapter() { + @Override + public void addAttribute(String key, String nsPrefix, String nsURI, String value, String type) throws Exception { + if ("name".equals(key) && (nsURI == null || nsURI.length() == 0)) { + map.put(value, null); + } + } + }; + } + } + depth++; + } + + @Override + public void endElement(String name, String nsPrefix, String nsURI) throws Exception { + attributeHandler = null; + depth--; + } + }); + } else if (inputData.getFileType() == RncFileType.getInstance()) { + final PsiFile file = inputData.getPsiFile(); + if (file instanceof XmlFile) { + final Grammar grammar = GrammarFactory.getGrammar((XmlFile)file); + if (grammar != null) { + grammar.acceptChildren(new CommonElement.Visitor() { + @Override + public void visitDefine(Define define) { + map.put(define.getName(), null); + } + }); + } + } + } + return map; + } + }; + } + + @Override + public KeyDescriptor getKeyDescriptor() { + return new EnumeratorStringDescriptor(); + } + + @Override + public FileBasedIndex.InputFilter getInputFilter() { + return new FileBasedIndex.InputFilter() { + public boolean acceptInput(VirtualFile file) { + return file.getFileType() == StdFileTypes.XML || file.getFileType() == RncFileType.getInstance(); + } + }; + } + + @Override + public boolean dependsOnFileContent() { + return true; + } + + @Override + public int getVersion() { + return 0; + } + + private static class SymbolCollector implements FileBasedIndex.ValueProcessor { + private final GlobalSearchScope myScope; + private final PsiManager myMgr; + private final String myName; + + private final Collection myResult = new ArrayList(); + + public SymbolCollector(String name, Project project, GlobalSearchScope scope) { + myMgr = PsiManager.getInstance(project); + myScope = scope; + myName = name; + } + + public boolean process(VirtualFile file, Void kind) { + if (myScope.contains(file)) { + final PsiFile psiFile = myMgr.findFile(file); + if (psiFile instanceof XmlFile) { + final Grammar grammar = GrammarFactory.getGrammar((XmlFile)psiFile); + if (grammar != null) { + grammar.acceptChildren(new CommonElement.Visitor() { + @Override + public void visitDefine(Define define) { + if (myName.equals(define.getName())) { + final PsiElement psi = define.getPsiElement(); + if (psi != null) { + MyNavigationItem.add((NavigationItem)define.getPsiElement(), myResult); + } + } + } + }); + } + } + } + return true; + } + + public NavigationItem[] getResult() { + return myResult.toArray(new NavigationItem[myResult.size()]); + } + } + + private static class MyNavigationItem implements NavigationItem, ItemPresentation { + private final NavigationItem myItem; + private final ItemPresentation myPresentation; + + private MyNavigationItem(NavigationItem item, @NotNull final ItemPresentation presentation) { + myItem = item; + myPresentation = presentation; + } + + public String getPresentableText() { + return myPresentation.getPresentableText(); + } + + @Nullable + public String getLocationString() { + return getLocationString((PsiElement)myItem); + } + + private static String getLocationString(PsiElement element) { + return "(in " + element.getContainingFile().getName() + ")"; + } + + @Nullable + public Icon getIcon(boolean open) { + return myPresentation.getIcon(open); + } + + @Nullable + public TextAttributesKey getTextAttributesKey() { + return myPresentation.getTextAttributesKey(); + } + + public String getName() { + return myItem.getName(); + } + + public ItemPresentation getPresentation() { + return myPresentation != null ? this : null; + } + + public FileStatus getFileStatus() { + return myItem.getFileStatus(); + } + + public void navigate(boolean requestFocus) { + myItem.navigate(requestFocus); + } + + public boolean canNavigate() { + return myItem.canNavigate(); + } + + public boolean canNavigateToSource() { + return myItem.canNavigateToSource(); + } + + public static void add(final NavigationItem item, Collection symbolNavItems) { + final ItemPresentation presentation; + if (item instanceof PsiMetaOwner) { + final PsiMetaData data = ((PsiMetaOwner)item).getMetaData(); + if (data instanceof PsiPresentableMetaData) { + final PsiPresentableMetaData metaData = (PsiPresentableMetaData)data; + presentation = new ItemPresentation() { + public String getPresentableText() { + return metaData.getName(); + } + + @Nullable + public String getLocationString() { + return MyNavigationItem.getLocationString((PsiElement)item); + } + + @Nullable + public Icon getIcon(boolean open) { + return metaData.getIcon(); + } + + @Nullable + public TextAttributesKey getTextAttributesKey() { + final ItemPresentation p = item.getPresentation(); + return p != null ? p.getTextAttributesKey() : null; + } + }; + } else { + presentation = item.getPresentation(); + } + } else { + presentation = item.getPresentation(); + } + + if (presentation != null) { + symbolNavItems.add(new MyNavigationItem(item, presentation)); + } + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/AddValueCondition.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/AddValueCondition.java new file mode 100644 index 000000000000..739b0e50280a --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/AddValueCondition.java @@ -0,0 +1,42 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.references; + +import com.intellij.openapi.util.Key; +import com.intellij.patterns.PatternCondition; +import com.intellij.util.ProcessingContext; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +class AddValueCondition extends PatternCondition { + private final Key> myKey; + + public AddValueCondition(Key> key) { + super("AddValue"); + myKey = key; + } + + public static AddValueCondition create(Key> key) { + return new AddValueCondition(key); + } + + public boolean accepts(@NotNull T value, ProcessingContext context) { + context.get(myKey).add(value); + return true; + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/AttributeValueCondition.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/AttributeValueCondition.java new file mode 100644 index 000000000000..b1ce0d36e0ad --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/AttributeValueCondition.java @@ -0,0 +1,35 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.references; + +import com.intellij.patterns.PatternCondition; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.util.ProcessingContext; +import org.jetbrains.annotations.NotNull; + +class AttributeValueCondition extends PatternCondition { + private final String myRef; + + public AttributeValueCondition(String ref) { + super("AttributeValue"); + myRef = ref; + } + + public boolean accepts(@NotNull XmlAttributeValue value, ProcessingContext context) { + return myRef.equals(value.getValue()); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/AttributeValueFunction.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/AttributeValueFunction.java new file mode 100644 index 000000000000..fd5468e68139 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/AttributeValueFunction.java @@ -0,0 +1,33 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.references; + +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; + +import java.util.Set; + +class AttributeValueFunction implements Function { + public String fun(XmlAttributeValue value) { + return value.getValue(); + } + + public static String[] toStrings(Set values) { + return ContainerUtil.map2Array(values, String.class, new AttributeValueFunction()); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/FileReferenceUtil.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/FileReferenceUtil.java new file mode 100644 index 000000000000..13ca07e55c3f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/FileReferenceUtil.java @@ -0,0 +1,143 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.references; + +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.util.Condition; +import com.intellij.patterns.PsiFilePattern; +import com.intellij.psi.*; +import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReference; +import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet; +import com.intellij.util.NotNullFunction; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import static com.intellij.patterns.XmlPatterns.*; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 29.08.2007 + */ +public class FileReferenceUtil { + + public static PsiReference[] restrict(FileReferenceSet set, final Condition cond) { + return restrict(set, cond, null); + } + + public static PsiReference[] restrict(FileReferenceSet set, final Condition cond, final Boolean soft) { + final FileReference[] references = set.getAllReferences(); + + return ContainerUtil.map2Array(references, PsiReference.class, new NotNullFunction() { + @NotNull + public PsiReference fun(FileReference fileReference) { + return new MyFileReference(fileReference, cond, soft); + } + }); + } + + public static Condition byType(FileType instance) { + return new TypeCondition(instance); + } + + public static Condition byNamespace(String ns) { + return new PatternCondition(xmlFile().withRootTag(xmlTag().withNamespace(string().equalTo(ns)))); + } + + private static class TypeCondition implements Condition { + private final FileType myType; + + public TypeCondition(FileType type) { + myType = type; + } + + public boolean value(PsiFile file) { + return file.getFileType() == myType; + } + } + + private static class PatternCondition implements Condition { + private final PsiFilePattern myPattern; + + public PatternCondition(PsiFilePattern pattern) { + myPattern = pattern; + } + + public boolean value(PsiFile o) { + return myPattern.accepts(o); + } + } + + private static class MyFileReference extends FileReference { + private final Condition myCond; + private final Boolean mySoft; + + public MyFileReference(FileReference fileReference, Condition cond, @Nullable Boolean soft) { + super(fileReference.getFileReferenceSet(), fileReference.getRangeInElement(), fileReference.getIndex(), fileReference.getCanonicalText()); + myCond = cond; + mySoft = soft; + } + + @Override + public boolean isSoft() { + return mySoft == null ? super.isSoft() : mySoft; + } + + @Override + public PsiFileSystemItem resolve() { + final PsiFileSystemItem result = super.resolve(); + if (result instanceof PsiFile) { + if (!myCond.value((PsiFile)result)) { + return null; + } + } + return result; + } + + @Override + protected ResolveResult[] innerResolve() { + final ResolveResult[] results = super.innerResolve(); + return ContainerUtil.findAll(results, new Condition() { + public boolean value(ResolveResult resolveResult) { + final PsiElement e = resolveResult.getElement(); + return match(e, myCond); + } + }).toArray(ResolveResult.EMPTY_ARRAY); + } + + @NotNull + @Override + public Object[] getVariants() { + final Object[] variants = super.getVariants(); + return ContainerUtil.findAll(variants, new Condition() { + public boolean value(Object o) { + /*if (o instanceof CandidateInfo) { + o = ((CandidateInfo)o).getElement(); + }*/ + return match(o, myCond); + } + }).toArray(); + } + + private static boolean match(Object o, Condition cond) { + return !(o instanceof PsiFileSystemItem) || + ((PsiFileSystemItem)o).isDirectory() || + (o instanceof PsiFile && cond.value((PsiFile)o)); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/IdRefProvider.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/IdRefProvider.java new file mode 100644 index 000000000000..af803b4a62e7 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/IdRefProvider.java @@ -0,0 +1,149 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.references; + +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.TextRange; +import com.intellij.patterns.PatternCondition; +import com.intellij.patterns.XmlAttributeValuePattern; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.psi.PsiReferenceBase; +import com.intellij.psi.impl.source.resolve.reference.PsiReferenceProviderBase; +import com.intellij.psi.impl.source.resolve.reference.impl.providers.AttributeValueSelfReference; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.psi.xml.XmlDocument; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.ProcessingContext; +import com.intellij.xml.XmlAttributeDescriptor; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.Set; + +import static com.intellij.patterns.XmlPatterns.xmlAttribute; +import static com.intellij.patterns.XmlPatterns.xmlAttributeValue; + +public class IdRefProvider extends PsiReferenceProviderBase { + public static final HasIdRefTypeCondition HAS_ID_REF_TYPE = new HasIdRefTypeCondition(); + public static final HasIdTypeCondition HAS_ID_TYPE = new HasIdTypeCondition(); + + @NotNull + public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { + final XmlAttributeValue value = (XmlAttributeValue)element; + + if (hasIdRefType(value)) { + return new PsiReference[]{ + new IdReference(value) + }; + } else if (hasIdType(value)) { + return new PsiReference[]{ + new AttributeValueSelfReference(element) + }; + } + return PsiReference.EMPTY_ARRAY; + } + + private static class IdReference extends PsiReferenceBase { + + private static final Key TARGET = Key.create("target"); + private static final Key> VARIANTS = Key.create("variants"); + private static final XmlAttributeValuePattern PATTERN = xmlAttributeValue().withParent(xmlAttribute()).with(HAS_ID_TYPE); + + private final AttributeValueCondition myCondition; + + public IdReference(XmlAttributeValue element) { + super(element, TextRange.from(1, element.getTextLength() - 2), true); + myCondition = new AttributeValueCondition(element.getValue()); + } + + public PsiElement resolve() { + final ProcessingContext context = new ProcessingContext(); + final ResolvingVisitor visitor = new ResolvingVisitor(PATTERN.with(myCondition).save(TARGET), context) { + public void visitXmlTag(XmlTag tag) { + super.visitXmlTag(tag); + if (shouldContinue()) { + visitSubTags(tag); + } + } + protected boolean shouldContinue() { + return context.get(TARGET) == null; + } + }; + + process(visitor); + + return context.get(TARGET); + } + + private void process(ResolvingVisitor visitor) { + final XmlDocument document = PsiTreeUtil.getParentOfType(getElement(), XmlDocument.class); + if (document != null) { + visitor.execute(document); + } + } + + @NotNull + public Object[] getVariants() { + final ProcessingContext context = new ProcessingContext(); + context.put(VARIANTS, new HashSet()); + + final ResolvingVisitor visitor = new ResolvingVisitor(PATTERN.with(AddValueCondition.create(VARIANTS)), context) { + public void visitXmlTag(XmlTag tag) { + super.visitXmlTag(tag); + visitSubTags(tag); + } + }; + + process(visitor); + + return AttributeValueFunction.toStrings(context.get(VARIANTS)); + } + } + + private static boolean hasIdType(XmlAttributeValue xmlAttributeValue) { + final XmlAttributeDescriptor descriptor = ((XmlAttribute)xmlAttributeValue.getParent()).getDescriptor(); + return descriptor != null && descriptor.hasIdType(); + } + + private static boolean hasIdRefType(XmlAttributeValue xmlAttributeValue) { + final XmlAttributeDescriptor descriptor = ((XmlAttribute)xmlAttributeValue.getParent()).getDescriptor(); + return descriptor != null && descriptor.hasIdRefType(); + } + + static class HasIdTypeCondition extends PatternCondition { + public HasIdTypeCondition() { + super("IdType"); + } + + public boolean accepts(@NotNull XmlAttributeValue xmlAttributeValue, ProcessingContext context) { + return hasIdType(xmlAttributeValue); + } + } + + static class HasIdRefTypeCondition extends PatternCondition { + public HasIdRefTypeCondition() { + super("IdRef"); + } + + public boolean accepts(@NotNull XmlAttributeValue xmlAttributeValue, ProcessingContext context) { + return hasIdRefType(xmlAttributeValue); + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/PrefixReferenceProvider.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/PrefixReferenceProvider.java new file mode 100644 index 000000000000..ee5354b8515f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/PrefixReferenceProvider.java @@ -0,0 +1,122 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.references; + +import com.intellij.codeInsight.daemon.EmptyResolveMessageProvider; +import com.intellij.codeInsight.daemon.QuickFixProvider; +import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.daemon.impl.analysis.CreateNSDeclarationIntentionFix; +import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction; +import com.intellij.lang.xml.XMLLanguage; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.psi.XmlElementFactory; +import com.intellij.psi.impl.source.resolve.reference.PsiReferenceProviderBase; +import com.intellij.psi.impl.source.resolve.reference.impl.providers.BasicAttributeValueReference; +import com.intellij.psi.impl.source.xml.SchemaPrefix; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.ArrayUtil; +import com.intellij.util.ProcessingContext; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 24.07.2007 +*/ +public class PrefixReferenceProvider extends PsiReferenceProviderBase { + @NotNull + public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { + final XmlAttributeValue value = (XmlAttributeValue)element; + + final String s = value.getValue(); + final int i = s.indexOf(':'); + if (i <= 0 || s.startsWith("xml:")) { + return PsiReference.EMPTY_ARRAY; + } + + return new PsiReference[]{ + new PrefixReference(value, i) + }; + } + + private static class PrefixReference extends BasicAttributeValueReference implements EmptyResolveMessageProvider, QuickFixProvider { + public PrefixReference(XmlAttributeValue value, int length) { + super(value, TextRange.from(1, length)); + } + + @Nullable + public PsiElement resolve() { + final String prefix = getCanonicalText(); + XmlTag tag = PsiTreeUtil.getParentOfType(getElement(), XmlTag.class); + while (tag != null) { + if (tag.getLocalNamespaceDeclarations().containsKey(prefix)) { + final XmlAttribute attribute = tag.getAttribute("xmlns:" + prefix, ""); + final TextRange textRange = TextRange.from("xmlns:".length(), prefix.length()); + return new SchemaPrefix(attribute, textRange, prefix); + } + tag = tag.getParentTag(); + } + return null; + } + + @Override + public boolean isReferenceTo(PsiElement element) { + if (element instanceof SchemaPrefix && element.getContainingFile() == myElement.getContainingFile()) { + final PsiElement e = resolve(); + if (e instanceof SchemaPrefix) { + final String s = ((SchemaPrefix)e).getName(); + return s != null && s.equals(((SchemaPrefix)element).getName()); + } + } + return super.isReferenceTo(element); + } + + public void registerQuickfix(HighlightInfo info, PrefixReference reference) { + try { + final PsiElement element = reference.getElement(); + final XmlElementFactory factory = XmlElementFactory.getInstance(element.getProject()); + final String value = ((XmlAttributeValue)element).getValue(); + final String[] name = value.split(":"); + final XmlTag tag = factory.createTagFromText("<" + (name.length > 1 ? name[1] : value) + " />", XMLLanguage.INSTANCE); + + QuickFixAction.registerQuickFixAction(info, + new CreateNSDeclarationIntentionFix(tag, reference.getCanonicalText())); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + @NotNull + public Object[] getVariants() { + return ArrayUtil.EMPTY_OBJECT_ARRAY; + } + + public boolean isSoft() { + return false; + } + + public String getUnresolvedMessagePattern() { + return "Undefined namespace prefix ''{0}''"; + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/ResolvingVisitor.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/ResolvingVisitor.java new file mode 100644 index 000000000000..73f351f09586 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/references/ResolvingVisitor.java @@ -0,0 +1,127 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.references; + +import com.intellij.openapi.util.Key; +import com.intellij.patterns.XmlAttributeValuePattern; +import com.intellij.patterns.XmlNamedElementPattern; +import com.intellij.psi.PsiElement; +import com.intellij.psi.XmlElementVisitor; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlDocument; +import com.intellij.psi.xml.XmlFile; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.ProcessingContext; +import com.intellij.xml.util.XmlUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import gnu.trove.THashSet; + +import java.util.Set; + +class ResolvingVisitor extends XmlElementVisitor implements PsiElementProcessor { + static final Key> VISITED_KEY = Key.create("visited"); + + private final XmlAttributeValuePattern myPattern; + private final ProcessingContext myProcessingContext; + private XmlNamedElementPattern myIncludePattern; + + public ResolvingVisitor(XmlAttributeValuePattern pattern, ProcessingContext context) { + myPattern = pattern; + myProcessingContext = context; + + myProcessingContext.put(VISITED_KEY, new THashSet()); + } + + public void visitXmlDocument(@Nullable XmlDocument document) { + if (document != null) { + final XmlTag rootTag = document.getRootTag(); + if (rootTag != null) { + visitXmlTag(rootTag); + } + } + } + + public void setIncludePattern(XmlNamedElementPattern includePattern) { + myIncludePattern = includePattern; + } + + public void visitXmlAttribute(XmlAttribute attribute) { + if (myIncludePattern != null && myIncludePattern.accepts(attribute, myProcessingContext)) { + final String value = attribute.getValue(); + if (value == null) return; + + final XmlFile xmlFile = XmlUtil.findXmlFile(attribute.getContainingFile(), value); + if (xmlFile != null) { + processInclude(xmlFile, attribute); + } + } else { + processAttribute(attribute); + } + } + + private void processAttribute(XmlAttribute attribute) { + myPattern.accepts(attribute.getValueElement(), myProcessingContext); + } + + @SuppressWarnings({ "ForLoopReplaceableByForEach" }) + public void visitXmlTag(XmlTag tag) { + visitAttributes(tag); + } + + protected void visitAttributes(XmlTag tag) { + final XmlAttribute[] xmlAttributes = tag.getAttributes(); + for (XmlAttribute attribute : xmlAttributes) { + attribute.accept(this); + } + } + + protected void visitSubTags(XmlTag tag) { + final XmlTag[] tags = tag.getSubTags(); + for (XmlTag subTag : tags) { + if (shouldContinue()) { + subTag.accept(this); + } + } + } + + private void processInclude(XmlFile xmlFile, XmlAttribute attribute) { + final Set set = myProcessingContext.get(VISITED_KEY); + if (set.contains(xmlFile)) { + return; + } + set.add(xmlFile); + + final XmlDocument document = xmlFile.getDocument(); + if (document == null) return; + final XmlTag rootTag = document.getRootTag(); + if (rootTag == null) return; + + rootTag.processElements(this, attribute); + } + + public boolean execute(@NotNull PsiElement element) { + element.accept(this); + return shouldContinue(); + } + + protected boolean shouldContinue() { + return true; + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/resources/relaxng.rng b/plugins/relaxng/src/org/intellij/plugins/relaxNG/resources/relaxng.rng new file mode 100644 index 000000000000..3842917c1ab2 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/resources/relaxng.rng @@ -0,0 +1,521 @@ + + + + + + + + + + + + + + The element pattern matches elements. + The name of the element may be defined either through a name attribute or through a name class. + + + When name is specified, the element pattern matches only elements with this name. + name is a shortcut to define a single name as a name class for the element pattern. + name and the definition of a name class can't be specified together (they are exclusive options). + + + + + + + + + The attribute pattern matches attributes. + The name of the attribute may be defined by using either a name attribute or a name class. + After simplification, attribute patterns can contain only patterns relevant for text nodes. + Attributes can't be duplicated, either directly or by overlapping name classes. + Attributes that have an infinite name class (anyName or nsName) must be enclosed in a oneOrMore or zeroOrMore pattern. + + + + + When name is specified, the attribute pattern matches attributes with this name only. + This can be a shortcut to define a single name as a name class for the attribute pattern). + name and the definition of a name class can't both be specified (they are exclusive options). + + + + + + + + + + + + + The group pattern defines an ordered group of subpatterns. + Note that when attribute patterns are included in such a group, their order isn't enforced. + group patterns are implicit with element and define patterns. + + + + + The interleave pattern "interleaves" subpatterns; it allows their leaves to be mixed in any order. + The interleave pattern can't be used within a list. + The interleave behavior is applied to attribute patterns even when they are embedded in (ordered) group patterns + (the reason for this is that XML 1.0 specifies the relative order of attributes isn't significant). + Elements within a interleave pattern can't have overlapping name classes. + There can be at most one text pattern in each set of patterns combined by interleave. + + + + + + The choice pattern defines a choice between different patterns; + it matches a node if, and only if, at least one of its subpatterns matches this node. + + + + + The optional pattern specifies that its subpatterns considered as an + ordered group is optional, i.e., be matched zero or one times. + + + + + The zeroOrMore pattern specifies that its subpatterns are considered + an ordered group that must be matched zero or more times. + The zeroOrMore pattern can't contain attribute definitions. + + + + + The oneOrMore pattern specifies that its subpatterns considered as an + ordered group must be matched one or more times. The oneOrMore pattern can't contain attribute definitions. + + + + + The list pattern splits a text node into tokens separated by whitespace. + The splitting allows the validation of these tokens separately. + This practice is most useful for validating lists of values. + interleave can't be used within list. + The content of a list is only about data: it's forbidden to define element, attribute, or text there. + It's forbidden to embed list into list. + + + + + + The mixed pattern is a shortcut for interleave with an embedded text pattern. + It describes unordered content models in which a text node may be included before and after + each element. Note that RELAX NG doesn't allow the addition of constraints on these text nodes. + The mixed pattern can't be used within a list. + Elements within a mixed pattern can't have overlapping name classes. + There must no other text pattern in each set of patterns combined by mixed. + + + + + + The ref pattern defines a reference to a named pattern defined in the current grammar. + + This attribute specifies the name of the named pattern that is referenced. + + + + + + + The parentRef pattern is a reference to a named pattern belonging + to the parent grammar - in other words, the grammar in which the current grammar is included. + The scope of a named pattern is usually limited to the grammar in which they are defined. + The parentRef pattern provides a way to extend this scope and refer to a named pattern + defined in the parent grammar. + + This attribute specifies the name of the named pattern that is referenced. + + + + + + + Empty content. + empty patterns define nodes that are empty, for example, elements that have no child elements, text, or attributes. + Note that it is mandatory to use this pattern explicitly in such cases; the simpler-looking form + <element name="foo"/> is forbidden. There is no such thing as an empty attribute. + An attribute such as foo="" is considered to have a value that is the empty string rather + than considered empty - i.e., having no value. Therefore, empty applies only to elements. + + + + + + The text pattern matches zero or more text nodes. + A match of more than one text node has no effect when it is used in ordered content models + (the data model used by RELAX NG for XML documents is similar to the data model of XPath 1.0, + and two text nodes can't be adjacent) but makes a difference when a text pattern is used in interleave. + Adding a single text pattern in an interleave pattern has the effect of allowing any number of text nodes, + which can interleave before and after each element (note that the mixed pattern is provided as a + shortcut to define these content models). + No more than one text pattern can be included in an interleave pattern. + + + + + The value pattern matches a text node against a value using the semantic + of a specified datatype to perform the comparison. + The value pattern is meant for data-oriented applications and can't be used in mixed-content models. + It is used to define enumerations. + + + This attribute specifies which datatype to use to perform the comparison. + Note that this isn't an inherited attribute. When it isn't specified, the comparison is done using + the default datatype, the token datatype of RELAX NG's built-in type library. Because of this, a string + comparison is done on the values after space normalization. + + + + + + + + The data pattern matches a string that represents a value of a named datatype. + If the children of an element or an attribute match a data pattern, then complete content of the element + or attribute must match that data pattern. It is not permitted to have a pattern which allows part of the + content to match a data pattern, and another part to match another pattern. + The restrictions are applied through the type attribute, which defines the datatype and the param and except child patterns. + The data pattern is meant for data-oriented applications and can't be used in mixed content models. + + + The type attribute specifies the name of the datatype in the library identified by the datatypeLibrary attribute. + + + + + + + + + The param element specifies parameters passed to the datatype library + to determine whether a value is valid per a datatype. When the datatype library is the + W3C XML Schema datatype, these parameters are the facets of the datatype and define + additional restrictions to be applied. The name of the parameter is defined by the name attribute, + and its value is the content of the param element. + + This attribute specifies the name of the parameter. + + + + + + + + + The except pattern is used to remove a set of values from a data pattern. + The except pattern can be used only in the context of data and can contain only data, value, and choice elements. + + + + + + + + + + The notAllowed pattern always fails. It can provide abstract definitions + that must be overridden before they can be used in a schema. + + + + + The externalRef pattern is a reference to an external schema. + It has the same effect as replacing the externalRef pattern with the external schema, + which is treated as a pattern. + + This attribute defines the location of the external schema. + + + + + + + Defines a grammar pattern. + The grammar pattern encapsulates the definitions of start and named patterns. + A grammar pattern is matched by matching the pattern contained in the start element. + The most common use of grammar is to validate XML documents. + In these cases, the start pattern specifies which elements can be used as the document root element. + The grammar pattern may also be used to write modular schemas. + In this case, the start pattern specifies which nodes must be matched by the grammar wherever it appears in the schema. + In every case, the named patterns defined in a grammar are considered local to this grammar. + + + + + + + + + + + + + + + + The div element is provided to define logical divisions in RELAX NG schemas. + It has no effect on validation. Its purpose is to define a group of definitions that may be annotated + as a whole. The div elements may be embedded in other div elements. + In the context of a grammar, the content of a div element is the + same as the content of a grammar. + + + + + The include pattern includes a grammar and merges its definitions with the definitions + of the current grammar. The definitions of the included grammar may be redefined and overridden by the + definitions embedded in the include pattern. Note that a schema must contain an explicit grammar + definition in order to be included. + + This attribute defines the location of the schema and specifies the grammar to be included. + + + + + + + + + + + + + + + + + + + In the context of an include, the content of a div element is + the same as the content of an include. + + + + + + + + + + + The start pattern defines the "start" of a grammar. + When this grammar is used to validate a complete document, the start pattern specifies which elements + can be used as the document (root) element. When this grammar is embedded in another grammar, the + start pattern specifies which pattern should be applied at the location where the grammar is embedded. + Like named pattern definitions, start patterns may be combined by choice or interleave and redefined when + they are included in include patterns. + + + + + + + + + + When define is embedded in a grammar, it defines a named pattern or combines a new definition with an existing one. + Named patterns are global to a grammar and can be referenced by ref in the scope of their grammar and by parentRef + in the scope of the grammars directly embedded in their grammar. + When define is embedded in include, the new definition is a redefinition. + It replaces the definitions from the included grammar, unless a combine attribute + is specified, in which case, the definitions are combined. + + + This attribute specifies the name of the named pattern. + + + + + + + + + + + + This attribute specifies how multiple definitions of a pattern (named pattern or start pattern) + should be combined. The possible values are choice and interleave. + When the combine attribute is specified and set to choice, multiple definitions of a pattern are + combined in a choice pattern. When the combine attribute is specified and set to interleave, multiple + definitions of a pattern are combined in an interleave pattern. + Note that it's forbidden to specify more than one define with the same name and no combine attribute or + multiple defines with different values of the combine attribute. + + + choice + Specifies that multiple definitions of a named pattern are + combined in a choice pattern + interleave + Specifies that multiple definitions of a named pattern are + combined in an interleave pattern + + + + + + + + + + + + + + + + + + + + + + + + + The name name class defines a class with a single name. + + + + + Name class accepting any name. + The anyName name class matches any name from any namespace. + This wide spectrum may be restricted by embedding except name classes. + + + + + The nsName name class allows any name in a specific namespace. + Within the scope of an element, the name classes of attributes can't overlap. + The same restriction applies to name classes of elements when these elements are combined by interleave. + It is impossible to use nsName to produce empty name classes by including nsName in an except name class + included in another nsName. + + + + + The choice name class makes a choice between several + name classes: a name matches choice if, and only if, it matches at least one + of the subname classes. + + + + + + + + + + + + The except name class can remove a name class from another. Note that this name class has no attributes. + + + + + + + + + + + + + + + + + + + + + + + + + + This attribute defines the default namespace for the elements defined in a portion of a schema. + The value is inherited. + + + + The datatypeLibrary attribute contains a URI identifying the library of + datatypes being used. The value is inherited. The datatype library defined by W3C XML Schema Datatypes would + be identified by the URI http://www.w3.org/2001/XMLSchema-datatypes. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/MessageViewHelper.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/MessageViewHelper.java new file mode 100644 index 000000000000..d657a9fb0424 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/MessageViewHelper.java @@ -0,0 +1,255 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.validation; + +import com.intellij.ide.errorTreeView.NewErrorTreeViewPanel; +import com.intellij.openapi.command.CommandProcessor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.wm.ToolWindowId; +import com.intellij.openapi.wm.ToolWindowManager; +import com.intellij.ui.content.*; +import com.intellij.util.ui.ErrorTreeView; +import com.intellij.util.ui.MessageCategory; + +import gnu.trove.THashSet; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + +import javax.swing.*; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Set; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 19.11.2007 + */ +public class MessageViewHelper { + private final Project myProject; + + private final Set myErrors = new THashSet(); + + private final String myContentName; + private final Key myKey; + + private NewErrorTreeViewPanel myErrorsView; + private NewErrorTreeViewPanel.ProcessController myProcessController = MyProcessController.INSTANCE; + + public MessageViewHelper(Project project, String contentName, Key key) { + myProject = project; + myContentName = contentName; + myKey = key; + } + + public synchronized void setProcessController(NewErrorTreeViewPanel.ProcessController processController) { + if (myErrorsView == null) { + myProcessController = processController; + } else { + myErrorsView.setProcessController(processController); + } + } + + public synchronized void openMessageView(Runnable rerun) { + assert myErrorsView == null; + myErrorsView = new NewErrorTreeViewPanel(myProject, null, true, true, rerun); + openMessageViewImpl(); + } + + public synchronized void processError(final SAXParseException ex, final boolean warning) { + if (myErrors.size() == 0 && myErrorsView == null) { + myErrorsView = new NewErrorTreeViewPanel(myProject, null, true, true, null); + myErrorsView.setProcessController(myProcessController); + openMessageViewImpl(); + } + final String error = ex.getLineNumber() + "|" + ex.getColumnNumber() + "|" + ex.getSystemId() + "|" + ex.getLocalizedMessage(); + if (!myErrors.add(error)) { + return; + } + + VirtualFile file = null; + final String systemId = ex.getSystemId(); + if (systemId != null) { + try { + file = VfsUtil.findFileByURL(new URL(systemId)); + } catch (MalformedURLException e) { + System.err.println("systemId = " + systemId); + e.printStackTrace(); + } + } + + final VirtualFile file1 = file; + SwingUtilities.invokeLater( + new Runnable() { + public void run() { + myErrorsView.addMessage( + warning ? MessageCategory.WARNING : MessageCategory.ERROR, + new String[]{ ex.getLocalizedMessage() }, + file1, + ex.getLineNumber() - 1, + ex.getColumnNumber() - 1, null); + } + } + ); + } + + public void close() { + removeOldContents(null); + } + + private void removeOldContents(Content notToRemove) { + MessageView messageView = MessageView.SERVICE.getInstance(myProject); + + for (Content content : messageView.getContentManager().getContents()) { + if (content.isPinned()) continue; + if (myContentName.equals(content.getDisplayName()) && content != notToRemove) { + ErrorTreeView listErrorView = (ErrorTreeView)content.getComponent(); + if (listErrorView != null) { + if (messageView.getContentManager().removeContent(content, true)) { + content.release(); + } + } + } + } + } + + private void openMessageViewImpl() { + CommandProcessor commandProcessor = CommandProcessor.getInstance(); + commandProcessor.executeCommand(myProject, new Runnable() { + public void run() { + MessageView messageView = MessageView.SERVICE.getInstance(myProject); + Content content = ContentFactory.SERVICE.getInstance().createContent(myErrorsView.getComponent(), myContentName, true); + content.putUserData(myKey, myErrorsView); + messageView.getContentManager().addContent(content); + messageView.getContentManager().setSelectedContent(content); + messageView.getContentManager().addContentManagerListener(new CloseListener(content, myContentName, myErrorsView)); + removeOldContents(content); + messageView.getContentManager().addContentManagerListener(new MyContentDisposer(content, messageView, myKey)); + } + }, "Open Message View", null); + + ToolWindowManager.getInstance(myProject).getToolWindow(ToolWindowId.MESSAGES_WINDOW).activate(null); + } + + private static class MyProcessController implements NewErrorTreeViewPanel.ProcessController { + public static final MyProcessController INSTANCE = new MyProcessController(); + + public void stopProcess() { + } + + public boolean isProcessStopped() { + return true; + } + } + + private static class CloseListener extends ContentManagerAdapter { + private final String myContentName; + + private NewErrorTreeViewPanel myErrorsView; + private Content myContent; + + public CloseListener(Content content, String contentName, NewErrorTreeViewPanel errorsView) { + myContent = content; + myContentName = contentName; + myErrorsView = errorsView; + } + + public void contentRemoved(ContentManagerEvent event) { + if (event.getContent() == myContent) { + if (myErrorsView.canControlProcess()) { + myErrorsView.stopProcess(); + } + myErrorsView = null; + + myContent.getManager().removeContentManagerListener(this); + myContent.release(); + myContent = null; + } + } + + public void contentRemoveQuery(ContentManagerEvent event) { + if (event.getContent() == myContent) { + if (myErrorsView != null && myErrorsView.canControlProcess() && !myErrorsView.isProcessStopped()) { + int result = Messages.showYesNoDialog( + myContentName + " Running", + myContentName + " is still running. Close anyway?", + Messages.getQuestionIcon() + ); + if (result != 0) { + event.consume(); + } + } + } + } + } + + private static class MyContentDisposer extends ContentManagerAdapter { + private final Content myContent; + private final MessageView myMessageView; + private final Key myKey; + + MyContentDisposer(final Content content, final MessageView messageView, Key key) { + myContent = content; + myMessageView = messageView; + myKey = key; + } + + public void contentRemoved(ContentManagerEvent event) { + final Content eventContent = event.getContent(); + if (!eventContent.equals(myContent)) { + return; + } + myMessageView.getContentManager().removeContentManagerListener(this); + NewErrorTreeViewPanel errorTreeView = eventContent.getUserData(myKey); + if (errorTreeView != null) { + errorTreeView.dispose(); + } + eventContent.putUserData(myKey, null); + } + } + + public class ErrorHandler extends DefaultHandler { + private boolean myHadErrorOrWarning; + + @Override + public void warning(SAXParseException e) throws SAXException { + myHadErrorOrWarning = true; + processError(e, true); + } + + @Override + public void error(SAXParseException e) throws SAXException { + myHadErrorOrWarning = true; + processError(e, false); + } + + @Override + public void fatalError(SAXParseException e) throws SAXException { + myHadErrorOrWarning = true; + processError(e, false); + } + + public boolean hadErrorOrWarning() { + return myHadErrorOrWarning; + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/Psi2SaxAdapter.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/Psi2SaxAdapter.java new file mode 100644 index 000000000000..4ad5d9953ad9 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/Psi2SaxAdapter.java @@ -0,0 +1,162 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.validation; + +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.XmlElementVisitor; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.xml.*; +import com.intellij.xml.util.XmlUtil; + +import org.xml.sax.ContentHandler; +import org.xml.sax.SAXException; +import org.xml.sax.ext.Attributes2Impl; +import org.xml.sax.ext.Locator2Impl; + +import java.util.Map; + +/** + * Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 30.07.2007 +*/ +class Psi2SaxAdapter extends XmlElementVisitor implements PsiElementProcessor { + private final ContentHandler myHandler; + + public Psi2SaxAdapter(ContentHandler handler) { + myHandler = handler; + } + + public void visitXmlElement(XmlElement element) { + if (element instanceof XmlEntityRef) { + XmlUtil.processXmlElements(element, this, false, true); + } + super.visitXmlElement(element); + } + + public void visitXmlToken(XmlToken token) { + if (token.getTokenType() == XmlTokenType.XML_DATA_CHARACTERS) { + handleText(token, token.getText()); + } + } + + private void handleText(XmlElement element, String text) { + try { + setLocation(element); + myHandler.characters(text.toCharArray(), 0, text.length()); + } catch (SAXException e) { + throw new ParseError(e); + } + } + + public boolean execute(PsiElement element) { + element.accept(this); + return true; + } + + public void visitXmlDocument(XmlDocument document) { + try { + myHandler.startDocument(); + final XmlTag rootTag = document.getRootTag(); + if (rootTag != null) { + rootTag.accept(this); + } + myHandler.endDocument(); + } catch (SAXException e) { + throw new ParseError(e); + } + } + + public void visitXmlTag(XmlTag tag) { + try { + setLocation(tag); + + final Map map = tag.getLocalNamespaceDeclarations(); + final String[] prefixes = map.keySet().toArray(new String[map.size()]); + for (String prefix : prefixes) { + myHandler.startPrefixMapping(prefix, map.get(prefix)); + } + + final Attributes2Impl atts = new Attributes2Impl(); + final XmlAttribute[] xmlAttributes = tag.getAttributes(); + for (XmlAttribute attribute : xmlAttributes) { + final String s = attribute.getName(); + if (!"xmlns".equals(s) && !s.startsWith("xmlns:")) { + final String uri = attribute.getNamespace(); + atts.addAttribute(s.contains(":") ? uri : "", attribute.getLocalName(), s, "PCDATA", attribute.getValue()); + } + } + + final String namespace = tag.getNamespace(); + final String localName = tag.getLocalName(); + final String name = tag.getName(); + myHandler.startElement(namespace, localName, name, atts); + + PsiElement child = tag.getFirstChild(); + while (child != null) { + child.accept(this); + child = child.getNextSibling(); + } + + myHandler.endElement(namespace, localName, name); + + for (int i = prefixes.length - 1; i >= 0; i--) { + String prefix = prefixes[i]; + myHandler.endPrefixMapping(prefix); + } + } catch (SAXException e) { + throw new ParseError(e); + } + } + + public void visitXmlText(XmlText text) { + handleText(text, text.getValue()); + } + + private void setLocation(PsiElement text) { + final PsiFile psiFile = text.getContainingFile(); + final Document document = PsiDocumentManager.getInstance(text.getProject()).getDocument(psiFile); + if (document == null) { + return; + } + final VirtualFile virtualFile = psiFile.getVirtualFile(); + if (virtualFile == null) { + return; + } + + final Locator2Impl locator = new Locator2Impl(); + locator.setSystemId(RngParser.reallyFixIDEAUrl(virtualFile.getUrl())); + + final int offset = text.getTextRange().getEndOffset(); + final int lineNumber = document.getLineNumber(offset); + + locator.setLineNumber(lineNumber + 1); + locator.setColumnNumber(1 + offset - document.getLineStartOffset(lineNumber)); + + myHandler.setDocumentLocator(locator); + } + + public static class ParseError extends RuntimeException { + public ParseError(SAXException e) { + super(e); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/RngParser.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/RngParser.java new file mode 100644 index 000000000000..022e582efb9c --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/RngParser.java @@ -0,0 +1,208 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.validation; + +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.intellij.plugins.relaxNG.model.resolve.RelaxIncludeIndex; + +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiFile; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.util.CachedValue; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.util.CachedValuesManager; +import com.intellij.psi.xml.XmlFile; +import com.intellij.xml.util.XmlUtil; + +import com.thaiopensource.relaxng.impl.SchemaReaderImpl; +import com.thaiopensource.util.PropertyMap; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.xml.sax.Sax2XMLReaderCreator; +import com.thaiopensource.xml.sax.XMLReaderCreator; +import org.kohsuke.rngom.ast.builder.BuildException; +import org.kohsuke.rngom.ast.builder.IncludedGrammar; +import org.kohsuke.rngom.ast.builder.SchemaBuilder; +import org.kohsuke.rngom.ast.om.ParsedPattern; +import org.kohsuke.rngom.ast.util.CheckingSchemaBuilder; +import org.kohsuke.rngom.digested.DPattern; +import org.kohsuke.rngom.digested.DSchemaBuilderImpl; +import org.kohsuke.rngom.parse.IllegalSchemaException; +import org.kohsuke.rngom.parse.Parseable; +import org.kohsuke.rngom.parse.compact.CompactParseable; +import org.kohsuke.rngom.parse.xml.SAXParseable; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + +import java.io.StringReader; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 19.07.2007 +*/ +public class RngParser { + static final Key> SCHEMA_KEY = Key.create("SCHEMA"); + static final Key> PATTERN_KEY = Key.create("PATTERN"); + + public static final DefaultHandler DEFAULT_HANDLER = new DefaultHandler() { + public void error(SAXParseException e) throws SAXException { + System.out.println("e.getMessage() = " + e.getMessage() + " [" + e.getSystemId() + "]"); + } + }; + + static final PropertyMap EMPTY_PROPS = new PropertyMapBuilder().toPropertyMap(); + + public static DPattern getCachedPattern(final PsiFile descriptorFile, final ErrorHandler eh) { + final CachedValuesManager mgr = descriptorFile.getManager().getCachedValuesManager(); + + return mgr.getCachedValue(descriptorFile, PATTERN_KEY, new CachedValueProvider() { + public Result compute() { + return Result.create(parsePattern(descriptorFile, eh, false), descriptorFile); + } + }, false); + } + + public static DPattern parsePattern(final PsiFile file, final ErrorHandler eh, boolean checking) { + try { + final Parseable p = createParsable(file, eh); + final SchemaBuilder sb = new DSchemaBuilderImpl(); + + return (DPattern)p.parse(checking ? new CheckingSchemaBuilder(sb, eh) : sb); + } catch (BuildException e) { + e.printStackTrace(); + } catch (IllegalSchemaException e) { + System.out.println("invalid schema: " + file.getVirtualFile().getPresentableUrl()); + } + return null; + } + + private static Parseable createParsable(final PsiFile file, final ErrorHandler eh) { + final InputSource source = makeInputSource(file); + + if (file.getFileType() == RncFileType.getInstance()) { + return new CompactParseable(source, eh) { + public ParsedPattern parseInclude(String uri, SchemaBuilder schemaBuilder, IncludedGrammar g, String inheritedNs) + throws BuildException, IllegalSchemaException + { + return super.parseInclude(resolveURI(file, uri), schemaBuilder, g, inheritedNs); + } + }; + } else { + return new SAXParseable(source, eh) { + public ParsedPattern parseInclude(String uri, SchemaBuilder schemaBuilder, IncludedGrammar g, String inheritedNs) + throws BuildException, IllegalSchemaException + { + return super.parseInclude(resolveURI(file, uri), schemaBuilder, g, inheritedNs); + } + }; + } + } + + public static String resolveURI(PsiFile descriptorFile, String s) { + final PsiFile file = XmlUtil.findXmlFile(descriptorFile, s); + + if (file != null) { + final VirtualFile virtualFile = file.getVirtualFile(); + if (virtualFile != null) { + final PsiDocumentManager dm = PsiDocumentManager.getInstance(file.getProject()); + final Document d = dm.getCachedDocument(file); + if (d != null) { + // TODO: fix. write action + saving -> deadlock +// dm.commitDocument(d); +// FileDocumentManager.getInstance().saveDocument(d); + } + s = reallyFixIDEAUrl(virtualFile.getUrl()); + } + } + return s; + } + + public static String reallyFixIDEAUrl(String url) { + String s = VfsUtil.fixIDEAUrl(url); + if (!SystemInfo.isWindows) { + // Linux: + // "file://tmp/foo.bar" (produced by com.intellij.openapi.vfs.VfsUtil.fixIDEAUrl) doesn't work: "java.net.UnknownHostException: tmp" + // "file:/tmp/foo.bar" (produced by File.toURL()) works fine + s = s.replaceFirst("file:/+", "file:/"); + } + return s; + } + + public static Schema getCachedSchema(final XmlFile descriptorFile) { + CachedValue value = descriptorFile.getUserData(SCHEMA_KEY); + if (value == null) { + final CachedValueProvider provider = new CachedValueProvider() { + public Result compute() { + final InputSource inputSource = makeInputSource(descriptorFile); + + try { + final Schema schema = new MySchemaReader(descriptorFile).createSchema(inputSource, EMPTY_PROPS); + final PsiElementProcessor.CollectElements processor = new PsiElementProcessor.CollectElements(); + RelaxIncludeIndex.processForwardDependencies(descriptorFile, processor); + if (processor.getCollection().size() > 0) { + return Result.create(schema, processor.toArray(), descriptorFile); + } else { + return Result.createSingleDependency(schema, descriptorFile); + } + } catch (Exception e) { + e.printStackTrace(); + return Result.createSingleDependency(null, descriptorFile); + } + } + }; + + final CachedValuesManager mgr = descriptorFile.getManager().getCachedValuesManager(); + value = mgr.createCachedValue(provider, false); + descriptorFile.putUserData(SCHEMA_KEY, value); + } + return value.getValue(); + } + + private static InputSource makeInputSource(PsiFile descriptorFile) { + final InputSource inputSource = new InputSource(new StringReader(descriptorFile.getText())); + final VirtualFile file = descriptorFile.getVirtualFile(); + if (file != null) { + inputSource.setSystemId(reallyFixIDEAUrl(file.getUrl())); + } + return inputSource; + } + + static class MySchemaReader extends SchemaReaderImpl { + private final PsiFile myDescriptorFile; + + public MySchemaReader(PsiFile descriptorFile) { + myDescriptorFile = descriptorFile; + } + + protected com.thaiopensource.relaxng.parse.Parseable createParseable(XMLReaderCreator xmlReaderCreator, InputSource inputSource, ErrorHandler errorHandler) { + if (myDescriptorFile.getFileType() == RncFileType.getInstance()) { + return new com.thaiopensource.relaxng.parse.compact.CompactParseable(inputSource, errorHandler); + } else { + return new com.thaiopensource.relaxng.parse.sax.SAXParseable(new Sax2XMLReaderCreator(), inputSource, errorHandler); + } + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/RngSchemaValidator.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/RngSchemaValidator.java new file mode 100644 index 000000000000..260172940120 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/RngSchemaValidator.java @@ -0,0 +1,251 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.validation; + +import org.intellij.plugins.relaxNG.ProjectLoader; +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.intellij.plugins.relaxNG.compact.psi.RncFile; +import org.intellij.plugins.relaxNG.model.resolve.RelaxIncludeIndex; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.annotation.AnnotationHolder; +import com.intellij.lang.annotation.ExternalAnnotator; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.psi.*; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.*; +import org.jetbrains.annotations.NonNls; + +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + +import java.net.URL; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 18.07.2007 + */ +public class RngSchemaValidator implements ExternalAnnotator { + private static final Logger LOG = Logger.getInstance(RngSchemaValidator.class.getName()); + + public void annotate(final PsiFile file, final AnnotationHolder holder) { + final FileType type = file.getFileType(); + if (type != StdFileTypes.XML && type != RncFileType.getInstance()) { + return; + } + final XmlFile xmlfile = (XmlFile)file; + final XmlDocument document = xmlfile.getDocument(); + if (document == null) { + return; + } + if (type == StdFileTypes.XML) { + final XmlTag rootTag = document.getRootTag(); + if (rootTag == null) { + return; + } + if (!ProjectLoader.RNG_NAMESPACE.equals(rootTag.getNamespace())) { + return; + } + } else { + if (!ApplicationManager.getApplication().isUnitTestMode() && MyErrorFinder.hasError(xmlfile)) { + return; + } + } + final Document doc = PsiDocumentManager.getInstance(file.getProject()).getDocument(file); + + ErrorHandler eh = new DefaultHandler() { + public void warning(SAXParseException e) throws SAXException { + handleError(e, file, doc, new WarningMessageConsumer(holder)); + } + + public void error(SAXParseException e) throws SAXException { + handleError(e, file, doc, new ErrorMessageConsumer(holder)); + } + }; + + RngParser.parsePattern(file, eh, true); + } + + public static void handleError(SAXParseException ex, PsiFile file, Document document, ValidationMessageConsumer consumer) { + final String systemId = ex.getSystemId(); + + if (systemId != null) { + final VirtualFile virtualFile = findVirtualFile(systemId); + if (virtualFile != file.getVirtualFile()) { + return; + } + } + + final PsiElement at; + final int line = ex.getLineNumber(); + if (line > 0) { + final int column = ex.getColumnNumber(); + final int startOffset = document.getLineStartOffset(line - 1); + + if (column > 0) { + if (file.getFileType() == RncFileType.getInstance()) { + final PsiElement e = file.findElementAt(startOffset + column); + if (e == null) { + at = e; + } else { + at = file.findElementAt(startOffset + column - 1); + } + } else { + at = file.findElementAt(startOffset + column - 2); + } + } else { + final PsiElement e = file.findElementAt(startOffset); + at = e != null ? PsiTreeUtil.nextLeaf(e) : null; + } + } else { + final XmlDocument d = ((XmlFile)file).getDocument(); + assert d != null; + final XmlTag rootTag = d.getRootTag(); + assert rootTag != null; + at = rootTag.getFirstChild(); + } + + final PsiElement host; + if (file instanceof RncFile) { + host = at; + } else { + host = PsiTreeUtil.getParentOfType(at, XmlAttribute.class, XmlTag.class); + } + if (at != null && host != null) { + consumer.onMessage(host, ex.getMessage()); + } else { + consumer.onMessage(file, ex.getMessage()); + } + } + + public static VirtualFile findVirtualFile(String systemId) { + try { + return VfsUtil.findFileByURL(new URL(systemId)); + } catch (Exception e) { + LOG.warn("Failed to build file from uri <" + systemId + ">", e); + return VirtualFileManager.getInstance().findFileByUrl(VfsUtil.fixURLforIDEA(systemId)); + } + } + + public interface ValidationMessageConsumer { + void onMessage(PsiElement context, String message); + } + + private static abstract class MessageConsumerImpl implements ValidationMessageConsumer { + protected final AnnotationHolder myHolder; + + public MessageConsumerImpl(AnnotationHolder holder) { + myHolder = holder; + } + + public void onMessage(PsiElement host, String message) { + final ASTNode node = host.getNode(); + assert node != null; + + if (host instanceof XmlAttribute) { + final ASTNode nameNode = XmlChildRole.ATTRIBUTE_NAME_FINDER.findChild(node); + createAnnotation(nameNode, message); + } else if (host instanceof XmlTag) { + final ASTNode start = XmlChildRole.START_TAG_NAME_FINDER.findChild(node); + if (start != null) { + createAnnotation(start, message); + } + + final ASTNode end = XmlChildRole.CLOSING_TAG_NAME_FINDER.findChild(node); + if (end != null) { + createAnnotation(end, message); + } + } else { + createAnnotation(node, message); + } + } + + protected abstract void createAnnotation(ASTNode node, String message); + } + + private static class ErrorMessageConsumer extends MessageConsumerImpl { + @NonNls + private static final String MISSING_START_ELEMENT = "missing \"start\" element"; + private static final String UNDEFINED_PATTERN = "reference to undefined pattern "; + + public ErrorMessageConsumer(AnnotationHolder holder) { + super(holder); + } + + protected void createAnnotation(ASTNode node, String message) { + if (MISSING_START_ELEMENT.equals(message)) { + final PsiFile psiFile = node.getPsi().getContainingFile(); + if (psiFile instanceof XmlFile) { + final PsiElementProcessor.FindElement processor = new PsiElementProcessor.FindElement(); + RelaxIncludeIndex.processBackwardDependencies((XmlFile)psiFile, processor); + if (processor.isFound()) { + // files that are included from other files do not need a element. + myHolder.createInformationAnnotation(node, message); + return; + } + } + } else if (message != null && message.startsWith(UNDEFINED_PATTERN)) { + // we've got our own validation for that + return; + } + myHolder.createErrorAnnotation(node, message); + } + } + + private static class WarningMessageConsumer extends MessageConsumerImpl { + + public WarningMessageConsumer(AnnotationHolder holder) { + super(holder); + } + + protected void createAnnotation(ASTNode node, String message) { + myHolder.createWarningAnnotation(node, message); + } + } + + private static class MyErrorFinder extends PsiRecursiveElementVisitor { + private static final MyErrorFinder INSTANCE = new MyErrorFinder(); + + private static final class HasError extends RuntimeException { + } + private static final HasError FOUND = new HasError(); + + public void visitErrorElement(PsiErrorElement element) { + throw FOUND; + } + + public static boolean hasError(PsiElement element) { + try { + element.accept(INSTANCE); + return false; + } catch (HasError e) { + return true; + } + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/ValidateAction.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/ValidateAction.java new file mode 100644 index 000000000000..ae84e2e4396e --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/ValidateAction.java @@ -0,0 +1,261 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.validation; + +import com.intellij.ide.errorTreeView.NewErrorTreeViewPanel; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.wm.WindowManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.XmlFile; +import com.intellij.xml.XmlElementDescriptor; +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.util.UriOrFile; +import com.thaiopensource.validate.SchemaReader; +import com.thaiopensource.validate.ValidateProperty; +import com.thaiopensource.validate.ValidationDriver; +import com.thaiopensource.validate.auto.AutoSchemaReader; +import com.thaiopensource.validate.rng.CompactSchemaReader; +import com.thaiopensource.validate.rng.RngProperty; +import org.intellij.plugins.relaxNG.compact.RncFileType; +import org.intellij.plugins.relaxNG.model.descriptors.RngElementDescriptor; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +import javax.swing.*; +import java.io.IOException; +import java.net.MalformedURLException; +import java.util.concurrent.Future; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 19.11.2007 + */ +@SuppressWarnings({ "ComponentNotRegistered" }) +public class ValidateAction extends AnAction { + private static final String CONTENT_NAME = "Validate RELAX NG"; + private static final Key KEY = Key.create("VALIDATING"); + private static final Key IN_PROGRESS_KEY = Key.create("VALIDATION IN PROGRESS"); + + private final AnAction myOrigAction; + + public ValidateAction(AnAction origAction) { + myOrigAction = origAction; + copyFrom(origAction); + setEnabledInModalContext(origAction.isEnabledInModalContext()); + } + + public void actionPerformed(AnActionEvent e) { + if (!actionPerformedImpl(e)) { + myOrigAction.actionPerformed(e); + } + } + + public final void update(AnActionEvent e) { + super.update(e); + myOrigAction.update(e); + + final VirtualFile file = e.getData(PlatformDataKeys.VIRTUAL_FILE); + if (file != null) { + if (file.getUserData(IN_PROGRESS_KEY) == Boolean.TRUE) { + e.getPresentation().setEnabled(false); + } + } + } + + private boolean actionPerformedImpl(AnActionEvent e) { + final PsiFile file = e.getData(LangDataKeys.PSI_FILE); + if (file == null) { + return false; + } + final Project project = e.getData(PlatformDataKeys.PROJECT); + if (project == null) { + return false; + } + + final RngElementDescriptor descriptor = getRootDescriptor(file); + if (descriptor == null) return false; + + final PsiElement element = descriptor.getDeclaration(); + final XmlFile xmlFile = PsiTreeUtil.getParentOfType(element, XmlFile.class); + if (xmlFile == null) return false; + + final VirtualFile instanceFile = file.getVirtualFile(); + final VirtualFile schemaFile = xmlFile.getVirtualFile(); + if (instanceFile == null || schemaFile == null) { + return true; + } + + doRun(project, instanceFile, schemaFile); + + return true; + } + + private static void doRun(final Project project, final VirtualFile instanceFile, final VirtualFile schemaFile) { + saveFiles(instanceFile, schemaFile); + + final MessageViewHelper helper = new MessageViewHelper(project, CONTENT_NAME, KEY); + + helper.openMessageView(new Runnable() { + public void run() { + doRun(project, instanceFile, schemaFile); + } + }); + + final Future future = ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + public void run() { + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + final MessageViewHelper.ErrorHandler eh = helper.new ErrorHandler(); + + instanceFile.putUserData(IN_PROGRESS_KEY, Boolean.TRUE); + try { + doValidation(instanceFile, schemaFile, eh); + } finally { + instanceFile.putUserData(IN_PROGRESS_KEY, null); + } + + SwingUtilities.invokeLater( + new Runnable() { + public void run() { + if (!eh.hadErrorOrWarning()) { + SwingUtilities.invokeLater( + new Runnable() { + public void run() { + helper.close(); + WindowManager.getInstance().getStatusBar(project).setInfo("No errors detected"); + } + } + ); + } + } + } + ); + } + }); + } + }); + + helper.setProcessController(new NewErrorTreeViewPanel.ProcessController() { + public void stopProcess() { + future.cancel(true); + } + + public boolean isProcessStopped() { + return future.isDone(); + } + }); + } + + @SuppressWarnings({ "ThrowableInstanceNeverThrown" }) + private static void doValidation(VirtualFile instanceFile, VirtualFile schemaFile, org.xml.sax.ErrorHandler eh) { + final SchemaReader sr = schemaFile.getFileType() == RncFileType.getInstance() ? + CompactSchemaReader.getInstance() : + new AutoSchemaReader(); + + final PropertyMapBuilder properties = new PropertyMapBuilder(); + ValidateProperty.ERROR_HANDLER.put(properties, eh); + + // TODO: should some options dialog displayed before validating? + RngProperty.CHECK_ID_IDREF.add(properties); + + try { + final String schemaPath = RngParser.reallyFixIDEAUrl(schemaFile.getUrl()); + try { + final ValidationDriver driver = new ValidationDriver(properties.toPropertyMap(), sr); + final InputSource in = ValidationDriver.uriOrFileInputSource(schemaPath); + in.setEncoding(schemaFile.getCharset().name()); + + if (driver.loadSchema(in)) { + final String path = RngParser.reallyFixIDEAUrl(instanceFile.getUrl()); + try { + driver.validate(ValidationDriver.uriOrFileInputSource(path)); + } catch (IOException e1) { + eh.fatalError(new SAXParseException(e1.getMessage(), null, UriOrFile.fileToUri(path), -1, -1, e1)); + } + } + } catch (SAXParseException e1) { + eh.fatalError(e1); + } catch (IOException e1) { + eh.fatalError(new SAXParseException(e1.getMessage(), null, UriOrFile.fileToUri(schemaPath), -1, -1, e1)); + } + } catch (SAXException e1) { + // huh? + Logger.getInstance(ValidateAction.class.getName()).error(e1); + } catch (MalformedURLException e1) { + Logger.getInstance(ValidateAction.class.getName()).error(e1); + } + } + + private static RngElementDescriptor getRootDescriptor(PsiFile file) { + try { + if (file instanceof XmlFile) { + final XmlElementDescriptor descriptor = ((XmlFile)file).getDocument().getRootTag().getDescriptor(); + if (descriptor instanceof RngElementDescriptor) { + return (RngElementDescriptor)descriptor; + } + } + } catch (NullPointerException e1) { + // OK + } + return null; + } + + public boolean displayTextInToolbar() { + return myOrigAction.displayTextInToolbar(); + } + + public void setDefaultIcon(boolean b) { + myOrigAction.setDefaultIcon(b); + } + + public boolean isDefaultIcon() { + return myOrigAction.isDefaultIcon(); + } + + public void setInjectedContext(boolean worksInInjected) { + myOrigAction.setInjectedContext(worksInInjected); + } + + public boolean isInInjectedContext() { + return myOrigAction.isInInjectedContext(); + } + + public static void saveFiles(VirtualFile... files) { + // ensure the validation/conversion runs on the current content + final FileDocumentManager mgr = FileDocumentManager.getInstance(); + for (VirtualFile f : files) { + final Document document = mgr.getDocument(f); + if (document != null) { + mgr.saveDocument(document); + } + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/XmlInstanceValidator.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/XmlInstanceValidator.java new file mode 100644 index 000000000000..968c97129db4 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/validation/XmlInstanceValidator.java @@ -0,0 +1,114 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.validation; + +import com.intellij.codeInsight.daemon.Validator; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.xml.XmlDocument; +import com.intellij.psi.xml.XmlFile; +import com.intellij.psi.xml.XmlTag; +import org.jetbrains.annotations.NotNull; + +import com.thaiopensource.util.PropertyMapBuilder; +import com.thaiopensource.validate.Schema; +import com.thaiopensource.validate.ValidateProperty; +import org.xml.sax.ContentHandler; +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 30.07.2007 + */ +public class XmlInstanceValidator { + + public static void doValidation(@NotNull final XmlDocument doc, final Validator.ValidationHost host, final XmlFile descriptorFile) { + try { + final Schema schema = RngParser.getCachedSchema(descriptorFile); + if (schema == null) { + // did not manage to get a compiled schema. no validation... + return; + } + + final ErrorHandler eh = MyErrorHandler.create(doc, host); + if (eh == null) { + return; + } + + final PropertyMapBuilder builder = new PropertyMapBuilder(); + builder.put(ValidateProperty.ERROR_HANDLER, eh); + + final ContentHandler handler = schema.createValidator(builder.toPropertyMap()).getContentHandler(); + doc.accept(new Psi2SaxAdapter(handler)); + + } catch (ProcessCanceledException e) { + throw e; + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static class MyErrorHandler implements ErrorHandler { + private final Validator.ValidationHost myHost; + private final Document myDocument; + private final PsiFile myFile; + + private MyErrorHandler(XmlDocument doc, Validator.ValidationHost host) { + myHost = host; + myFile = doc.getContainingFile(); + myDocument = PsiDocumentManager.getInstance(myFile.getProject()).getDocument(myFile); + } + + public void warning(SAXParseException exception) throws SAXException { + RngSchemaValidator.handleError(exception, myFile, myDocument, new RngSchemaValidator.ValidationMessageConsumer() { + public void onMessage(PsiElement context, String message) { + myHost.addMessage(context, message, Validator.ValidationHost.WARNING); + } + }); + } + + public void error(SAXParseException exception) throws SAXException { + RngSchemaValidator.handleError(exception, myFile, myDocument, new RngSchemaValidator.ValidationMessageConsumer() { + public void onMessage(PsiElement context, String message) { + myHost.addMessage(context, message, Validator.ValidationHost.ERROR); + } + }); + } + + public void fatalError(SAXParseException exception) throws SAXException { + RngSchemaValidator.handleError(exception, myFile, myDocument, new RngSchemaValidator.ValidationMessageConsumer() { + public void onMessage(PsiElement context, String message) { + myHost.addMessage(context, message, Validator.ValidationHost.ERROR); + } + }); + } + + public static ErrorHandler create(XmlDocument doc, Validator.ValidationHost host) { + final XmlTag rootTag = doc.getRootTag(); + if (rootTag == null) { + return null; + } + return new MyErrorHandler(doc, host); + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/Combine.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/Combine.java new file mode 100644 index 000000000000..f544c0675866 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/Combine.java @@ -0,0 +1,39 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +/** + * http://relaxng.org/ns/structure/1.0:combineAttrType enumeration. + */ +public enum Combine implements com.intellij.util.xml.NamedEnum { + CHOICE("choice"), + INTERLEAVE("interleave"); + + private final String value; + + private Combine(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngAttribute.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngAttribute.java new file mode 100644 index 000000000000..9a7adcb53084 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngAttribute.java @@ -0,0 +1,40 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.xml.dom.names.OpenNameClasses; + +import com.intellij.util.xml.GenericAttributeValue; +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:attributeElemType interface. + */ +public interface RngAttribute extends OpenNameClasses, RngOpenPatterns { + + /** + * Returns the value of the name child. + * + * @return the value of the name child. + */ + @NotNull + @com.intellij.util.xml.Attribute("name") + GenericAttributeValue getNameAttr(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngChoice.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngChoice.java new file mode 100644 index 000000000000..3a1a3696bcfa --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngChoice.java @@ -0,0 +1,32 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.xml.dom.names.OpenNameClasses; + +import com.intellij.util.xml.Namespace; + +/** + * http://relaxng.org/ns/structure/1.0:choiceElemType interface. + */ +@Namespace( "RELAX-NG" ) +public interface RngChoice extends OpenNameClasses, RngOpenPatterns { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngData.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngData.java new file mode 100644 index 000000000000..7cce05d60651 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngData.java @@ -0,0 +1,68 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Pattern; + +import com.intellij.psi.xml.XmlElement; +import com.intellij.util.xml.GenericAttributeValue; +import com.intellij.util.xml.Required; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * http://relaxng.org/ns/structure/1.0:dataElemType interface. + */ +public interface RngData extends RngDomElement, Pattern { + + /** + * Returns the value of the type child. + * + * @return the value of the type child. + */ + @NotNull + @Required + GenericAttributeValue getType(); + + /** + * Returns the list of param children. + * + * @return the list of param children. + */ + @NotNull + List getParams(); + + /** + * Adds new child to the list of param children. + * + * @return created child + */ + RngParam addParam(); + + + /** + * Returns the list of except children. + * + * @return the list of except children. + */ + @NotNull + RngExcept getExcept(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDefine.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDefine.java new file mode 100644 index 000000000000..4f72aed004cc --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDefine.java @@ -0,0 +1,57 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Define; +import org.intellij.plugins.relaxNG.model.Pattern; +import org.intellij.plugins.relaxNG.xml.dom.impl.RngReferenceConverter; + +import com.intellij.psi.xml.XmlElement; +import com.intellij.util.xml.*; +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:defineElemType interface. + */ +@Namespace( "RELAX-NG" ) +public interface RngDefine extends RngOpenPatterns, Define { + + /** + * Returns the value of the name child. + * + * @return the value of the name child. + */ + @NotNull + @Required + @Referencing(value = RngReferenceConverter.class, soft = true) + @Attribute("name") + GenericAttributeValue getNameAttr(); + + + /** + * Returns the value of the combine child. + * + * @return the value of the combine child. + */ + @NotNull + GenericAttributeValue getCombine(); + + void setName(String name); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDiv.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDiv.java new file mode 100644 index 000000000000..3217b602603f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDiv.java @@ -0,0 +1,31 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Div; + +import com.intellij.psi.xml.XmlElement; + +/** + * http://relaxng.org/ns/structure/1.0:divElemType interface. + */ +public interface RngDiv extends RngDomElement, RngGrammarContent, Div { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDomElement.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDomElement.java new file mode 100644 index 000000000000..fa30e6ae4aa7 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDomElement.java @@ -0,0 +1,50 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.CommonElement; +import org.intellij.plugins.relaxNG.xml.dom.impl.RngDomElementBase; + +import com.intellij.psi.xml.XmlElement; +import com.intellij.util.xml.*; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 16.08.2007 + */ +@NameStrategy(com.intellij.util.xml.JavaNameStrategy.class) +@Implementation(RngDomElementBase.class) +public interface RngDomElement extends DomElement, CommonElement { + /** + * Returns the value of the ns child. + * + * @return the value of the ns child. + */ + @NotNull + @Attribute("ns") + GenericAttributeValue getNamespace(); + + /** + * Returns the value of the datatypeLibrary child. + * + * @return the value of the datatypeLibrary child. + */ + @NotNull + GenericAttributeValue getDatatypeLibrary(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDomVisitor.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDomVisitor.java new file mode 100644 index 000000000000..2ee37fc3c78a --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngDomVisitor.java @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom; + +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.DomElementVisitor; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 18.08.2007 + */ +public class RngDomVisitor implements DomElementVisitor { + public void visitDomElement(DomElement element) { + } + + public void visit(RngGrammar grammar) { + visitDomElement(grammar); + } + + public void visit(RngInclude include) { + visitDomElement(include); + } + + public void visit(RngDiv div) { + visitDomElement(div); + } + + public void visit(RngDefine def) { + visitDomElement(def); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngElement.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngElement.java new file mode 100644 index 000000000000..7d7096fcb57d --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngElement.java @@ -0,0 +1,42 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.xml.dom.names.OpenNameClasses; + +import com.intellij.util.xml.GenericAttributeValue; +import com.intellij.util.xml.Namespace; +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:elementElemType interface. + */ +@Namespace( "RELAX-NG" ) +public interface RngElement extends OpenNameClasses, RngOpenPatterns { + + /** + * Returns the value of the name child. + * + * @return the value of the name child. + */ + @NotNull + @com.intellij.util.xml.Attribute("name") + GenericAttributeValue getNameAttr(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngEmpty.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngEmpty.java new file mode 100644 index 000000000000..9303e44e846b --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngEmpty.java @@ -0,0 +1,31 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Pattern; + +import com.intellij.psi.xml.XmlElement; + +/** + * http://relaxng.org/ns/structure/1.0:emptyElemType interface. + */ +public interface RngEmpty extends RngDomElement, Pattern { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngExcept.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngExcept.java new file mode 100644 index 000000000000..ff76e5ad9b4f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngExcept.java @@ -0,0 +1,27 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +/** + * http://relaxng.org/ns/structure/1.0:exceptElemType interface. + */ +public interface RngExcept extends RngOpenPatterns { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngExternalRef.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngExternalRef.java new file mode 100644 index 000000000000..cb9c4a019572 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngExternalRef.java @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Pattern; +import org.intellij.plugins.relaxNG.xml.dom.impl.RngHrefConverter; + +import com.intellij.psi.xml.XmlElement; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.xml.Convert; +import com.intellij.util.xml.GenericAttributeValue; +import com.intellij.util.xml.Required; +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:externalRefElemType interface. + */ +public interface RngExternalRef extends RngDomElement, Pattern { + + /** + * Returns the value of the href child. + * + * @return the value of the href child. + */ + @NotNull + @Required + @Convert(RngHrefConverter.class) + @com.intellij.util.xml.Attribute("href") + GenericAttributeValue getReferencedFile(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngGrammar.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngGrammar.java new file mode 100644 index 000000000000..ef580a28d6a0 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngGrammar.java @@ -0,0 +1,34 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Grammar; +import org.intellij.plugins.relaxNG.model.Pattern; + +import com.intellij.psi.xml.XmlElement; +import com.intellij.util.xml.Namespace; + +/** + * http://relaxng.org/ns/structure/1.0:grammarElemType interface. + */ +@Namespace( "RELAX-NG" ) +public interface RngGrammar extends RngGrammarContent, Grammar { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngGrammarContent.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngGrammarContent.java new file mode 100644 index 000000000000..37fdf840c6e7 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngGrammarContent.java @@ -0,0 +1,87 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import com.intellij.util.xml.SubTag; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * http://relaxng.org/ns/structure/1.0:grammar-content interface. + */ +public interface RngGrammarContent extends RngDomElement { + + /** + * Returns the list of start children. + * + * @return the list of start children. + */ + @NotNull + @SubTag("start") + RngStart getStartElement(); + + /** + * Returns the list of define children. + * + * @return the list of define children. + */ + @NotNull + List getDefines(); + + /** + * Adds new child to the list of define children. + * + * @return created child + */ + RngDefine addDefine(); + + + /** + * Returns the list of div children. + * + * @return the list of div children. + */ + @NotNull + List getDivs(); + + /** + * Adds new child to the list of div children. + * + * @return created child + */ + RngDiv addDiv(); + + + /** + * Returns the list of include children. + * + * @return the list of include children. + */ + @NotNull + List getIncludes(); + + /** + * Adds new child to the list of include children. + * + * @return created child + */ + RngInclude addInclude(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngGroup.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngGroup.java new file mode 100644 index 000000000000..38547921b32f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngGroup.java @@ -0,0 +1,30 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import com.intellij.util.xml.Namespace; + +/** + * http://relaxng.org/ns/structure/1.0:groupElemType interface. + */ +@Namespace( "RELAX-NG" ) +public interface RngGroup extends RngOpenPatterns { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngInclude.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngInclude.java new file mode 100644 index 000000000000..ba2e7c6ce299 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngInclude.java @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Include; +import org.intellij.plugins.relaxNG.xml.dom.impl.RngHrefConverter; + +import com.intellij.psi.xml.XmlElement; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.xml.Convert; +import com.intellij.util.xml.GenericAttributeValue; +import com.intellij.util.xml.Required; +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:includeElemType interface. + */ +public interface RngInclude extends RngIncludeContent, Include { + + /** + * Returns the value of the href child. + * + * @return the value of the href child. + */ + @NotNull + @Required + @Convert(RngHrefConverter.class) + @com.intellij.util.xml.Attribute("href") + GenericAttributeValue getIncludedFile(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngIncludeContent.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngIncludeContent.java new file mode 100644 index 000000000000..ce26eda2df3b --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngIncludeContent.java @@ -0,0 +1,71 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import com.intellij.util.xml.SubTag; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * http://relaxng.org/ns/structure/1.0:include-content interface. + */ +public interface RngIncludeContent extends RngDomElement { + + /** + * Returns the list of start children. + * + * @return the list of start children. + */ + @NotNull + @SubTag("start") + RngStart getStartElement(); + + /** + * Returns the list of define children. + * + * @return the list of define children. + */ + @NotNull + List getDefines(); + + /** + * Adds new child to the list of define children. + * + * @return created child + */ + RngDefine addDefine(); + + + /** + * Returns the list of div children. + * + * @return the list of div children. + */ + @NotNull + List getDivs(); + + /** + * Adds new child to the list of div children. + * + * @return created child + */ + RngDiv addDiv(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngInterleave.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngInterleave.java new file mode 100644 index 000000000000..3d68ac99d4a9 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngInterleave.java @@ -0,0 +1,30 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import com.intellij.util.xml.Namespace; + +/** + * http://relaxng.org/ns/structure/1.0:interleaveElemType interface. + */ +@Namespace( "RELAX-NG" ) +public interface RngInterleave extends RngOpenPatterns { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngList.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngList.java new file mode 100644 index 000000000000..0896d87ca11d --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngList.java @@ -0,0 +1,27 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +/** + * http://relaxng.org/ns/structure/1.0:listElemType interface. + */ +public interface RngList extends RngOpenPatterns { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngMixed.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngMixed.java new file mode 100644 index 000000000000..7c230a407b40 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngMixed.java @@ -0,0 +1,27 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +/** + * http://relaxng.org/ns/structure/1.0:mixedElemType interface. + */ +public interface RngMixed extends RngOpenPatterns { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngNotAllowed.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngNotAllowed.java new file mode 100644 index 000000000000..9279398f24e9 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngNotAllowed.java @@ -0,0 +1,31 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Pattern; + +import com.intellij.psi.xml.XmlElement; + +/** + * http://relaxng.org/ns/structure/1.0:notAllowedElemType interface. + */ +public interface RngNotAllowed extends RngDomElement, Pattern { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOneOrMore.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOneOrMore.java new file mode 100644 index 000000000000..a5ef14c16b28 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOneOrMore.java @@ -0,0 +1,27 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +/** + * http://relaxng.org/ns/structure/1.0:oneOrMoreElemType interface. + */ +public interface RngOneOrMore extends RngOpenPatterns { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOpenPattern.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOpenPattern.java new file mode 100644 index 000000000000..d0462fb6358f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOpenPattern.java @@ -0,0 +1,202 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Pattern; + +import com.intellij.psi.xml.XmlElement; +import com.intellij.util.xml.DomElement; +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:open-pattern interface. + */ +public interface RngOpenPattern extends DomElement, Pattern { + + /** + * Returns the value of the element child. + * + * @return the value of the element child. + */ + @NotNull + RngElement getElement(); + + + /** + * Returns the value of the attribute child. + * + * @return the value of the attribute child. + */ + @NotNull + RngAttribute getAttribute(); + + + /** + * Returns the value of the group child. + * + * @return the value of the group child. + */ + @NotNull + RngGroup getGroup(); + + + /** + * Returns the value of the interleave child. + * + * @return the value of the interleave child. + */ + @NotNull + RngInterleave getInterleave(); + + + /** + * Returns the value of the choice child. + * + * @return the value of the choice child. + */ + @NotNull + RngChoice getChoice(); + + + /** + * Returns the value of the optional child. + * + * @return the value of the optional child. + */ + @NotNull + RngOptional getOptional(); + + + /** + * Returns the value of the zeroOrMore child. + * + * @return the value of the zeroOrMore child. + */ + @NotNull + RngZeroOrMore getZeroOrMore(); + + + /** + * Returns the value of the oneOrMore child. + * + * @return the value of the oneOrMore child. + */ + @NotNull + RngOneOrMore getOneOrMore(); + + + /** + * Returns the value of the list child. + * + * @return the value of the list child. + */ + @NotNull + RngList getList(); + + + /** + * Returns the value of the mixed child. + * + * @return the value of the mixed child. + */ + @NotNull + RngMixed getMixed(); + + + /** + * Returns the value of the ref child. + * + * @return the value of the ref child. + */ + @NotNull + RngRef getRef(); + + + /** + * Returns the value of the parentRef child. + * + * @return the value of the parentRef child. + */ + @NotNull + RngParentRef getParentRef(); + + + /** + * Returns the value of the empty child. + * + * @return the value of the empty child. + */ + @NotNull + RngEmpty getEmpty(); + + + /** + * Returns the value of the text child. + * + * @return the value of the text child. + */ + @NotNull + RngText getText(); + + + /** + * Returns the value of the value child. + * + * @return the value of the value child. + */ + @NotNull + RngValue getValue(); + + + /** + * Returns the value of the data child. + * + * @return the value of the data child. + */ + @NotNull + RngData getData(); + + + /** + * Returns the value of the notAllowed child. + * + * @return the value of the notAllowed child. + */ + @NotNull + RngNotAllowed getNotAllowed(); + + + /** + * Returns the value of the externalRef child. + * + * @return the value of the externalRef child. + */ + @NotNull + RngExternalRef getExternalRef(); + + + /** + * Returns the value of the grammar child. + * + * @return the value of the grammar child. + */ + @NotNull + RngGrammar getGrammar(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOpenPatterns.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOpenPatterns.java new file mode 100644 index 000000000000..506d64794730 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOpenPatterns.java @@ -0,0 +1,316 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Pattern; + +import com.intellij.psi.xml.XmlElement; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 16.08.2007 + */ +public interface RngOpenPatterns extends RngDomElement, Pattern { + /** + * Returns the list of element children. + * + * @return the list of element children. + */ + @NotNull + java.util.List getElements(); + + /** + * Adds new child to the list of element children. + * + * @return created child + */ + RngElement addElement(); + + /** + * Returns the list of attribute children. + * + * @return the list of attribute children. + */ + @NotNull + List getAttributes(); + + /** + * Adds new child to the list of attribute children. + * + * @return created child + */ + RngAttribute addAttribute(); + + /** + * Returns the list of group children. + * + * @return the list of group children. + */ + @NotNull + List getGroups(); + + /** + * Adds new child to the list of group children. + * + * @return created child + */ + RngGroup addGroup(); + + /** + * Returns the list of interleave children. + * + * @return the list of interleave children. + */ + @NotNull + List getInterleaves(); + + /** + * Adds new child to the list of interleave children. + * + * @return created child + */ + RngInterleave addInterleave(); + + /** + * Returns the list of choice children. + * + * @return the list of choice children. + */ + @NotNull + List getChoices(); + + /** + * Adds new child to the list of choice children. + * + * @return created child + */ + RngChoice addChoice(); + + /** + * Returns the list of optional children. + * + * @return the list of optional children. + */ + @NotNull + List getOptionals(); + + /** + * Adds new child to the list of optional children. + * + * @return created child + */ + RngOptional addOptional(); + + /** + * Returns the list of zeroOrMore children. + * + * @return the list of zeroOrMore children. + */ + @NotNull + List getZeroOrMores(); + + /** + * Adds new child to the list of zeroOrMore children. + * + * @return created child + */ + RngZeroOrMore addZeroOrMore(); + + /** + * Returns the list of oneOrMore children. + * + * @return the list of oneOrMore children. + */ + @NotNull + List getOneOrMores(); + + /** + * Adds new child to the list of oneOrMore children. + * + * @return created child + */ + RngOneOrMore addOneOrMore(); + + /** + * Returns the list of list children. + * + * @return the list of list children. + */ + @NotNull + List getLists(); + + /** + * Adds new child to the list of list children. + * + * @return created child + */ + List addList(); + + /** + * Returns the list of mixed children. + * + * @return the list of mixed children. + */ + @NotNull + List getMixeds(); + + /** + * Adds new child to the list of mixed children. + * + * @return created child + */ + RngMixed addMixed(); + + /** + * Returns the list of ref children. + * + * @return the list of ref children. + */ + @NotNull + List getRefs(); + + /** + * Adds new child to the list of ref children. + * + * @return created child + */ + RngRef addRef(); + + /** + * Returns the list of parentRef children. + * + * @return the list of parentRef children. + */ + @NotNull + List getParentRefs(); + + /** + * Adds new child to the list of parentRef children. + * + * @return created child + */ + RngParentRef addParentRef(); + + /** + * Returns the list of empty children. + * + * @return the list of empty children. + */ + @NotNull + List getEmpties(); + + /** + * Adds new child to the list of empty children. + * + * @return created child + */ + RngEmpty addEmpty(); + + /** + * Returns the list of text children. + * + * @return the list of text children. + */ + @NotNull + List getTexts(); + + /** + * Adds new child to the list of text children. + * + * @return created child + */ + RngText addText(); + + /** + * Returns the list of value children. + * + * @return the list of value children. + */ + @NotNull + List getValues(); + + /** + * Adds new child to the list of value children. + * + * @return created child + */ + RngValue addValue(); + + /** + * Returns the list of data children. + * + * @return the list of data children. + */ + @NotNull + List getDatas(); + + /** + * Adds new child to the list of data children. + * + * @return created child + */ + RngData addData(); + + /** + * Returns the list of notAllowed children. + * + * @return the list of notAllowed children. + */ + @NotNull + List getNotAlloweds(); + + /** + * Adds new child to the list of notAllowed children. + * + * @return created child + */ + RngNotAllowed addNotAllowed(); + + /** + * Returns the list of externalRef children. + * + * @return the list of externalRef children. + */ + @NotNull + List getExternalRefs(); + + /** + * Adds new child to the list of externalRef children. + * + * @return created child + */ + RngExternalRef addExternalRef(); + + /** + * Returns the list of grammar children. + * + * @return the list of grammar children. + */ + @NotNull + List getGrammars(); + + /** + * Adds new child to the list of grammar children. + * + * @return created child + */ + RngGrammar addGrammar(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOptional.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOptional.java new file mode 100644 index 000000000000..a4f9e506f29b --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngOptional.java @@ -0,0 +1,27 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +/** + * http://relaxng.org/ns/structure/1.0:optionalElemType interface. + */ +public interface RngOptional extends RngOpenPatterns { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngParam.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngParam.java new file mode 100644 index 000000000000..a31c1ad8d9e7 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngParam.java @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import com.intellij.util.xml.GenericAttributeValue; +import com.intellij.util.xml.Required; +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:paramElemType interface. + */ +public interface RngParam extends RngDomElement { + + /** + * Returns the value of the simple content. + * + * @return the value of the simple content. + */ + @NotNull + @Required + String getValue(); + + /** + * Sets the value of the simple content. + * + * @param value the new value to set + */ + void setValue(@NotNull String value); + + + /** + * Returns the value of the name child. + * + * @return the value of the name child. + */ + @NotNull + @Required + GenericAttributeValue getName(); + + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngParentRef.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngParentRef.java new file mode 100644 index 000000000000..ed06e6ce2f57 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngParentRef.java @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Pattern; +import org.intellij.plugins.relaxNG.xml.dom.impl.RngReferenceConverter; + +import com.intellij.psi.xml.XmlElement; +import com.intellij.util.xml.GenericAttributeValue; +import com.intellij.util.xml.Referencing; +import com.intellij.util.xml.Required; +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:parentRefElemType interface. + */ + +public interface RngParentRef extends RngDomElement, Pattern { + + /** + * Returns the value of the name child. + * + * @return the value of the name child. + */ + @NotNull + @Required + @Referencing(RngReferenceConverter.class) + GenericAttributeValue getName(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngRef.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngRef.java new file mode 100644 index 000000000000..99eade03db6b --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngRef.java @@ -0,0 +1,41 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Define; +import org.intellij.plugins.relaxNG.model.Ref; +import org.intellij.plugins.relaxNG.xml.dom.impl.RngReferenceConverter; + +import com.intellij.psi.xml.XmlElement; +import com.intellij.util.xml.GenericAttributeValue; +import com.intellij.util.xml.Referencing; +import com.intellij.util.xml.Required; +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:refElemType interface. + */ +public interface RngRef extends RngDomElement, Ref { + + @NotNull + @Required + @Referencing(RngReferenceConverter.class) + GenericAttributeValue getName(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngStart.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngStart.java new file mode 100644 index 000000000000..e16aaa9d735f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngStart.java @@ -0,0 +1,37 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import com.intellij.util.xml.GenericAttributeValue; +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:startElemType interface. + */ +public interface RngStart extends RngDomElement, RngOpenPattern { + + /** + * Returns the value of the combine child. + * + * @return the value of the combine child. + */ + @NotNull + GenericAttributeValue getCombine(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngText.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngText.java new file mode 100644 index 000000000000..e12b9392f681 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngText.java @@ -0,0 +1,31 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Pattern; + +import com.intellij.psi.xml.XmlElement; + +/** + * http://relaxng.org/ns/structure/1.0:textElemType interface. + */ +public interface RngText extends RngDomElement, Pattern { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngValue.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngValue.java new file mode 100644 index 000000000000..5859cccfb050 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngValue.java @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +import org.intellij.plugins.relaxNG.model.Pattern; + +import com.intellij.psi.xml.XmlElement; +import com.intellij.util.xml.GenericAttributeValue; +import com.intellij.util.xml.Required; +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:valueElemType interface. + */ +public interface RngValue extends RngDomElement, Pattern { + + /** + * Returns the value of the simple content. + * + * @return the value of the simple content. + */ + @NotNull + @Required + String getValue(); + + /** + * Sets the value of the simple content. + * + * @param value the new value to set + */ + void setValue(@NotNull String value); + + + /** + * Returns the value of the type child. + * + * @return the value of the type child. + */ + @NotNull + GenericAttributeValue getType(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngZeroOrMore.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngZeroOrMore.java new file mode 100644 index 000000000000..90c03910694f --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/RngZeroOrMore.java @@ -0,0 +1,27 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom; + +/** + * http://relaxng.org/ns/structure/1.0:zeroOrMoreElemType interface. + */ +public interface RngZeroOrMore extends RngOpenPatterns { + +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/CreatePatternFix.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/CreatePatternFix.java new file mode 100644 index 000000000000..62c7ecc15d9c --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/CreatePatternFix.java @@ -0,0 +1,137 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom.impl; + +import org.intellij.plugins.relaxNG.ProjectLoader; +import org.intellij.plugins.relaxNG.xml.dom.RngGrammar; + +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiReference; +import com.intellij.psi.XmlElementFactory; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.XmlTag; +import com.intellij.psi.xml.XmlText; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 17.07.2007 + */ +// XXX: the tests rely on this still being an intention action +class CreatePatternFix implements IntentionAction, LocalQuickFix { + private final PsiReference myReference; + + public CreatePatternFix(PsiReference reference) { + myReference = reference; + } + + @NotNull + public String getText() { + return "Create Pattern '" + myReference.getCanonicalText() + "'"; + } + + @NotNull + public String getFamilyName() { + return "Create Pattern"; + } + + @NotNull + public String getName() { + return getText(); + } + + public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + if (!isAvailable()) { + return; + } + try { + doFix(); + } catch (IncorrectOperationException e) { + Logger.getInstance(getClass().getName()).error(e); + } + } + + public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { + return isAvailable(); + } + + private boolean isAvailable() { + if (!(myReference instanceof DefinitionReference) || !myReference.getElement().isValid()) { + return false; + } else { + final RngGrammar grammar = ((DefinitionReference)myReference).getScope(); + if (grammar == null) { + return false; + } else if (grammar.getXmlTag() == null) { + return false; + } + return true; + } + } + + public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + doFix(); + } + + private void doFix() throws IncorrectOperationException { + final XmlTag tag = PsiTreeUtil.getParentOfType(myReference.getElement(), XmlTag.class); + assert tag != null; + final XmlTag defineTag = tag.createChildTag("define", ProjectLoader.RNG_NAMESPACE, "\n \n", false); + defineTag.setAttribute("name", myReference.getCanonicalText()); + + final RngGrammar grammar = ((DefinitionReference)myReference).getScope(); + if (grammar == null) return; + final XmlTag root = grammar.getXmlTag(); + if (root == null) return; + + final XmlTag[] tags = root.getSubTags(); + for (XmlTag xmlTag : tags) { + if (PsiTreeUtil.isAncestor(xmlTag, tag, false)) { + final XmlElementFactory ef = XmlElementFactory.getInstance(tag.getProject()); + final XmlText text = ef.createDisplayText(" "); + final PsiElement e = root.addAfter(text, xmlTag); + + root.addAfter(defineTag, e); + return; + } + } + root.add(defineTag); + } + + public boolean startInWriteAction() { + return true; + } + + public static XmlTag getAncestorTag(XmlTag tag, String name, String namespace) { + if (tag == null) { + return null; + } + if (tag.getLocalName().equals(name) && tag.getNamespace().equals(namespace)) { + return tag; + } + return getAncestorTag(tag.getParentTag(), name, namespace); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/DefinitionReference.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/DefinitionReference.java new file mode 100644 index 000000000000..d527bb9e0e02 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/DefinitionReference.java @@ -0,0 +1,160 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom.impl; + +import org.intellij.plugins.relaxNG.model.Define; +import org.intellij.plugins.relaxNG.model.resolve.DefinitionResolver; +import org.intellij.plugins.relaxNG.xml.dom.RngGrammar; +import org.intellij.plugins.relaxNG.xml.dom.RngParentRef; + +import com.intellij.codeInsight.daemon.EmptyResolveMessageProvider; +import com.intellij.codeInsight.daemon.QuickFixProvider; +import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction; +import com.intellij.codeInsight.lookup.LookupValueFactory; +import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.LocalQuickFixProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementResolveResult; +import com.intellij.psi.PsiReferenceBase; +import com.intellij.psi.ResolveResult; +import com.intellij.psi.meta.PsiMetaOwner; +import com.intellij.psi.meta.PsiPresentableMetaData; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.psi.xml.XmlElement; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.xml.GenericAttributeValue; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.Set; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 18.08.2007 + */ +public class DefinitionReference extends PsiReferenceBase.Poly + implements QuickFixProvider, LocalQuickFixProvider, + EmptyResolveMessageProvider, Function { + + private final boolean myIsParentRef; + private final GenericAttributeValue myValue; + + public DefinitionReference(GenericAttributeValue value) { + super(value.getXmlAttributeValue()); + myValue = value; + myIsParentRef = value.getParent() instanceof RngParentRef; + } + + @Override + public boolean isSoft() { + return true; + } + + @NotNull + public ResolveResult[] multiResolve(boolean incompleteCode) { + final RngGrammar scope = getScope(); + if (scope == null) { + return ResolveResult.EMPTY_ARRAY; + } + + final Set set = DefinitionResolver.resolve(scope, myValue.getValue()); + if (set == null || set.size() == 0) return ResolveResult.EMPTY_ARRAY; + + return ContainerUtil.map2Array(set, ResolveResult.class, this); + } + + @Nullable + public RngGrammar getScope() { + RngGrammar scope = myValue.getParentOfType(RngGrammar.class, true); + if (scope == null) { + return null; + } + if (myIsParentRef) { + scope = scope.getParentOfType(RngGrammar.class, true); + } + return scope; + } + + public ResolveResult fun(Define define) { + final XmlElement xmlElement = (XmlElement)define.getPsiElement(); + assert xmlElement != null; + return new PsiElementResolveResult(xmlElement); + } + + @NotNull + public Object[] getVariants() { + final RngGrammar scope = getScope(); + if (scope == null) { + return ResolveResult.EMPTY_ARRAY; + } + + final Map> map = DefinitionResolver.getAllVariants(scope); + if (map == null || map.size() == 0) return ArrayUtil.EMPTY_OBJECT_ARRAY; + + return ContainerUtil.mapNotNull(map.values(), new Function, Object>() { + public Object fun(Set defines) { + final Define define = defines.iterator().next(); + if (defines.size() == 0) { + return null; + } else { + final PsiElement element = define.getPsiElement(); + if (element != null) { + final PsiPresentableMetaData data = (PsiPresentableMetaData)((PsiMetaOwner)element).getMetaData(); + if (data != null) { + return LookupValueFactory.createLookupValue(data.getName(), data.getIcon()); + } else { + return define.getName(); + } + } else { + return define.getName(); + } + } + } + }).toArray(); + } + + public LocalQuickFix[] getQuickFixes() { + final XmlTag tag = PsiTreeUtil.getParentOfType(getElement(), XmlTag.class); + assert tag != null; + final RngGrammar scope = myValue.getParentOfType(RngGrammar.class, true); + if (scope != null) { + return new LocalQuickFix[]{ new CreatePatternFix(this) }; + } + return LocalQuickFix.EMPTY_ARRAY; + } + + public void registerQuickfix(HighlightInfo info, final DefinitionReference reference) { + assert reference == this; + final XmlTag tag = PsiTreeUtil.getParentOfType(getElement(), XmlTag.class); + assert tag != null; + final RngGrammar scope = myValue.getParentOfType(RngGrammar.class, true); + if (scope != null) { + QuickFixAction.registerQuickFixAction(info, new CreatePatternFix(this)); + } + } + + public String getUnresolvedMessagePattern() { + return "Unresolved pattern reference ''{0}''"; + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngDefineImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngDefineImpl.java new file mode 100644 index 000000000000..a161db82e707 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngDefineImpl.java @@ -0,0 +1,53 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom.impl; + +import org.intellij.plugins.relaxNG.model.Pattern; +import org.intellij.plugins.relaxNG.xml.dom.RngDefine; + +import com.intellij.psi.PsiElement; +import com.intellij.util.xml.GenericAttributeValue; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 19.08.2007 + */ +public abstract class RngDefineImpl extends RngDomElementBase implements RngDefine { + public void setName(String name) { + final GenericAttributeValue value = getNameAttr(); + if (value.getStringValue() != null) { + value.setStringValue(name); + } + } + + public String getName() { + return getNameAttr().getValue(); + } + + public PsiElement getNameElement() { + return getNameAttr().getXmlAttributeValue(); + } + + public Pattern getPattern() { + return getPatternFrom(this); + } + + public void accept(Visitor visitor) { + visitor.visitDefine(this); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngDefineMetaData.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngDefineMetaData.java new file mode 100644 index 000000000000..d1ae988a7e6e --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngDefineMetaData.java @@ -0,0 +1,57 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom.impl; + +import org.intellij.plugins.relaxNG.xml.dom.RngDefine; + +import com.intellij.openapi.util.IconLoader; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.xml.DomMetaData; +import com.intellij.util.xml.GenericAttributeValue; +import com.intellij.util.xml.GenericDomValue; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 19.08.2007 + */ +public class RngDefineMetaData extends DomMetaData { + + @Nullable + protected GenericDomValue getNameElement(final RngDefine element) { + final GenericAttributeValue id = element.getNameAttr(); + if (id.getXmlElement() != null) { + return id; + } + return null; + } + + public void setName(final String name) throws IncorrectOperationException { + getElement().setName(name); + } + + public Icon getIcon() { + return IconLoader.findIcon("/nodes/property.png"); + } + + public String getTypeName() { + return "Pattern Definition"; + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngDomElementBase.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngDomElementBase.java new file mode 100644 index 000000000000..778378b37429 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngDomElementBase.java @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom.impl; + +import org.intellij.plugins.relaxNG.model.CommonElement; +import org.intellij.plugins.relaxNG.model.Div; +import org.intellij.plugins.relaxNG.model.Pattern; +import org.intellij.plugins.relaxNG.xml.dom.RngDomElement; + +import com.intellij.psi.xml.XmlElement; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.DomElementVisitor; +import com.intellij.util.xml.DomUtil; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 31.08.2007 + */ +public abstract class RngDomElementBase implements RngDomElement, Pattern { + public XmlElement getPsiElement() { + return getXmlElement(); + } + + public void accept(Visitor visitor) { + if (this instanceof Div) { + visitor.visitDiv((Div)this); // TODO fix me + } else { + visitor.visitElement(this); + } + } + + public void acceptChildren(final Visitor visitor) { + acceptChildren(new DomElementVisitor() { + public void visitDomElement(DomElement element) { + if (element instanceof CommonElement) { + ((CommonElement)element).accept(visitor); + } + } + }); + } + + protected static Pattern getPatternFrom(RngDomElement t) { + if (t == null) return null; + final List list = DomUtil.getChildrenOfType(t, Pattern.class); + return list.size() > 0 ? list.get(0) : null; + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngGrammarImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngGrammarImpl.java new file mode 100644 index 000000000000..b7c45ed0c260 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngGrammarImpl.java @@ -0,0 +1,36 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom.impl; + +import org.intellij.plugins.relaxNG.model.Pattern; +import org.intellij.plugins.relaxNG.xml.dom.RngGrammar; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 19.08.2007 + */ +public abstract class RngGrammarImpl extends RngDomElementBase implements RngGrammar { + @Override + public void accept(Visitor visitor) { + visitor.visitGrammar(this); + } + + public Pattern getStart() { + return getPatternFrom(getStartElement()); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngHrefConverter.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngHrefConverter.java new file mode 100644 index 000000000000..2bb4b03eb599 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngHrefConverter.java @@ -0,0 +1,68 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom.impl; + +import org.intellij.plugins.relaxNG.ProjectLoader; +import org.intellij.plugins.relaxNG.references.FileReferenceUtil; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.xml.*; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 18.08.2007 + */ +public class RngHrefConverter extends Converter implements CustomReferenceConverter { + public XmlFile fromString(@Nullable @NonNls String s, ConvertContext context) { + if (s != null) { + final GenericAttributeValue element = (GenericAttributeValue)context.getInvocationElement(); + final PsiReference[] references = createReferences(element, element.getXmlAttributeValue(), context); + if (references.length > 0) { + PsiElement result = references[references.length - 1].resolve(); + if (result instanceof XmlFile) { + return (XmlFile)result; + } + } + } + return null; + } + + public String toString(@Nullable XmlFile psiFile, ConvertContext context) { + return psiFile == null ? null : psiFile.getName(); + } + + @NotNull + public PsiReference[] createReferences(GenericDomValue genericDomValue, PsiElement element, ConvertContext context) { + final String s = genericDomValue.getStringValue(); + if (s == null || element == null) { + return PsiReference.EMPTY_ARRAY; + } + final FileReferenceSet set = FileReferenceSet.createSet(element, false, false, false); + if (set != null) { + return FileReferenceUtil.restrict(set, FileReferenceUtil.byNamespace(ProjectLoader.RNG_NAMESPACE), true); + } else { + return PsiReference.EMPTY_ARRAY; + } + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngIncludeImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngIncludeImpl.java new file mode 100644 index 000000000000..d3a53beae12b --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngIncludeImpl.java @@ -0,0 +1,50 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom.impl; + +import org.intellij.plugins.relaxNG.xml.dom.RngDefine; +import org.intellij.plugins.relaxNG.xml.dom.RngInclude; + +import com.intellij.psi.PsiFile; +import com.intellij.util.xml.DomUtil; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 19.08.2007 + */ +public abstract class RngIncludeImpl extends RngDomElementBase implements RngInclude { + @Override + public void accept(Visitor visitor) { + visitor.visitInclude(this); + } + + public PsiFile getInclude() { + return getIncludedFile().getValue(); + } + + @NotNull + public RngDefine[] getOverrides() { + // TODO: include stuff inside DIVs - fix when this is actually used + final List defines = DomUtil.getChildrenOfType(this, RngDefine.class); + return defines.toArray(new RngDefine[defines.size()]); + } +} \ No newline at end of file diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngRefImpl.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngRefImpl.java new file mode 100644 index 000000000000..f4b74c9c23cf --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngRefImpl.java @@ -0,0 +1,66 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom.impl; + +import org.intellij.plugins.relaxNG.model.Define; +import org.intellij.plugins.relaxNG.model.resolve.DefinitionResolver; +import org.intellij.plugins.relaxNG.xml.dom.RngGrammar; +import org.intellij.plugins.relaxNG.xml.dom.RngRef; + +import com.intellij.psi.xml.XmlAttributeValue; + +import java.util.Set; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 05.09.2007 + */ +public abstract class RngRefImpl extends RngDomElementBase implements RngRef { + @Override + public void accept(Visitor visitor) { + visitor.visitRef(this); + } + + public Define getPattern() { + final XmlAttributeValue value = getName().getXmlAttributeValue(); + if (value == null) return null; + + final String name = getReferencedName(); + if (name == null) { + return null; + } + + final RngGrammar scope = getScope(); + if (scope == null) { + return null; + } + + final Set defines = DefinitionResolver.resolve(scope, name); + + // TODO: honor combine & return virtual element if defines.size() > 1 + return defines != null && defines.size() > 0 ? defines.iterator().next() : null; + } + + protected RngGrammar getScope() { + return getParentOfType(RngGrammar.class, true); + } + + public String getReferencedName() { + return getName().getValue(); + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngReferenceConverter.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngReferenceConverter.java new file mode 100644 index 000000000000..bb2c27bfa92b --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/impl/RngReferenceConverter.java @@ -0,0 +1,104 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG.xml.dom.impl; + +import org.intellij.plugins.relaxNG.model.Define; +import org.intellij.plugins.relaxNG.model.resolve.DefinitionResolver; +import org.intellij.plugins.relaxNG.xml.dom.RngDefine; +import org.intellij.plugins.relaxNG.xml.dom.RngDomVisitor; +import org.intellij.plugins.relaxNG.xml.dom.RngGrammar; +import org.intellij.plugins.relaxNG.xml.dom.RngInclude; + +import com.intellij.openapi.util.Ref; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.psi.PsiReferenceBase; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.ArrayUtil; +import com.intellij.util.xml.*; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; +import java.util.Set; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 18.08.2007 + */ +public class RngReferenceConverter implements CustomReferenceConverter { + @NotNull + public PsiReference[] createReferences(GenericDomValue genericDomValue, PsiElement element, ConvertContext context) { + final GenericAttributeValue e = (GenericAttributeValue)genericDomValue; + + if (genericDomValue.getParent() instanceof RngDefine) { + final XmlAttributeValue value = e.getXmlAttributeValue(); + if (value == null) { + return PsiReference.EMPTY_ARRAY; + } + + return new PsiReference[]{ + new PsiReferenceBase(value, TextRange.from(1, value.getTextLength() - 2), true) { + public PsiElement resolve() { +// final XmlTag tag = PsiTreeUtil.getParentOfType(value, XmlTag.class); +// final XmlTag include = getAncestorTag(tag, "include", ProjectLoader.RNG_NAMESPACE); +// final XmlTag grammar = getAncestorTag(tag, "grammar", ProjectLoader.RNG_NAMESPACE); +// +// if (include != null && (grammar == null || PsiTreeUtil.isAncestor(grammar, include, true))) { +// final ResolveResult[] e = new DefinitionReference(getElement(), false).multiResolve(false); +// } + return myElement.getParent().getParent(); + } + + @NotNull + public Object[] getVariants() { + final RngInclude include = e.getParentOfType(RngInclude.class, true); + final RngGrammar scope = e.getParentOfType(RngGrammar.class, true); + if (scope != null && include != null && DomUtil.isAncestor(scope, include, true)) { + final XmlFile file = include.getIncludedFile().getValue(); + if (file != null) { + final DomFileElement fileElement = scope.getManager().getFileElement(file, DomElement.class); + if (fileElement == null) { + return EMPTY_ARRAY; + } + + final Ref ref = new Ref(ArrayUtil.EMPTY_STRING_ARRAY); + fileElement.acceptChildren(new RngDomVisitor(){ + @Override + public void visit(RngGrammar grammar) { + final Map> map = DefinitionResolver.getAllVariants(grammar); + if (map != null) { + ref.set(map.keySet().toArray()); + } + } + }); + return ref.get(); + } + } + return ArrayUtil.EMPTY_STRING_ARRAY; // TODO: look for unresolved refs; + } + } + }; + } + + return new PsiReference[]{ + new DefinitionReference(e) + }; + } +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/AnyName.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/AnyName.java new file mode 100644 index 000000000000..933c4ad6bcde --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/AnyName.java @@ -0,0 +1,39 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom.names; + +import org.intellij.plugins.relaxNG.xml.dom.RngDomElement; + +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:anyNameElemType interface. + */ +public interface AnyName extends RngDomElement { + + + /** + * Returns the list of except children. + * + * @return the list of except children. + */ + @NotNull + OpenNameClasses getExcept(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/Name.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/Name.java new file mode 100644 index 000000000000..36fce67a6de9 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/Name.java @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom.names; + +import org.intellij.plugins.relaxNG.xml.dom.RngDomElement; + +import com.intellij.util.xml.Required; +import org.jetbrains.annotations.NotNull; + +/** + * http://relaxng.org/ns/structure/1.0:nameElemType interface. + */ +public interface Name extends RngDomElement { + + /** + * Returns the value of the simple content. + * + * @return the value of the simple content. + */ + @NotNull + @Required + String getValue(); + + /** + * Sets the value of the simple content. + * + * @param value the new value to set + */ + void setValue(@NotNull String value); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/NsName.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/NsName.java new file mode 100644 index 000000000000..15683c0d8622 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/NsName.java @@ -0,0 +1,35 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom.names; + +import org.intellij.plugins.relaxNG.xml.dom.RngDomElement; + +/** + * http://relaxng.org/ns/structure/1.0:nsNameElemType interface. + */ +public interface NsName extends RngDomElement { + + /** + * Returns the list of except children. + * + * @return the list of except children. + */ + OpenNameClasses getExcept(); +} diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/OpenNameClasses.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/OpenNameClasses.java new file mode 100644 index 000000000000..497b8ccac976 --- /dev/null +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/xml/dom/names/OpenNameClasses.java @@ -0,0 +1,82 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Generated on Fri Aug 10 16:21:20 CEST 2007 +// DTD/Schema : http://relaxng.org/ns/structure/1.0 + +package org.intellij.plugins.relaxNG.xml.dom.names; + +import org.intellij.plugins.relaxNG.xml.dom.RngChoice; +import org.intellij.plugins.relaxNG.xml.dom.RngDomElement; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * http://relaxng.org/ns/structure/1.0:open-name-classes interface. + */ +public interface OpenNameClasses extends RngDomElement { + + /** + * Returns the value of the name child. + * + * @return the value of the name child. + */ + @NotNull + Name getName(); + + /** + * Returns the value of the anyName child. + * + * @return the value of the anyName child. + */ + @NotNull + AnyName getAnyName(); + + + /** + * Returns the value of the nsName child. + * + * @return the value of the nsName child. + */ + @NotNull + NsName getNsName(); + + +// /** +// * Returns the value of the choice child. +// * +// * @return the value of the choice child. +// */ +// @NotNull +// RngChoice getChoice(); + + /** + * Returns the list of choice children. + * + * @return the list of choice children. + */ + @NotNull + List getChoices(); + + /** + * Adds new child to the list of choice children. + * + * @return created child + */ + RngChoice addChoice(); +} diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/AbstractIndexTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/AbstractIndexTest.java new file mode 100644 index 000000000000..ddf45aeb8ab9 --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/AbstractIndexTest.java @@ -0,0 +1,32 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import com.intellij.testFramework.fixtures.CodeInsightTestFixture; +import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 04.12.2007 +*/ +public abstract class AbstractIndexTest extends HighlightingTestBase { + + protected final CodeInsightTestFixture createFixture(IdeaTestFixtureFactory factory) { + return createContentFixture(factory); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/AbstractParsingTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/AbstractParsingTest.java new file mode 100644 index 000000000000..9bc0f75ce406 --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/AbstractParsingTest.java @@ -0,0 +1,50 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import com.intellij.javaee.ExternalResourceManagerEx; +import com.intellij.openapi.application.PluginPathManager; +import com.intellij.openapi.application.Result; +import com.intellij.openapi.application.WriteAction; +import com.intellij.testFramework.ParsingTestCase; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 24.08.2007 +*/ +public abstract class AbstractParsingTest extends ParsingTestCase { + public AbstractParsingTest(String s) { + super(s, "rnc"); + } + + protected String getTestDataPath() { + return PluginPathManager.getPluginHomePath("relaxng") + "/testData/parsing"; + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + new WriteAction() { + protected void run(Result result) throws Throwable { + new ApplicationLoader().initComponent(); + new ProjectLoader(getProject()).initComponent(); + ExternalResourceManagerEx.getInstanceEx().addIgnoredResource("urn:test:undefined"); + } + }.execute(); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/AttributeCompletionTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/AttributeCompletionTest.java new file mode 100644 index 000000000000..77386a31f947 --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/AttributeCompletionTest.java @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import org.intellij.plugins.testUtil.CopyFile; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 07.08.2007 +*/ +@CopyFile("*.rng") +public class AttributeCompletionTest extends HighlightingTestBase { + public String getTestDataPath() { + return "completion"; + } + + public void testAttributeCompletion1() throws Throwable { + doTestCompletion("attribute-completion-1.xml", new String[]{ "foo" }); + } + + public void testAttributeCompletion2() throws Throwable { + doTestCompletion("attribute-completion-2.xml", new String[]{ "1.0" }); + } + + public void testAttributeCompletion3() throws Throwable { + doTestCompletion("attribute-completion-3.xml", "1.0", "2.0"); + } + + public void testAttributeCompletion4() throws Throwable { + doTestCompletion("attribute-completion-4.xml", "1.0", "2.0"); + } + + public void testAttributeCompletion5() throws Throwable { + doTestCompletion("attribute-completion-5.xml", "foo", "bar"); + } + + public void testAttributeCompletion6() throws Throwable { + doTestCompletion("attribute-completion-6.xml", "p:foo", "p:bar"); + } + + public void testAttrCombine() throws Throwable { + doTestCompletion("attr-combine.xml", "foo", "bar"); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/ElementCompletionTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/ElementCompletionTest.java new file mode 100644 index 000000000000..867c4ad3235f --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/ElementCompletionTest.java @@ -0,0 +1,50 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import org.intellij.plugins.testUtil.CopyFile; + +import com.intellij.application.options.editor.WebEditorOptions; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 07.08.2007 +*/ +@CopyFile("element-completion.rng") +public class ElementCompletionTest extends HighlightingTestBase { + public String getTestDataPath() { + return "completion"; + } + + public void testElementCompletionRoot() throws Throwable { + doTestCompletion("element-completion-root.xml", "completion-1", "completion-2", "completion-3", "x"); + } + + public void testElementCompletion1() throws Throwable { + doTestCompletion("element-completion-1.xml", new String[]{ "foo" }); + } + + public void testElementCompletion2() throws Throwable { + doTestCompletion("element-completion-2.xml", "foo", "bar", "baz"); + } + + public void testElementCompletion3() throws Throwable { + WebEditorOptions.getInstance().setAutomaticallyInsertRequiredAttributes(false); + doTestCompletion("element-completion-3", "xml"); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/ExternalRncParsingTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/ExternalRncParsingTest.java new file mode 100644 index 000000000000..c1928b8a1eee --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/ExternalRncParsingTest.java @@ -0,0 +1,60 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 07.08.2007 +*/ +public class ExternalRncParsingTest extends HighlightingTestBase { + public String getTestDataPath() { + return "parsing"; + } + + public void testParseSimple() throws Throwable { + doTestHighlighting("simple.rnc"); + } + + public void testParseEscaped() throws Throwable { + doTestHighlighting("escaped.rnc"); + } + + public void testParseEscapedBroken1() throws Throwable { + doTestHighlighting("escaped-broken-1.rnc"); + } + + public void testParseEscapedBroken2() throws Throwable { + doTestHighlighting("escaped-broken-2.rnc"); + } + + public void testParseEscapedBroken3() throws Throwable { + doTestHighlighting("escaped-broken-3.rnc"); + } + + public void testParseEscapedBroken4() throws Throwable { + doTestHighlighting("escaped-broken-4.rnc"); + } + + public void testParseEscapedBroken5() throws Throwable { + doTestHighlighting("escaped-broken-5.rnc"); + } + + private void doTestHighlighting(String s) throws Throwable { + doExternalToolHighlighting(s); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/HighlightingTestBase.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/HighlightingTestBase.java new file mode 100644 index 000000000000..6a2c4144d43d --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/HighlightingTestBase.java @@ -0,0 +1,296 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import com.intellij.openapi.application.PluginPathManager; +import com.intellij.openapi.util.io.FileUtil; +import org.intellij.plugins.relaxNG.inspections.RngDomInspection; +import org.intellij.plugins.testUtil.IdeaCodeInsightTestCase; +import org.intellij.plugins.testUtil.ResourceUtil; + +import com.intellij.codeHighlighting.TextEditorHighlightingPass; +import com.intellij.codeInsight.daemon.QuickFixProvider; +import com.intellij.codeInsight.daemon.impl.*; +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.codeInspection.InspectionToolProvider; +import com.intellij.codeInspection.htmlInspections.RequiredAttributesInspection; +import com.intellij.javaee.ExternalResourceManagerEx; +import com.intellij.mock.MockProgressIndicator; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.Result; +import com.intellij.openapi.application.WriteAction; +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.*; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiReference; +import com.intellij.testFramework.ExpectedHighlightingData; +import com.intellij.testFramework.builders.EmptyModuleFixtureBuilder; +import com.intellij.testFramework.fixtures.CodeInsightTestFixture; +import com.intellij.testFramework.fixtures.IdeaProjectTestFixture; +import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; +import com.intellij.testFramework.fixtures.TestFixtureBuilder; +import com.intellij.util.ArrayUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import junit.framework.TestCase; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static com.intellij.openapi.util.io.FileUtil.delete; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 25.07.2007 + */ +public abstract class HighlightingTestBase extends TestCase implements IdeaCodeInsightTestCase { + private static final File ourTempPath; + + private static final String JAVA_IO_TMPDIR = "java.io.tmpdir"; + + static { + // IDEA leaves bazillions of "ideaXXXX.ipr" files and "unitTestXXXX.tmp" directories in the temp directory + ourTempPath = new File(new File(System.getProperty(JAVA_IO_TMPDIR, "/tmp")), "test" + System.identityHashCode(Object.class)); + ourTempPath.mkdirs(); + + try { + System.setProperty(JAVA_IO_TMPDIR, ourTempPath.getCanonicalPath()); + Runtime.getRuntime().addShutdownHook(new Thread("Cleanup Temp") { + @Override + public void run() { + delete(ourTempPath); + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + } + + protected CodeInsightTestFixture myTestFixture; + + protected void setUp() throws Exception { + final IdeaTestFixtureFactory factory = IdeaTestFixtureFactory.getFixtureFactory(); + + myTestFixture = createFixture(factory); + + myTestFixture.setTestDataPath(getTestDataBasePath() + getTestDataPath()); + + InspectionToolProvider[] loaders; + if (getName().contains("Inspection")) { + loaders = new InspectionToolProvider[]{ + new ApplicationLoader(), + new DefaultInspectionProvider() + }; + } else { + loaders = new InspectionToolProvider[]{ + new DefaultInspectionProvider() + }; + } + + myTestFixture.setUp(); + + myTestFixture.enableInspections(loaders); + + new WriteAction() { + protected void run(Result result) throws Throwable { + ResourceUtil.copyFiles(HighlightingTestBase.this); + init(); + } + }.execute(); + } + + protected static String toAbsolutePath(String relativeTestDataPath) { + return FileUtil.toSystemDependentName(getTestDataBasePath() + relativeTestDataPath); + } + + public static String getTestDataBasePath() { + return PluginPathManager.getPluginHomePath("relaxng") + "/testData/"; + } + + protected CodeInsightTestFixture createFixture(IdeaTestFixtureFactory factory) { + final TestFixtureBuilder builder = factory.createLightFixtureBuilder(); + final IdeaProjectTestFixture fixture = builder.getFixture(); + + final CodeInsightTestFixture testFixture; + testFixture = factory.createCodeInsightFixture(fixture); + + return testFixture; + } + + protected CodeInsightTestFixture createContentFixture(IdeaTestFixtureFactory factory) { + final TestFixtureBuilder builder = factory.createFixtureBuilder(); + final EmptyModuleFixtureBuilder moduleBuilder = builder.addModule(EmptyModuleFixtureBuilder.class); + final IdeaProjectTestFixture fixture = builder.getFixture(); + + final CodeInsightTestFixture testFixture; + testFixture = factory.createCodeInsightFixture(fixture); + + final String root = testFixture.getTempDirPath(); + moduleBuilder.addContentRoot(root); + moduleBuilder.addSourceRoot("/"); + + return testFixture; + } + + public CodeInsightTestFixture getFixture() { + return myTestFixture; + } + + public abstract String getTestDataPath(); + + protected void init() { + ExternalResourceManagerEx.getInstanceEx().addIgnoredResource("urn:test:undefined"); + } + + protected void tearDown() throws Exception { + myTestFixture.tearDown(); + } + + protected void doHighlightingTest(String s) throws Throwable { + doCustomHighlighting(s, true, false); +// myTestFixture.testHighlighting(true, false, true, s); + } + + protected void doExternalToolHighlighting(String name) throws Throwable { + doCustomHighlighting(name, true, true); + } + + protected void doCustomHighlighting(String name, final boolean checkWeakWarnings, final Boolean includeExternalToolPass) throws Throwable { + myTestFixture.configureByFile(name); + + final PsiFile file = myTestFixture.getFile(); + new WriteCommandAction(myTestFixture.getProject(), file) { + protected void run(Result result) throws Throwable { + final Document doc = myTestFixture.getEditor().getDocument(); + ExpectedHighlightingData data = new ExpectedHighlightingData(doc, true, checkWeakWarnings, false, file); + PsiDocumentManager.getInstance(myTestFixture.getProject()).commitAllDocuments(); + + Collection highlights1 = doHighlighting(includeExternalToolPass); + + data.checkResult(highlights1, doc.getText()); + } + }.execute(); + } + + @NotNull + private Collection doHighlighting(final Boolean includeExternalToolPass) { + final Project project = myTestFixture.getProject(); + PsiDocumentManager.getInstance(project).commitAllDocuments(); + + return ApplicationManager.getApplication().runReadAction(new Computable>() { + public Collection compute() { + final Editor editor = myTestFixture.getEditor(); + final List passes = + TextEditorHighlightingPassRegistrarEx.getInstanceEx(project).instantiatePasses(myTestFixture.getFile(), editor, ArrayUtil.EMPTY_INT_ARRAY); + final MockProgressIndicator progress = new MyMockProgressIndicator(); + + Runnable runnable = new Runnable() { + public void run() { + for (TextEditorHighlightingPass pass : passes) { + if (includeExternalToolPass == null) { + pass.collectInformation(progress); + } else { + if (includeExternalToolPass == pass instanceof ExternalToolPass) { + pass.collectInformation(progress); + } + } + } + for (TextEditorHighlightingPass pass : passes) { + if (includeExternalToolPass == null) { + pass.applyInformationToEditor(); + } else { + if (includeExternalToolPass == pass instanceof ExternalToolPass) { + pass.applyInformationToEditor(); + } + } + } + } + }; + ProgressManager.getInstance().runProcess(runnable, progress); + List infos = DaemonCodeAnalyzerImpl.getHighlights(editor.getDocument(), project); + return infos == null ? Collections.emptyList() : new ArrayList(infos); + } + }); + } + + protected void doTestCompletion(String name, String ext) throws Throwable { + myTestFixture.testCompletion(name + "." + ext, name + "_after." + ext); + } + + protected void doTestCompletion(String before, String... variants) throws Throwable { + myTestFixture.testCompletionVariants(before, variants); + } + + protected void doTestCompletion(String before) throws Throwable { + doTestCompletion(before, "xml"); + } + + protected void doTestRename(String name, String ext, String newName) throws Throwable { + myTestFixture.testRename(name + "." + ext, name + "_after." + ext, newName); + } + + @SuppressWarnings({ "deprecation", "unchecked" }) + protected void doTestQuickFix(String file, String ext) throws Throwable { + final PsiReference psiReference = myTestFixture.getReferenceAtCaretPositionWithAssertion(file + "." + ext); + assertNull("Reference", psiReference.resolve()); + assertTrue("QuickFixProvider", psiReference instanceof QuickFixProvider); + + final HighlightInfo info = HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, 0, 0, ""); + ((QuickFixProvider)psiReference).registerQuickfix(info, psiReference); + assertTrue("One action expected", info.quickFixActionRanges.size() == 1); + + final Pair rangePair = info.quickFixActionRanges.get(0); + final IntentionAction action = rangePair.first.getAction(); + + assertTrue("action is enabled", action.isAvailable(myTestFixture.getProject(), myTestFixture.getEditor(), myTestFixture.getFile())); + myTestFixture.launchAction(action); + + myTestFixture.checkResultByFile(file + "_after." + ext); + } + + private static class DefaultInspectionProvider implements InspectionToolProvider { + public Class[] getInspectionClasses() { + return new Class[]{ + RngDomInspection.class, + RequiredAttributesInspection.class + }; + } + } + + private static class MyMockProgressIndicator extends MockProgressIndicator implements UserDataHolder { + private final UserDataHolderBase myHolder = new UserDataHolderBase(); + + public T getUserData(@NotNull Key key) { + return myHolder.getUserData(key); + } + + public void putUserData(@NotNull Key key, @Nullable T value) { + myHolder.putUserData(key, value); + } + } +} diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncAnnotationParsingTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncAnnotationParsingTest.java new file mode 100644 index 000000000000..40a7edc359ea --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncAnnotationParsingTest.java @@ -0,0 +1,52 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 07.08.2007 +*/ +public class RncAnnotationParsingTest extends AbstractParsingTest { + public RncAnnotationParsingTest() { + super("annotations"); + } + + public void testSimple1() throws Throwable { + doTest(true); + } + + public void testSimple2() throws Throwable { + doTest(true); + } + + public void testNested() throws Throwable { + doTest(true); + } + + public void testGrammarLevel() throws Throwable { + doTest(true); + } + + public void testFollowing() throws Throwable { + doTest(true); + } + + public void testFollowingIncomplete() throws Throwable { + doTest(true); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncCompletionTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncCompletionTest.java new file mode 100644 index 000000000000..971b3da695f7 --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncCompletionTest.java @@ -0,0 +1,55 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import org.intellij.plugins.testUtil.CopyFile; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 22.08.2007 + */ +public class RncCompletionTest extends HighlightingTestBase { + public String getTestDataPath() { + return "completion/rnc"; + } + + public void testCompleteKeyword1() throws Throwable { + doTestCompletion("complete-keyword-1", "rnc"); + } + + public void testCompleteKeyword2() throws Throwable { + doTestCompletion("complete-keyword-2", "rnc"); + } + + public void testCompleteRef1() throws Throwable { + doTestCompletion("complete-ref-1", "rnc"); + } + + public void testCompleteRef2() throws Throwable { + doTestCompletion("complete-ref-2", "rnc"); + } + + @CopyFile("included.rnc") + public void testCompleteRef3() throws Throwable { + doTestCompletion("complete-ref-3", "rnc"); + } + + public void testCompleteRef4() throws Throwable { + doTestCompletion("complete-ref-4", "rnc"); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncExternalHighlightingTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncExternalHighlightingTest.java new file mode 100644 index 000000000000..da70d9f62ae5 --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncExternalHighlightingTest.java @@ -0,0 +1,57 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import org.intellij.plugins.testUtil.CopyFile; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 25.07.2007 + */ +public class RncExternalHighlightingTest extends HighlightingTestBase { + + public String getTestDataPath() { + return "highlighting/rnc"; + } + + protected void init() { +// new ProjectLoader(myTestFixture.getProject()).initComponent(); +// ExternalResourceManager.getInstance().addResource("http://relaxng.org/ns/structure/1.0", new File("highlighting/relaxng.rng").getAbsolutePath()); + } + + public void testAddressBook() throws Throwable { + doExternalToolHighlighting("addressbook.rnc"); + } + + public void testMissingContent() throws Throwable { + doExternalToolHighlighting("missing-content.rnc"); + } + + @CopyFile("included.rnc") + public void testMissingStart() throws Throwable { + doExternalToolHighlighting("missing-start.rnc"); + } + + public void testUndefinedRef() throws Throwable { + doExternalToolHighlighting("undefined-ref-ok.rnc"); + } + + public void testRngSchema() throws Throwable { + doExternalToolHighlighting("rng-schema.rnc"); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncHighlightingTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncHighlightingTest.java new file mode 100644 index 000000000000..9ee02c87f5a7 --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncHighlightingTest.java @@ -0,0 +1,125 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import org.intellij.plugins.testUtil.CopyFile; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 25.07.2007 + */ +public class RncHighlightingTest extends HighlightingTestBase { + + public String getTestDataPath() { + return "highlighting/rnc"; + } + + public void testRef3() throws Throwable { + doHighlightingTest("ref-3.rnc"); + } + + public void testUndefinedRef() throws Throwable { + doHighlightingTest("undefined-ref.rnc"); + } + + public void testCreateDefintion1() throws Throwable { + doTestQuickFix("create-definition-1", "rnc"); + } + + public void testCreateDefintion2() throws Throwable { + doTestQuickFix("create-definition-2", "rnc"); + } + + public void testNsPrefix() throws Throwable { + doHighlightingTest("ns-prefix.rnc"); + } + + public void testNsPrefixKeyword() throws Throwable { + doHighlightingTest("ns-prefix-keyword.rnc"); + } + + public void testUnresolvedNsPrefix1() throws Throwable { + doHighlightingTest("unresolved-ns-prefix-1.rnc"); + } + + public void testUnresolvedNsPrefix2() throws Throwable { + doHighlightingTest("unresolved-ns-prefix-2.rnc"); + } + + public void testUnresolvedNsPrefix3() throws Throwable { + doHighlightingTest("unresolved-ns-prefix-3.rnc"); + } + + public void testCreateNsPrefix() throws Throwable { + doTestQuickFix("create-ns-prefix-1", "rnc"); + } + + public void testDatatypePrefix() throws Throwable { + doHighlightingTest("datatype-prefix.rnc"); + } + + public void testUnresolvedDatatypePrefix1() throws Throwable { + doHighlightingTest("unresolved-datatype-prefix-1.rnc"); + } + + public void testUnresolvedDatatypePrefix2() throws Throwable { + doHighlightingTest("unresolved-datatype-prefix-2.rnc"); + } + + public void testCreateDatatypesPrefix() throws Throwable { + doTestQuickFix("create-datatypes-prefix-1", "rnc"); + } + + public void testUnresolvedInclude() throws Throwable { + doHighlightingTest("unresolved-include.rnc"); + } + + public void testParentRef() throws Throwable { + doHighlightingTest("parent-ref.rnc"); + } + + public void testBadParentRef1() throws Throwable { + doHighlightingTest("bad-parent-ref-1.rnc"); + } + + public void testAnnotation() throws Throwable { + doHighlightingTest("annotation.rnc"); + } + + @CopyFile("fo/*.rnc") + public void testFoMain() throws Throwable { + doHighlightingTest("fo/main.rnc"); + } + + @CopyFile("fo/*.rnc") + public void testFoElements() throws Throwable { + doHighlightingTest("fo/elements.rnc"); + } + + public void testFoDatatype() throws Throwable { + doHighlightingTest("fo/datatype.rnc"); + } + + public void testRngSchema() throws Throwable { + doHighlightingTest("rng-schema.rnc"); + } + + public void testDocbook() throws Throwable { + doHighlightingTest("docbook.rnc"); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncIndexHighlightingTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncIndexHighlightingTest.java new file mode 100644 index 000000000000..e936352b5b8f --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncIndexHighlightingTest.java @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import org.intellij.plugins.testUtil.CopyFile; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 25.07.2007 + */ +@CopyFile("*.rnc") +public class RncIndexHighlightingTest extends AbstractIndexTest { + + public String getTestDataPath() { + return "highlighting/rnc"; + } + + public void testBackwardIncludeRef() throws Throwable { + doHighlightingTest("backward-include-ref.rnc"); + } + + public void testInspectionUnusedDefine() throws Throwable { + doHighlightingTest("unused-define.rnc"); + } + + public void testInspectionSuppressedUnusedDefine() throws Throwable { + doHighlightingTest("suppressed-unused-define.rnc"); + } + + public void testInspectionUsedDefine() throws Throwable { + doHighlightingTest("used-define.rnc"); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncParsingTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncParsingTest.java new file mode 100644 index 000000000000..f043b97fccbc --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncParsingTest.java @@ -0,0 +1,52 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 07.08.2007 +*/ +public class RncParsingTest extends AbstractParsingTest { + public RncParsingTest() { + super("complex"); + } + + public void testMain() throws Throwable { + doTest(true); + } + + public void testElements() throws Throwable { + doTest(true); + } + + public void testProperties() throws Throwable { + doTest(true); + } + + public void testDatatype() throws Throwable { + doTest(true); + } + + public void testRelaxNG() throws Throwable { + doTest(true); + } + + public void testDocbook() throws Throwable { + doTest(true); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncRenameTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncRenameTest.java new file mode 100644 index 000000000000..b7ef6b07d78f --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RncRenameTest.java @@ -0,0 +1,99 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.refactoring.RefactoringFactory; +import com.intellij.refactoring.RenameRefactoring; +import com.intellij.testFramework.fixtures.CodeInsightTestFixture; +import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; + +import java.io.File; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 25.07.2007 + */ +public class RncRenameTest extends HighlightingTestBase { + + protected CodeInsightTestFixture createFixture(IdeaTestFixtureFactory factory) { + return createContentFixture(factory); + } + + public String getTestDataPath() { + return "rename/rnc"; + } + + public void testRenameDefintion1() throws Throwable { + doTestRename("rename-definition-1", "bar"); + } + + public void testRenameDefintion2() throws Throwable { + doTestRename("rename-definition-2", "element"); + } + + public void testRenameDefintion3() throws Throwable { + doTestRename("rename-definition-3", "bar"); + } + + public void testRenameNsPrefix1() throws Throwable { + doTestRename("rename-ns-prefix-1", "bar"); + } + + public void testRenameDatatypePrefix1() throws Throwable { + doTestRename("rename-datatype-prefix-1", "bar"); + } + + public void testRenameIncludedFile() throws Throwable { + myTestFixture.copyFileToProject("rename-in-include-ref.rnc"); + + final Project project = myTestFixture.getProject(); + final RefactoringFactory factory = RefactoringFactory.getInstance(project); + + String fullPath = myTestFixture.getTempDirPath() + "/" + "rename-in-include-ref.rnc"; + + final VirtualFile copy = LocalFileSystem.getInstance().refreshAndFindFileByPath(fullPath.replace(File.separatorChar, '/')); + assert copy != null : "file " + fullPath + " not found"; + + final PsiFile file = PsiManager.getInstance(project).findFile(copy); + assertNotNull(file); + + new WriteCommandAction.Simple(project) { + protected void run() throws Throwable { + myTestFixture.configureByFile("rename-in-include.rnc"); + final RenameRefactoring refactoring = factory.createRename(file, "rename-after.rnc"); + refactoring.setPreviewUsages(false); + refactoring.setSearchInComments(false); + refactoring.setSearchInNonJavaFiles(true); + refactoring.run(); + myTestFixture.checkResultByFile("rename-in-include_after.rnc"); + } + }.execute().throwException(); + + assertEquals("rename-after.rnc", file.getName()); + } + + private void doTestRename(String name, String newName) throws Throwable { + doTestRename(name, "rnc", newName); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/RngCompletionTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RngCompletionTest.java new file mode 100644 index 000000000000..1eeeec1fd16d --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RngCompletionTest.java @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import org.intellij.plugins.testUtil.CopyFile; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 22.08.2007 + */ +public class RngCompletionTest extends HighlightingTestBase { + public String getTestDataPath() { + return "completion/rng"; + } + + public void testCompleteRef1() throws Throwable { + doTestCompletion("complete-ref-1.rng", new String[]{ "start.element" }); + } + + public void testCompleteRef2() throws Throwable { + doTestCompletion("complete-ref-2.rng", new String[]{"start.element" }); + } + + @CopyFile("included.rng") + public void testCompleteRef3() throws Throwable { + doTestCompletion("complete-ref-3.rng", new String[]{ "included.start.element" }); + } + + public void testCompleteRef4() throws Throwable { + doTestCompletion("complete-ref-4", "rng"); + } +} diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/RngHighlightingTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RngHighlightingTest.java new file mode 100644 index 000000000000..abcf46142aa0 --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RngHighlightingTest.java @@ -0,0 +1,155 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiPolyVariantReference; +import com.intellij.psi.PsiReference; +import com.intellij.psi.ResolveResult; +import com.intellij.psi.xml.XmlTag; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 25.07.2007 + */ +public class RngHighlightingTest extends HighlightingTestBase { + + public String getTestDataPath() { + return "highlighting/rng"; + } + + public void testSimpleSchema() throws Throwable { + doHighlightingTest("simple.rng"); + } + + public void testRef1() throws Throwable { + doHighlightingTest("ref-1.rng"); + } + + public void testRef2() throws Throwable { + doHighlightingTest("ref-2.rng"); + } + + public void testRef3() throws Throwable { + doHighlightingTest("ref-3.rng"); + } + + public void testBadRef() throws Throwable { + doHighlightingTest("bad-ref.rng"); + } + + public void testBadRef2() throws Throwable { + doHighlightingTest("bad-ref-2.rng"); + } + + public void testBadRef3() throws Throwable { + doHighlightingTest("bad-ref-3.rng"); + } + + public void testCreateDefinition1() throws Throwable { + doTestQuickFix("create-definition-1", "rng"); + } + + public void testParentRef1() throws Throwable { + doHighlightingTest("parent-ref-1.rng"); + } + + public void testParentRef2() throws Throwable { + myTestFixture.copyFileToProject("include.rng"); + doHighlightingTest("parent-ref-2.rng"); + } + + public void testBadParentRef1() throws Throwable { + doHighlightingTest("bad-parent-ref-1.rng"); + } + + public void testBadParentRef2() throws Throwable { + myTestFixture.copyFileToProject("bad-parent-ref-1.rng"); + doHighlightingTest("bad-parent-ref-2.rng"); + } + + public void testCreateDefinition2() throws Throwable { + doTestQuickFix("create-definition-2", "rng"); + } + + public void testMissingStartElement() throws Throwable { + doCustomHighlighting("missing-start-element.rng", false, true); + } + + public void testMissingStartElementAndInclude() throws Throwable { + myTestFixture.copyFileToProject("included-grammar.rng"); + doCustomHighlighting("missing-start-element-and-include.rng", false, true); + } + + public void testBadNsPrefix() throws Throwable { + doHighlightingTest("bad-ns-prefix.rng"); + } + + public void testBadElement() throws Throwable { + doExternalToolHighlighting("bad-element.rng"); + } + + public void testInclude() throws Throwable { + myTestFixture.copyFileToProject("include.rng"); + doHighlightingTest("good-include.rng"); + } + + public void testIncludedRef1() throws Throwable { + myTestFixture.copyFileToProject("include.rng"); + doHighlightingTest("good-include-ref-1.rng"); + } + + public void testResolveIncludedRef1() throws Throwable { + myTestFixture.copyFileToProject("include.rng"); + + final PsiReference ref = myTestFixture.getReferenceAtCaretPositionWithAssertion("resolve-include-ref-1.rng"); + final PsiElement element = ref.resolve(); + assertTrue(element instanceof XmlTag); + assertNotSame(element.getContainingFile(), ref.getElement().getContainingFile()); + assertEquals(0, ((XmlTag)element).getSubTags().length); + } + + public void testResolveIncludedRef2() throws Throwable { + myTestFixture.copyFileToProject("include.rng"); + + final PsiReference ref = myTestFixture.getReferenceAtCaretPositionWithAssertion("resolve-include-ref-2.rng"); + assertTrue("PolyVariantRef", ref instanceof PsiPolyVariantReference); + + final PsiElement element = ref.resolve(); + assertNull(element); + + final ResolveResult[] results = ((PsiPolyVariantReference)ref).multiResolve(false); + assertEquals(2, results.length); + + for (ResolveResult result : results) { + PsiElement e = result.getElement(); + assertTrue(e instanceof XmlTag); + + final int contentLength = ((XmlTag)e).getSubTags().length; + if (e.getContainingFile() == ref.getElement().getContainingFile()) { + assertEquals(1, contentLength); + } else { + assertEquals(0, contentLength); + } + } + } + + public void testBadInclude() throws Throwable { + doHighlightingTest("bad-include.rng"); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/RngIndexHighlightingTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RngIndexHighlightingTest.java new file mode 100644 index 000000000000..0b89884ccace --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RngIndexHighlightingTest.java @@ -0,0 +1,66 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import org.intellij.plugins.testUtil.CopyFile; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 25.07.2007 + */ +@CopyFile("*.rng") +public class RngIndexHighlightingTest extends AbstractIndexTest { + + public String getTestDataPath() { + return "highlighting/rng"; + } + + public void testInspectionUnusedDefine1() throws Throwable { + doHighlightingTest("unused-define-1.rng"); + } + + public void testInspectionUnusedDefine2() throws Throwable { + doHighlightingTest("unused-define-2.rng"); + } + + public void testInspectionDefine1() throws Throwable { + doHighlightingTest("used-define-1.rng"); + } + + public void testInspectionDefine2() throws Throwable { + doHighlightingTest("used-define-2.rng"); + } + + public void testInspectionDefine3() throws Throwable { + doHighlightingTest("used-define-3-include.rng"); + } + + public void testIncludedGrammarWithoutStart() throws Throwable { + // adding a tag doesn't work because it seems to prevent the index to recognize the file + // because the replacement is done *after* building the index :( + doCustomHighlighting("included-grammar.rng", false, false); + } + + public void testBackwardIncludeRef() throws Throwable { + doHighlightingTest("backward-include-ref.rng"); + } + + public void testUnrelatedBackwardIncludeRef() throws Throwable { + doHighlightingTest("backward-with-include.rng"); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/RngRenameTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RngRenameTest.java new file mode 100644 index 000000000000..45f7895a8966 --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/RngRenameTest.java @@ -0,0 +1,43 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import com.intellij.testFramework.fixtures.CodeInsightTestFixture; +import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 22.08.2007 + */ +public class RngRenameTest extends HighlightingTestBase { + protected CodeInsightTestFixture createFixture(IdeaTestFixtureFactory factory) { + return createContentFixture(factory); + } + + public String getTestDataPath() { + return "rename/rng"; + } + + public void testRenameRef1() throws Throwable { + doTestRename("rename-ref-1", "start"); + } + + private void doTestRename(String name, String newName) throws Throwable { + doTestRename(name, "rng", newName); + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/XmlHighlightingTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/XmlHighlightingTest.java new file mode 100644 index 000000000000..c15b098bed82 --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/XmlHighlightingTest.java @@ -0,0 +1,166 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import com.intellij.javaee.ExternalResourceManagerEx; +import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.openapi.fileTypes.StdFileTypes; +import org.intellij.plugins.testUtil.CopyFile; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 25.07.2007 + */ +public class XmlHighlightingTest extends HighlightingTestBase { + + public String getTestDataPath() { + return "highlighting"; + } + + protected void init() { + super.init(); + FileTypeManager.getInstance().registerFileType(StdFileTypes.XML, "fo"); + + final ExternalResourceManagerEx m = ExternalResourceManagerEx.getInstanceEx(); + m.addResource("urn:test:simple.rng", toAbsolutePath("highlighting/simple.rng")); + m.addResource("urn:test:addressBook", toAbsolutePath("highlighting/rnc/addressbook.rnc")); + m.addResource("http://www.w3.org/1999/XSL/Transform", toAbsolutePath("highlighting/relaxng.rng")); + m.addResource("http://www.w3.org/1999/XSL/Format", toAbsolutePath("highlighting/rnc/fo/main.rnc")); + m.addResource("http://docbook.org/ns/docbook", toAbsolutePath("highlighting/docbook.rng")); + m.addResource("urn:intelliForm:AttachmentFilter", toAbsolutePath("highlighting/attachment-filter.rng")); + + m.addIgnoredResource("urn:intelliForm:Spaces"); + m.addIgnoredResource("http://www.w3.org/1999/xlink"); + m.addIgnoredResource("http://www.w3.org/2000/svg"); + m.addIgnoredResource("http://www.ascc.net/xml/schematron"); + m.addIgnoredResource("http://www.w3.org/2000/svg"); + m.addIgnoredResource("http://www.w3.org/1998/Math/MathML"); + m.addIgnoredResource("http://nwalsh.com/xmlns/schema-control/"); + m.addIgnoredResource("http://xml.apache.org/fop/extensions"); + m.addIgnoredResource("http://www.antennahouse.com/names/XSL/Extensions"); + m.addIgnoredResource("http://www.renderx.com/XSL/Extensions"); + m.addIgnoredResource("http://relaxng.org/ns/compatibility/annotations/1.0"); + } + + public void testSimpleElement() throws Throwable { + doHighlightingTest("simple-element_1.xml"); + } + + public void testOptionalElement() throws Throwable { + doHighlightingTest("optional-element_1.xml"); + } + + public void testSimpleAttribute() throws Throwable { + doHighlightingTest("simple-attribute_1.xml"); + } + + public void testSimpleAttributeMissing() throws Throwable { + doHighlightingTest("simple-attribute_2.xml"); + } + + public void testOptionalAttribute() throws Throwable { + doHighlightingTest("optional-attribute_1.xml"); + doHighlightingTest("optional-attribute_2.xml"); + } + + public void testFixedAttribute() throws Throwable { + doHighlightingTest("fixed-attribute_1.xml"); + } + + public void testFixedAttributeIllegal() throws Throwable { + doHighlightingTest("fixed-attribute_2.xml"); + } + + public void testValueChoice1() throws Throwable { + doHighlightingTest("value-choice-1.xml"); + } + + public void testValueChoice2() throws Throwable { + doHighlightingTest("value-choice-2.xml"); + } + + public void testTokenDatatype() throws Throwable { + doHighlightingTest("token-datatype.xml"); + } + + public void testAttributeChoice1() throws Throwable { + doHighlightingTest("attribute-choice-1.xml"); + } + + public void testAttributeChoice2() throws Throwable { + doHighlightingTest("attribute-choice-2.xml"); + } + + public void testAttributeChoice3() throws Throwable { + doHighlightingTest("attribute-choice-3.xml"); + } + + public void testNestedFragment() throws Throwable { + doHighlightingTest("nested-fragment.xml"); + } + + public void testNestedFragment2() throws Throwable { + myTestFixture.copyFileToProject("jpdl-3.1.xsd"); + doHighlightingTest("nested-fragment-2.xml"); + } + + public void testDocbookExample() throws Throwable { + doHighlightingTest("mybook.xml"); + } + + public void testMissingAttributeRnc() throws Throwable { + doHighlightingTest("rnc/missing-attribute.xml"); + } + + public void testValidRnc() throws Throwable { + doHighlightingTest("rnc/valid-rnc.xml"); + } + + @CopyFile({"rnc/include.rnc", "rnc/included.rnc"}) + public void testValidIncludeRnc() throws Throwable { + doHighlightingTest("rnc/valid-rnc-include.xml"); + } + + public void testBadElementRnc() throws Throwable { + doHighlightingTest("rnc/bad-element.xml"); + } + + public void testRngSchema() throws Throwable { + doHighlightingTest("relaxng.rng"); + } + + public void testNestedComposite() throws Throwable { + doHighlightingTest("nested-composite.rng"); + } + + public void testXsltSchema() throws Throwable { + doHighlightingTest("xslt.rng"); + } + + public void testXslFoRncSchema() throws Throwable { + doHighlightingTest("rnc/fo/fo-test.xml"); + } + + public void testFoFromDocbook() throws Throwable { + doHighlightingTest("rnc/fo/mybook.fo"); + } + + public void testDocBookSchema() throws Throwable { + doHighlightingTest("docbook.rng"); + } +} diff --git a/plugins/relaxng/test/org/intellij/plugins/relaxNG/XmlValidationTest.java b/plugins/relaxng/test/org/intellij/plugins/relaxNG/XmlValidationTest.java new file mode 100644 index 000000000000..6834b6ea27f9 --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/relaxNG/XmlValidationTest.java @@ -0,0 +1,99 @@ +/* + * Copyright 2007 Sascha Weinreuter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.intellij.plugins.relaxNG; + +import org.intellij.plugins.testUtil.CopyFile; + +import com.intellij.javaee.ExternalResourceManager; + +import java.io.File; + +/** + * Created by IntelliJ IDEA. + * User: sweinreuter + * Date: 25.07.2007 + */ +public class XmlValidationTest extends HighlightingTestBase { + + public void testValidDocument() throws Throwable { + doTest("xslt.rng"); + } + + @CopyFile("broken.rng") + public void testPartiallyBrokenRng() throws Throwable { + myTestFixture.testHighlighting("broken-rng.xml"); + } + + @CopyFile("broken.rnc") + public void testPartiallyBrokenRnc() throws Throwable { + myTestFixture.testHighlighting("broken-rnc.xml"); + } + + @CopyFile("entity-included.xml") + public void testEntityRef1() throws Throwable { + doTest("entity-test-1.xml"); + } + + @CopyFile("entity-included.xml") + public void testEntityRef2() throws Throwable { + doTest("entity-test-2.xml"); + } + + public void testEntityRef3() throws Throwable { + doTest("entity-test-3.xml"); + } + + public void testTextContent() throws Throwable { + doTest("text-content.xml"); + } + + public void testCDATA() throws Throwable { + doTest("cdata-test.xml"); + } + + public void testMissingElement() throws Throwable { + doTest("missing-element.xml"); + } + + public void testInvalidElement() throws Throwable { + doTest("invalid-element.xml"); + } + + public void testInvalidElementRnc() throws Throwable { + doTest("invalid-element-rnc.xml"); + } + + public void testMissingElementRnc() throws Throwable { + doTest("missing-element-rnc.xml"); + } + + private void doTest(String name) throws Throwable { + doExternalToolHighlighting(name); + } + + protected void init() { + super.init(); + final ExternalResourceManager mgr = ExternalResourceManager.getInstance(); + mgr.addResource("urn:test:simple.rng", toAbsolutePath("validation/simple.rng")); + mgr.addResource("urn:test:simple.rnc", toAbsolutePath("validation/simple.rnc")); + mgr.addResource("http://www.w3.org/1999/XSL/Transform", toAbsolutePath("validation/relaxng.rng")); + } + + public String getTestDataPath() { + return "validation"; + } +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/testUtil/CopyFile.java b/plugins/relaxng/test/org/intellij/plugins/testUtil/CopyFile.java new file mode 100644 index 000000000000..a1d83898134b --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/testUtil/CopyFile.java @@ -0,0 +1,18 @@ +package org.intellij.plugins.testUtil; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 27.03.2008 +*/ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface CopyFile { + String[] value(); + String target() default ""; +} diff --git a/plugins/relaxng/test/org/intellij/plugins/testUtil/IdeaCodeInsightTestCase.java b/plugins/relaxng/test/org/intellij/plugins/testUtil/IdeaCodeInsightTestCase.java new file mode 100644 index 000000000000..ac42543b1fc6 --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/testUtil/IdeaCodeInsightTestCase.java @@ -0,0 +1,13 @@ +package org.intellij.plugins.testUtil; + +import com.intellij.testFramework.fixtures.CodeInsightTestFixture; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 27.03.2008 +*/ +public interface IdeaCodeInsightTestCase { + String getTestDataPath(); + CodeInsightTestFixture getFixture(); +} \ No newline at end of file diff --git a/plugins/relaxng/test/org/intellij/plugins/testUtil/ResourceUtil.java b/plugins/relaxng/test/org/intellij/plugins/testUtil/ResourceUtil.java new file mode 100644 index 000000000000..a8ee6ab10011 --- /dev/null +++ b/plugins/relaxng/test/org/intellij/plugins/testUtil/ResourceUtil.java @@ -0,0 +1,57 @@ +package org.intellij.plugins.testUtil; + +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.LocalFileSystem; + +import junit.framework.TestCase; +import org.intellij.plugins.relaxNG.HighlightingTestBase; +import org.junit.Assert; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.regex.Pattern; + +/* +* Created by IntelliJ IDEA. +* User: sweinreuter +* Date: 27.03.2008 +*/ +public class ResourceUtil { + public static void copyFiles(TC test) throws IOException { + try { + final Method method = test.getClass().getMethod(test.getName()); + CopyFile annotation = method.getAnnotation(CopyFile.class); + if (annotation == null) { + if ((annotation = method.getDeclaringClass().getAnnotation(CopyFile.class)) == null) { + return; + } + } + + final String[] patterns = annotation.value(); + for (String pattern : patterns) { + final File root = new File(HighlightingTestBase.getTestDataBasePath() + test.getTestDataPath()); + final ArrayList files = new ArrayList(); + FileUtil.collectMatchedFiles(root, Pattern.compile(FileUtil.convertAntToRegexp(pattern)), files); + + final File temp = new File(test.getFixture().getTempDirPath()); + final String target = annotation.target(); + if (target.length() > 0) { + Assert.assertEquals(files.size(), 1); + final File destFile = new File(temp, FileUtil.getRelativePath(root, new File(root, target))); + FileUtil.copy(files.get(0), destFile); + LocalFileSystem.getInstance().refreshAndFindFileByIoFile(destFile); + } else { + for (File file : files) { + final File destFile = new File(temp, FileUtil.getRelativePath(root, file)); + FileUtil.copy(file, destFile); + LocalFileSystem.getInstance().refreshAndFindFileByIoFile(destFile); + } + } + } + } catch (NoSuchMethodException e) { + Assert.fail(e.getMessage()); + } + } +} \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/attr-combine-test.rng b/plugins/relaxng/testData/completion/attr-combine-test.rng new file mode 100644 index 000000000000..f016995078bf --- /dev/null +++ b/plugins/relaxng/testData/completion/attr-combine-test.rng @@ -0,0 +1,27 @@ + + + + + + + + + + 2.0 + + + + + + 1.0 + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/attr-combine.xml b/plugins/relaxng/testData/completion/attr-combine.xml new file mode 100644 index 000000000000..1c0fe8725880 --- /dev/null +++ b/plugins/relaxng/testData/completion/attr-combine.xml @@ -0,0 +1 @@ +/> \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/attribute-completion-1.xml b/plugins/relaxng/testData/completion/attribute-completion-1.xml new file mode 100644 index 000000000000..44874e273f05 --- /dev/null +++ b/plugins/relaxng/testData/completion/attribute-completion-1.xml @@ -0,0 +1 @@ +/> \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/attribute-completion-1_after.xml b/plugins/relaxng/testData/completion/attribute-completion-1_after.xml new file mode 100644 index 000000000000..5d3fc08cf5b0 --- /dev/null +++ b/plugins/relaxng/testData/completion/attribute-completion-1_after.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/attribute-completion-2.xml b/plugins/relaxng/testData/completion/attribute-completion-2.xml new file mode 100644 index 000000000000..684970d10734 --- /dev/null +++ b/plugins/relaxng/testData/completion/attribute-completion-2.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/attribute-completion-2_after.xml b/plugins/relaxng/testData/completion/attribute-completion-2_after.xml new file mode 100644 index 000000000000..7d5534aae14f --- /dev/null +++ b/plugins/relaxng/testData/completion/attribute-completion-2_after.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/attribute-completion-3.xml b/plugins/relaxng/testData/completion/attribute-completion-3.xml new file mode 100644 index 000000000000..02d57c6f271b --- /dev/null +++ b/plugins/relaxng/testData/completion/attribute-completion-3.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/attribute-completion-4.xml b/plugins/relaxng/testData/completion/attribute-completion-4.xml new file mode 100644 index 000000000000..09f659e0dd5d --- /dev/null +++ b/plugins/relaxng/testData/completion/attribute-completion-4.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/attribute-completion-5.xml b/plugins/relaxng/testData/completion/attribute-completion-5.xml new file mode 100644 index 000000000000..00b583857f02 --- /dev/null +++ b/plugins/relaxng/testData/completion/attribute-completion-5.xml @@ -0,0 +1 @@ +/> \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/attribute-completion-6.xml b/plugins/relaxng/testData/completion/attribute-completion-6.xml new file mode 100644 index 000000000000..228a258a144e --- /dev/null +++ b/plugins/relaxng/testData/completion/attribute-completion-6.xml @@ -0,0 +1 @@ +/> \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/attribute-completion.rng b/plugins/relaxng/testData/completion/attribute-completion.rng new file mode 100644 index 000000000000..91af29ca8443 --- /dev/null +++ b/plugins/relaxng/testData/completion/attribute-completion.rng @@ -0,0 +1,49 @@ + + + + + + + + + + 1.0 + + + + + + + 1.0 + 2.0 + + + + + + + + 1.0 + + + 2.0 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/element-completion-1.xml b/plugins/relaxng/testData/completion/element-completion-1.xml new file mode 100644 index 000000000000..1c8228282b6e --- /dev/null +++ b/plugins/relaxng/testData/completion/element-completion-1.xml @@ -0,0 +1,3 @@ + + < + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/element-completion-2.xml b/plugins/relaxng/testData/completion/element-completion-2.xml new file mode 100644 index 000000000000..eea15228a6b6 --- /dev/null +++ b/plugins/relaxng/testData/completion/element-completion-2.xml @@ -0,0 +1,3 @@ + + < + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/element-completion-3.xml b/plugins/relaxng/testData/completion/element-completion-3.xml new file mode 100644 index 000000000000..2fd5475710db --- /dev/null +++ b/plugins/relaxng/testData/completion/element-completion-3.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/element-completion-3_after.xml b/plugins/relaxng/testData/completion/element-completion-3_after.xml new file mode 100644 index 000000000000..fda6ff02279d --- /dev/null +++ b/plugins/relaxng/testData/completion/element-completion-3_after.xml @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/element-completion-root.xml b/plugins/relaxng/testData/completion/element-completion-root.xml new file mode 100644 index 000000000000..aeff4455d3d5 --- /dev/null +++ b/plugins/relaxng/testData/completion/element-completion-root.xml @@ -0,0 +1,2 @@ +< xmlns="element-completion.rng"> + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/element-completion.rng b/plugins/relaxng/testData/completion/element-completion.rng new file mode 100644 index 000000000000..ec77e74b4d1c --- /dev/null +++ b/plugins/relaxng/testData/completion/element-completion.rng @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + preserve + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/rnc/complete-keyword-1.rnc b/plugins/relaxng/testData/completion/rnc/complete-keyword-1.rnc new file mode 100644 index 000000000000..e161a8b79aa7 --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/complete-keyword-1.rnc @@ -0,0 +1 @@ +s diff --git a/plugins/relaxng/testData/completion/rnc/complete-keyword-1_after.rnc b/plugins/relaxng/testData/completion/rnc/complete-keyword-1_after.rnc new file mode 100644 index 000000000000..88afc7a7509a --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/complete-keyword-1_after.rnc @@ -0,0 +1 @@ +start diff --git a/plugins/relaxng/testData/completion/rnc/complete-keyword-2.rnc b/plugins/relaxng/testData/completion/rnc/complete-keyword-2.rnc new file mode 100644 index 000000000000..ae6cffde793c --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/complete-keyword-2.rnc @@ -0,0 +1 @@ +start = gr diff --git a/plugins/relaxng/testData/completion/rnc/complete-keyword-2_after.rnc b/plugins/relaxng/testData/completion/rnc/complete-keyword-2_after.rnc new file mode 100644 index 000000000000..811f38316b5a --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/complete-keyword-2_after.rnc @@ -0,0 +1 @@ +start = grammar diff --git a/plugins/relaxng/testData/completion/rnc/complete-ref-1.rnc b/plugins/relaxng/testData/completion/rnc/complete-ref-1.rnc new file mode 100644 index 000000000000..6a59f8e492cd --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/complete-ref-1.rnc @@ -0,0 +1,2 @@ +start = s +start.element = element foo { empty } diff --git a/plugins/relaxng/testData/completion/rnc/complete-ref-1_after.rnc b/plugins/relaxng/testData/completion/rnc/complete-ref-1_after.rnc new file mode 100644 index 000000000000..8856714ce69a --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/complete-ref-1_after.rnc @@ -0,0 +1,2 @@ +start = start.element +start.element = element foo { empty } diff --git a/plugins/relaxng/testData/completion/rnc/complete-ref-2.rnc b/plugins/relaxng/testData/completion/rnc/complete-ref-2.rnc new file mode 100644 index 000000000000..f00f9075d7fc --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/complete-ref-2.rnc @@ -0,0 +1,4 @@ +start = s +div { + start.element = element foo { empty } +} diff --git a/plugins/relaxng/testData/completion/rnc/complete-ref-2_after.rnc b/plugins/relaxng/testData/completion/rnc/complete-ref-2_after.rnc new file mode 100644 index 000000000000..ac7cc00cfdc6 --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/complete-ref-2_after.rnc @@ -0,0 +1,4 @@ +start = start.element +div { + start.element = element foo { empty } +} diff --git a/plugins/relaxng/testData/completion/rnc/complete-ref-3.rnc b/plugins/relaxng/testData/completion/rnc/complete-ref-3.rnc new file mode 100644 index 000000000000..c1e8c1ec89e4 --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/complete-ref-3.rnc @@ -0,0 +1,7 @@ +include "included.rnc" { + i = element foo { empty } +} +start = istart.element +div { + istart.element = element foo { empty } +} diff --git a/plugins/relaxng/testData/completion/rnc/complete-ref-3_after.rnc b/plugins/relaxng/testData/completion/rnc/complete-ref-3_after.rnc new file mode 100644 index 000000000000..86ebbf275cb2 --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/complete-ref-3_after.rnc @@ -0,0 +1,7 @@ +include "included.rnc" { + included.start.element = element foo { empty } +} +start = istart.element +div { + istart.element = element foo { empty } +} diff --git a/plugins/relaxng/testData/completion/rnc/complete-ref-4.rnc b/plugins/relaxng/testData/completion/rnc/complete-ref-4.rnc new file mode 100644 index 000000000000..f0900c58d1e3 --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/complete-ref-4.rnc @@ -0,0 +1,7 @@ +include "included.rnc" { + included.start.element = s +} +start = start.element +div { + start.element = element foo { empty } +} diff --git a/plugins/relaxng/testData/completion/rnc/complete-ref-4_after.rnc b/plugins/relaxng/testData/completion/rnc/complete-ref-4_after.rnc new file mode 100644 index 000000000000..9e87d8600879 --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/complete-ref-4_after.rnc @@ -0,0 +1,7 @@ +include "included.rnc" { + included.start.element = start.element +} +start = start.element +div { + start.element = element foo { empty } +} diff --git a/plugins/relaxng/testData/completion/rnc/included.rnc b/plugins/relaxng/testData/completion/rnc/included.rnc new file mode 100644 index 000000000000..72cd1a7c20ba --- /dev/null +++ b/plugins/relaxng/testData/completion/rnc/included.rnc @@ -0,0 +1,3 @@ +div { + included.start.element = element foo { empty } +} diff --git a/plugins/relaxng/testData/completion/rng/complete-ref-1.rng b/plugins/relaxng/testData/completion/rng/complete-ref-1.rng new file mode 100644 index 000000000000..b9a9b4d34f6a --- /dev/null +++ b/plugins/relaxng/testData/completion/rng/complete-ref-1.rng @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/rng/complete-ref-1_after.rng b/plugins/relaxng/testData/completion/rng/complete-ref-1_after.rng new file mode 100644 index 000000000000..59dfbc40dbd8 --- /dev/null +++ b/plugins/relaxng/testData/completion/rng/complete-ref-1_after.rng @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/completion/rng/complete-ref-2.rng b/plugins/relaxng/testData/completion/rng/complete-ref-2.rng new file mode 100644 index 000000000000..7794f90b9a71 --- /dev/null +++ b/plugins/relaxng/testData/completion/rng/complete-ref-2.rng @@ -0,0 +1,9 @@ + + + + + +
+ +
+
\ No newline at end of file diff --git a/plugins/relaxng/testData/completion/rng/complete-ref-2_after.rng b/plugins/relaxng/testData/completion/rng/complete-ref-2_after.rng new file mode 100644 index 000000000000..74b4462a9c4d --- /dev/null +++ b/plugins/relaxng/testData/completion/rng/complete-ref-2_after.rng @@ -0,0 +1,9 @@ + + + + + +
+ +
+
\ No newline at end of file diff --git a/plugins/relaxng/testData/completion/rng/complete-ref-3.rng b/plugins/relaxng/testData/completion/rng/complete-ref-3.rng new file mode 100644 index 000000000000..4c73fffc2ba2 --- /dev/null +++ b/plugins/relaxng/testData/completion/rng/complete-ref-3.rng @@ -0,0 +1,13 @@ + + + + + + + + + +
+ +
+
\ No newline at end of file diff --git a/plugins/relaxng/testData/completion/rng/complete-ref-3_after.rng b/plugins/relaxng/testData/completion/rng/complete-ref-3_after.rng new file mode 100644 index 000000000000..59c854058e0f --- /dev/null +++ b/plugins/relaxng/testData/completion/rng/complete-ref-3_after.rng @@ -0,0 +1,13 @@ + + + + + + + + + +
+ +
+
\ No newline at end of file diff --git a/plugins/relaxng/testData/completion/rng/complete-ref-4.rng b/plugins/relaxng/testData/completion/rng/complete-ref-4.rng new file mode 100644 index 000000000000..ba2d0042043b --- /dev/null +++ b/plugins/relaxng/testData/completion/rng/complete-ref-4.rng @@ -0,0 +1,15 @@ + + + + + + + + + + + +
+ +
+
\ No newline at end of file diff --git a/plugins/relaxng/testData/completion/rng/complete-ref-4_after.rng b/plugins/relaxng/testData/completion/rng/complete-ref-4_after.rng new file mode 100644 index 000000000000..58e1af6e728a --- /dev/null +++ b/plugins/relaxng/testData/completion/rng/complete-ref-4_after.rng @@ -0,0 +1,15 @@ + + + + + + + + + + + +
+ +
+
\ No newline at end of file diff --git a/plugins/relaxng/testData/completion/rng/included.rng b/plugins/relaxng/testData/completion/rng/included.rng new file mode 100644 index 000000000000..1424b6977848 --- /dev/null +++ b/plugins/relaxng/testData/completion/rng/included.rng @@ -0,0 +1,5 @@ + +
+ +
+
\ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/attachment-filter.rng b/plugins/relaxng/testData/highlighting/attachment-filter.rng new file mode 100644 index 000000000000..29274762953b --- /dev/null +++ b/plugins/relaxng/testData/highlighting/attachment-filter.rng @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + b + kb + mb + + + + + + + + + + + + + + + + + + + + + + id + name + content-type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/attribute-choice-1.xml b/plugins/relaxng/testData/highlighting/attribute-choice-1.xml new file mode 100644 index 000000000000..862daef46863 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/attribute-choice-1.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/attribute-choice-2.xml b/plugins/relaxng/testData/highlighting/attribute-choice-2.xml new file mode 100644 index 000000000000..ef01f9541056 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/attribute-choice-2.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/attribute-choice-3.xml b/plugins/relaxng/testData/highlighting/attribute-choice-3.xml new file mode 100644 index 000000000000..c095d96e136f --- /dev/null +++ b/plugins/relaxng/testData/highlighting/attribute-choice-3.xml @@ -0,0 +1,2 @@ +"c"> + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/docbook.rng b/plugins/relaxng/testData/highlighting/docbook.rng new file mode 100644 index 000000000000..6a5263eac7b5 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/docbook.rng @@ -0,0 +1,15278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Any attribute including in any attribute in any namespace. + + + + + + Any element from almost any namespace + + + + + + + + + + + + + + + +
+ + + Designates the computer or chip architecture to which the element applies + + + + + Designates the intended audience to which the element applies, for example, system administrators, programmers, or new users. + + + + + provides a standard place for application-specific effectivity + + + + + Indicates standards conformance characteristics of the element + + + + + Indicates the operating system to which the element is applicable + + + + + Indicates the editorial revision to which the element belongs + + + + + Indicates something about the security level associated with the element to which it applies + + + + + Indicates the level of user experience for which the element applies + + + + + Indicates the computer vendor to which the element applies. + + + + + Indicates the word size (width in bits) of the computer architecture to which the element applies + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Points to the element whose content is to be used as the text of the link + + + + + + Points to an internal link target by identifying the value of its xml:id attribute + + + + + + Points to one or more internal link targets by identifying the value of their xml:id attributes + + + + + + Identifies a link target with a URI + + + + + + Identifies the XLink link type + simple + An XLink simple link + + + + + Identifies the XLink role of the link + + + + + + Identifies the XLink arcrole of the link + + + + + + + Identifies the XLink title of the link + + + + + + new + An application traversing to the ending resource should load it in a new window, frame, pane, or other relevant presentation context. + replace + An application traversing to the ending resource should load the resource in the same window, frame, pane, or other relevant presentation context in which the starting resource was loaded. + embed + An application traversing to the ending resource should load its presentation in place of the presentation of the starting resource. + other + The behavior of an application traversing to the ending resource is unconstrained by XLink. The application should look for other markup present in the link to determine the appropriate behavior. + none + The behavior of an application traversing to the ending resource is unconstrained by this specification. No other markup is present to help the application determine the appropriate behavior. + + + + + Identifies the XLink show behavior of the link + + + + + + onLoad + An application should traverse to the ending resource immediately on loading the starting resource. + onRequest + An application should traverse from the starting resource to the ending resource only on a post-loading event triggered for the purpose of traversal. + other + The behavior of an application traversing to the ending resource is unconstrained by this specification. The application should look for other markup present in the link to determine the appropriate behavior. + none + The behavior of an application traversing to the ending resource is unconstrained by this specification. No other markup is present to help the application determine the appropriate behavior. + + + + + Identifies the XLink actuate behavior of the link + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Identifies the unique ID value of the element + + + + + + Specifies the DocBook version of the element and its descendants + + + + + Specifies the natural language of the element and its descendants + + + + + Specifies the base URI of the element and its descendants + + + + + + Provides the name or similar semantic identifier assigned to the content in some previous markup scheme + + + + + Provides the text that is to be generated for a cross reference to the element + + + + + Specifies a keyword or keywords identifying additional style information + + + + + changed + The element has been changed. + added + The element is new (has been added to the document). + deleted + The element has been deleted. + off + Explicitly turns off revision markup for this element. + + + + + Identifies the revision status of the element + + + + + + ltr + Left-to-right text + rtl + Right-to-left text + lro + Left-to-right override + rlo + Right-to-left override + + + + + Identifies the direction of text in an element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Specifies the format of the data + + + + + Indentifies the location of the data by URI + + + + Identifies the location of the data by external identifier (entity name) + + + + + + + continues + Line numbering continues from the immediately preceding element with the same name. + restarts + Line numbering restarts (begins at 1, usually). + + + + + Determines whether line numbering continues from the previous element or restarts. + + + + + + numbered + Lines are numbered. + unnumbered + Lines are not numbered. + + + + + Determines whether lines are numbered. + + + + + + Specifies the initial line number. + + + + + + Identifies the language (i.e. programming language) of the verbatim content. + + + + + Can be used to indicate explicitly that whitespace in the verbatim environment is preserved. Whitespace must always be preserved in verbatim environments whether this attribute is specified or not. + preserve + Whitespace must be preserved. + + + + + + + + + + + + + + + + + + + + + + + + Specifies an identifying string for presentation purposes + + + + + Specifies the width (in characters) of the element + + + + + + compact + The spacing should be "compact". + normal + The spacing should be "normal". + + + + + Specifies (a hint about) the spacing of the content + + + + + + 0 + The element should be rendered in the current text flow (with the flow column width). + 1 + The element should be rendered across the full text page. + + + + + Indicates if the element is rendered across the column or the page + + + + + + Identifies the language (i.e. programming language) of the content. + + + + + optional + The content describes an optional step or steps. + required + The content describes a required step or steps. + + + + + Specifies if the content is required or optional. + + + + + + Specifies style information to be used when rendering the float + + + + + Specifies the width of the element + + + + + Specifies the depth of the element + + + + + Specifies the width of the content rectangle + + + + + Specifies the depth of the content rectangle + + + + + 0 + False (do not scale-to-fit; anamorphic scaling may occur) + 1 + True (scale-to-fit; anamorphic scaling is forbidden) + + + + + Specifies the scaling factor + + + + + + center + Centered horizontally + char + Aligned horizontally on the specified character + justify + Fully justified (left and right margins or edges) + left + Left aligned + right + Right aligned + + + + + bottom + Aligned on the bottom of the region + middle + Centered vertically + top + Aligned on the top of the region + + + + + doi + A document object identifier. + isbn + An international standard book number. + isrn + An international standard technical report number (ISO 10444). + issn + An international standard serial number. + libraryofcongress + A Library of Congress reference number. + pubsnumber + A publication number (an internal number or possibly organizational standard). + uri + A Uniform Resource Identifier + + + + + + Identifies the kind of bibliographic identifier + + + + + + + Identifies the nature of the non-standard bibliographic identifier + + + + + + + Identifies the kind of bibliographic identifier + other + Indicates that the identifier is some 'other' kind. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + The text of the title of a section of a document or of a formal block-level element + + + + + + +
+
+ + + + + + + + + + + + + + + The abbreviation of a title + + + + + + +
+
+ + + + + + + + + + + + + + + The subtitle of a document + + + + + + +
+
+ + + + + + + + + + + + + + A wrapper for information about a component or other block + + + + + + + + + +
+
+ + + + + + + + + + + + + + A wrapper for information about a component or other block with a required title + + + + + + + + + +
+
+ + + + + + + + + + + + + + A wrapper for information about a component or other block with only a title + + + + + + + + + +
+
+ + + + + + + + + + + + + + A wrapper for information about a component or other block with only a required title + + + + + + + + + +
+
+ + + + + + + + + + + + + + A wrapper for information about a component or other block without a title + + + + + + +
+
+ + + + + + Identifies the controlled vocabulary used by this set's terms + + + + + + + + + + + + + + + + + + A set of terms describing the subject matter of a document + + + + + + +
+
+ + + + + + Specifies a ranking for this subject relative to other subjects in the same set + + + + + + + + + + + + + + + + + One of a group of terms describing the subject matter of a document + + + + + + +
+
+ + + + + + + + + + + + + + + A term in a group of terms describing the subject matter of a document + + + + +
+
+ + + + + + + + + + + + + + + A set of keywords describing the content of a document + + + + + + +
+
+ + + + + + + + + + + + + + + One of a set of keywords describing the content of a document + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + A list of operations to be performed in a well-defined sequence + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + A unit of action in a procedure + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + Alternative steps in a procedure + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A wrapper for steps that occur within steps in a procedure + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A portion of a document that is isolated from the main narrative flow + + + sidebar must not occur in the descendants of sidebar + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A summary + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A short description or note about a person + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A quotation set off from the main text + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The source of a block quote or epigraph + + + + + + + + + + + + +
+
+ + + sect1 + Render as a first-level section + sect2 + Render as a second-level section + sect3 + Render as a third-level section + sect4 + Render as a fourth-level section + sect5 + Render as a fifth-level section + + + + + + Indicates how the bridge head should be rendered + + + + + + + Identifies the nature of the non-standard rendering + + + + + + + Indicates how the bridge head should be rendered + other + Identifies a non-standard rendering + + + + + + + + + + + + + + + + + + + + + + + + + + + + A free-floating heading + + + + + + +
+
+ + + + + + + + + + + + + + + A remark (or comment) intended for presentation in a draft manuscript + + + + +
+
+ + + + + + + + + + + + + + + + + + A short inscription at the beginning of a document or component + + + + + + + + + + + + + +
+
+ + + + + + Identifies the desired footnote mark + + + + + + + + + + + + + + + + + + A footnote + + + footnote must not occur in the descendants of footnote + + + + + example must not occur in the descendants of footnote + + + + + figure must not occur in the descendants of footnote + + + + + table must not occur in the descendants of footnote + + + + + equation must not occur in the descendants of footnote + + + + + caution must not occur in the descendants of footnote + + + + + important must not occur in the descendants of footnote + + + + + note must not occur in the descendants of footnote + + + + + tip must not occur in the descendants of footnote + + + + + warning must not occur in the descendants of footnote + + + + + indexterm must not occur in the descendants of footnote + + + + + sidebar must not occur in the descendants of footnote + + + + + task must not occur in the descendants of footnote + + + + + epigraph must not occur in the descendants of footnote + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A paragraph with a title + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A paragraph + + + The root element must have a version attribute. + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A paragraph that contains only text and inline markup, no block elements + + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + A note of caution + + + caution must not occur in the descendants of caution + + + + + important must not occur in the descendants of caution + + + + + note must not occur in the descendants of caution + + + + + tip must not occur in the descendants of caution + + + + + warning must not occur in the descendants of caution + + + + + + +
+
+ + + + + + + + + + + + + + + An admonition set off from the text + + + caution must not occur in the descendants of important + + + + + important must not occur in the descendants of important + + + + + note must not occur in the descendants of important + + + + + tip must not occur in the descendants of important + + + + + warning must not occur in the descendants of important + + + + + + +
+
+ + + + + + + + + + + + + + + A message set off from the text + + + caution must not occur in the descendants of note + + + + + important must not occur in the descendants of note + + + + + note must not occur in the descendants of note + + + + + tip must not occur in the descendants of note + + + + + warning must not occur in the descendants of note + + + + + + +
+
+ + + + + + + + + + + + + + + A suggestion to the user, set off from the text + + + caution must not occur in the descendants of tip + + + + + important must not occur in the descendants of tip + + + + + note must not occur in the descendants of tip + + + + + tip must not occur in the descendants of tip + + + + + warning must not occur in the descendants of tip + + + + + + +
+
+ + + + + + + + + + + + + + + An admonition set off from the text + + + caution must not occur in the descendants of warning + + + + + important must not occur in the descendants of warning + + + + + note must not occur in the descendants of warning + + + + + tip must not occur in the descendants of warning + + + + + warning must not occur in the descendants of warning + + + + + + +
+
+ + + + + + Identifies the type of mark to be used on items in this list + + + + + + + + + + + + + + + + + + + + + + + + A list in which each entry is marked with a bullet or other dingbat + + + + + + + + + + +
+
+ + + + + + continues + Specifies that numbering should begin where the preceding list left off + restarts + Specifies that numbering should begin again at 1 + + + + + Indicates how list numbering should begin relative to the immediately preceding list + + + + + + Specifies the initial line number. + + + + + + ignore + Specifies that numbering should ignore list nesting + inherit + Specifies that numbering should inherit from outer-level lists + + + + + Indicates whether or not item numbering should be influenced by list nesting + + + + + + arabic + Specifies Arabic numeration (1, 2, 3, …) + upperalpha + Specifies upper-case alphabetic numeration (A, B, C, …) + loweralpha + Specifies lower-case alphabetic numeration (a, b, c, …) + upperroman + Specifies upper-case Roman numeration (I, II, III, …) + lowerroman + Specifies lower-case Roman numeration (i, ii, iii …) + + + + + Indicates the desired numeration + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A list in which each entry is marked with a sequentially incremented label + + + + + + + + + + +
+
+ + + + + + Specifies the keyword for the type of mark that should be used on this + item, instead of the mark that would be used by default + + + + + + + + + + + + + + + + + + A wrapper for the elements of a list item + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A segmented list, a list of sets of elements + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The title of an element of a list item in a segmented list + + + + + + +
+
+ + + + + + + + + + + + + + + A list item in a segmented list + + + The number of seg elements must be the same as the number of segtitle elements in the parent segmentedlist + + + + + + + + +
+
+ + + + + + + + + + + + + + + An element of a list item in a segmented list + + + + + + +
+
+ + + + + + horiz + A tabular presentation in row-major order. + vert + A tabular presentation in column-major order. + inline + An inline presentation, usually a comma-delimited list. + + + + + Specifies the type of list presentation. + + + + + + Specifies the number of columns for horizontal or vertical presentation + + + + + + + + + + + + + + + + + + + + + An undecorated list of single words or short phrases + + + + + + +
+
+ + + + + + + + + + + + + + + An element of a simple list + + + + + + +
+
+ + + + + + Indicates a length beyond which the presentation system may consider a term too long and select an alternate presentation for that term, item, or list + + + + + + + + + + + + + + + + + + + + + + + A list in which each entry is composed of a set of one or more terms and an associated description + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A wrapper for a set of terms and the associated description in a variable list + + + + + + + +
+
+ + + + + + + + + + + + + + + The word or phrase being defined or described in a variable list + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A formal example, with a title + + + example must not occur in the descendants of example + + + + + figure must not occur in the descendants of example + + + + + table must not occur in the descendants of example + + + + + equation must not occur in the descendants of example + + + + + caution must not occur in the descendants of example + + + + + important must not occur in the descendants of example + + + + + note must not occur in the descendants of example + + + + + tip must not occur in the descendants of example + + + + + warning must not occur in the descendants of example + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A displayed example without a title + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + A literal listing of all or part of a program + + + + +
+
+ + + + + + monospaced + The literal layout should be formatted with a monospaced font + normal + The literal layout should be formatted with the current font + + + + + Specifies the class of literal layout + + + + + + + + + + + + + + + + + + + A block of text in which line breaks and white space are to be reproduced faithfully + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + Text that a user sees or might see on a computer screen + + + + +
+
+ + + + + + + + + + + + + + + + + + A representation of what the user sees or might see on a computer screen + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A formal figure, generally an illustration, with a title + + + example must not occur in the descendants of figure + + + + + figure must not occur in the descendants of figure + + + + + table must not occur in the descendants of figure + + + + + equation must not occur in the descendants of figure + + + + + caution must not occur in the descendants of figure + + + + + important must not occur in the descendants of figure + + + + + note must not occur in the descendants of figure + + + + + tip must not occur in the descendants of figure + + + + + warning must not occur in the descendants of figure + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A untitled figure + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + A displayed media object (video, audio, image, etc.) + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + An inline media object (video, audio, image, and so on) + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A wrapper for video data and its associated meta-information + + + + + +
+
+ + + + + + + + + + + + + + + + + + A wrapper for audio data and its associated meta-information + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + A wrapper for image data and its associated meta-information + + + + + +
+
+ + + + + + + + + + + + + + + + + + A wrapper for a text description of an object and its associated meta-information + + + + + + + + + + + +
+
+ + + + + + + + + Specifies the (horizontal) alignment of the video data + + + + + + + + + Specifies the vertical alignment of the video data + + + + + + + + + + + + + + + + + + + + + Determines if anamorphic scaling is forbidden + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pointer to external video data + + + + +
+
+ + + + + + + + + + + + + + + + + + Pointer to external audio data + + + + +
+
+ + + + + + + + + Specifies the (horizontal) alignment of the image data + + + + + + + + + Specifies the vertical alignment of the image data + + + + + + + + + + + + + + + + + + + + + Determines if anamorphic scaling is forbidden + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pointer to external image data + + + + +
+
+ + + + + + Identifies the encoding of the text in the external file + + + + + + + + + + + + + + + + + + + + Pointer to external text data + + + + +
+
+ + + + + + + + + + + + + + + + + + A caption + + + example must not occur in the descendants of caption + + + + + figure must not occur in the descendants of caption + + + + + table must not occur in the descendants of caption + + + + + equation must not occur in the descendants of caption + + + + + caution must not occur in the descendants of caption + + + + + important must not occur in the descendants of caption + + + + + note must not occur in the descendants of caption + + + + + tip must not occur in the descendants of caption + + + + + warning must not occur in the descendants of caption + + + + + sidebar must not occur in the descendants of caption + + + + + task must not occur in the descendants of caption + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + A general-purpose element for representing the syntax of commands or functions + + + + +
+
+ + + + + + Specifies the character that should separate the command and its top-level arguments + + + + + Indicates the displayed length of the command; this information may be used to intelligently indent command synopses which extend beyond one line + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A syntax summary for a software command + + + + + + + + + + + + + + + +
+ + + norepeat + Can not be repeated. + repeat + Can be repeated. + + + + + Indicates whether or not repetition is possible. + + + + + + opt + Formatted to indicate that it is optional. + plain + Formatted without indication. + req + Formatted to indicate that it is required. + + + + + Indicates optionality. + + + + + + Indicates optionality. + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + An argument in a CmdSynopsis + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A group of elements in a CmdSynopsis + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + An explicit line break in a command synopsis + + + + +
+
+ + + + + + + + + + + + + + + A portion of a CmdSynopsis broken out from the main body of the synopsis + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A reference to a fragment of a command synopsis + + + @linkend on synopfragmentref must point to a synopfragment. + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + The syntax summary for a function definition + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + Information supplementing the FuncDefs of a FuncSynopsis + + + + +
+
+ + + + + + + + + + + + + + + The prototype of a function + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A function (subroutine) name and its return type + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + An empty element in a function synopsis indicating that the function in question takes no arguments + + + + +
+
+ + + + + + + + + + + + + + + An empty element in a function synopsis indicating a variable number of arguments + + + + +
+
+ + + + + + opt + Formatted to indicate that it is optional. + req + Formatted to indicate that it is required. + + + + + Indicates optionality. + + + + + + + + + + + + + + + + + + Information about a function parameter in a programming language + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + Parameters for a function referenced through a function pointer in a synopsis + + + + +
+
+ + + + + + class + This is the synopsis of a class + interface + This is the synopsis of an interface + + + + + Specifies the nature of the synopsis + + + + + + + + + + + + + + + + + + + + + The syntax summary for a class definition + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + Information supplementing the contents of a ClassSynopsis + + + + +
+
+ + + + + + + + + + + + + + + A class in an object-oriented programming language + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + An interface in an object-oriented programming language + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + An exception in an object-oriented programming language + + + + + + + + + + +
+ + + Can be used to indicate that whitespace in the modifier should be preserved (for multi-line annotations, for example). + preserve + Extra whitespace and line breaks must be preserved. + + + +
+ + + + + + + + + + + + + + + + + + Modifiers in a synopsis + + + + +
+
+ + + + + + + + + + + + + + + The name of an interface + + + + +
+
+ + + + + + + + + + + + + + + The name of an exception + + + + +
+
+ + + + + + + + + + + + + + + + + + The name of a field in a class definition + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The initializer for a FieldSynopsis + + + + +
+
+ + + + + + + + + + + + + + + + + + A syntax summary for a constructor + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A syntax summary for a destructor + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A syntax summary for a method + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The name of a method + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + Parameters to a method + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + A real-world address, generally a postal address + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A street address in an address + + + + +
+
+ + + + + + + + + + + + + + + A post office box in an address + + + + +
+
+ + + + + + + + + + + + + + + A postal code in an address + + + + +
+
+ + + + + + + + + + + + + + + The name of a city in an address + + + + +
+
+ + + + + + + + + + + + + + + A state or province in an address + + + + +
+
+ + + + + + + + + + + + + + + The name of a country + + + + +
+
+ + + + + + + + + + + + + + + A telephone number + + + + +
+
+ + + + + + + + + + + + + + + A fax number + + + + +
+
+ + + + + + + + + + + + + + + Uncategorized information in address + + + + +
+
+ + + + + + + + + + + + + + + The institutional affiliation of an individual + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A brief description of an affiliation + + + + +
+
+ + + + + + + + + + + + + + + The title of an individual in an organization + + + + +
+
+ + + consortium + A consortium + corporation + A corporation + informal + An informal organization + nonprofit + A non-profit organization + + + + + Specifies the nature of the organization + + + + + + Specifies the nature of the organization + other + Indicates a non-standard organization class + + + Identifies the non-standard nature of the organization + + + + + + + + + + + + + + + + + + + + + + + + + + The name of an organization other than a corporation + + + + +
+
+ + + + + + + + + + + + + + + A division of an organization + + + + + + +
+
+ + + + + + + + + + + + + + + The page numbers of an article as published + + + + +
+
+ + + + + + + + + + + + + + + The personal name of an individual + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + The name of an individual author + + + + +
+
+ + + + + + + + + + + + + + + Wrapper for author information when a document has multiple authors or collabarators + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + Identifies a collaborator + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The initials or other short identifier for an author + + + + +
+
+ + + + + + + + + + + + + + + A person and associated metadata + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + An organization and associated metadata + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A wrapper for document meta-information about a conference + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The dates of a conference for which a document was written + + + + +
+
+ + + + + + + + + + + + + + + The title of a conference for which a document was written + + + + +
+
+ + + + + + + + + + + + + + + An identifier, frequently numerical, associated with a conference for which a document was written + + + + +
+
+ + + + + + + + + + + + + + + The sponsor of a conference for which a document was written + + + + +
+
+ + + + + + + + + + + + + + + The contract number of a document + + + + +
+
+ + + + + + + + + + + + + + + The sponsor of a contract + + + + +
+
+ + + + + + + + + + + + + + + Copyright information about a document + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The year of publication of a document + + + + +
+
+ + + + + + + + + + + + + + + The name of the individual or organization that holds a copyright + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + Additional content for the cover of a publication + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + The date of publication or revision of a document + + + + +
+
+ + + + + + + + + + + + + + + The name or number of an edition of a document + + + + +
+
+ + + + + + + + + + + + + + + The name of the editor of a document + + + + +
+
+ + + + + + + + + + + + + + + + An identifier for a document + + + + +
+
+ + + + + + + + + + + + + + + + A citation of a bibliographic identifier + + + + +
+
+ + + + + + + + + + + + + + + + The source of a document + + + + +
+
+ + + hasformat + The described resource pre-existed the referenced resource, which is essentially the same intellectual content presented in another format + haspart + The described resource includes the referenced resource either physically or logically + hasversion + The described resource has a version, edition, or adaptation, namely, the referenced resource + isformatof + The described resource is the same intellectual content of the referenced resource, but presented in another format + ispartof + The described resource is a physical or logical part of the referenced resource + isreferencedby + The described resource is referenced, cited, or otherwise pointed to by the referenced resource + isreplacedby + The described resource is supplanted, displaced, or superceded by the referenced resource + isrequiredby + The described resource is required by the referenced resource, either physically or logically + isversionof + The described resource is a version, edition, or adaptation of the referenced resource; changes in version imply substantive changes in content rather than differences in format + references + The described resource references, cites, or otherwise points to the referenced resource + replaces + The described resource supplants, displaces, or supersedes the referenced resource + requires + The described resource requires the referenced resource to support its function, delivery, or coherence of content + + + + + + Identifies the type of relationship + + + + + + + + Identifies the type of relationship + othertype + The described resource has a non-standard relationship with the referenced resource + + + + A keyword that identififes the type of the non-standard relationship + + + + + + + + + + + + + + + + + + + + + + + + + + The relationship of a document to another + + + + +
+
+ + + dcmipoint + The DCMI Point identifies a point in space using its geographic coordinates + iso3166 + ISO 3166 Codes for the representation of names of countries + dcmibox + The DCMI Box identifies a region of space using its geographic limits + tgn + The Getty Thesaurus of Geographic Names + + + + + + Specifies the type of spatial coverage + + + + + + + + Specifies the type of spatial coverage + otherspatial + Identifies a non-standard type of coverage + + + + A keyword that identifies the type of non-standard coverage + + + + + + + + + + + + dcmiperiod + A specification of the limits of a time interval + w3c-dtf + W3C Encoding rules for dates and times—a profile based on ISO 8601 + + + + + + Specifies the type of temporal coverage + + + + + + + + Specifies the type of temporal coverage + othertemporal + Specifies a non-standard type of coverage + + + + A keyword that identifies the type of non-standard coverage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The spatial or temporal coverage of a document + + + + +
+
+ + + + + + + + + + + + + + + + + + A statement of legal obligations or requirements + + + + + + + +
+
+ + + copyeditor + A copy editor + graphicdesigner + A graphic designer + other + Some other contributor + productioneditor + A production editor + technicaleditor + A technical editor + translator + A translator + + + + + + Identifies the nature of the contributor + + + + + + + Identifies the nature of the non-standard contribution + + + + + + + Identifies the nature of the contributor + other + Identifies a non-standard contribution + + + + + + + + + + + + + + + + + + + + + + + + + + A person or entity, other than an author or editor, credited in a document + + + + +
+
+ + + + + + + + + + + + + + + The numbers of the pages in a book, for use in a bibliographic entry + + + + +
+
+ + + + + + + + + + + + + + + A summary of the contributions made to a document by a credited source + + + + +
+
+ + + + + + + + + + + + + + + The title of a person + + + + +
+
+ + + + + + + + + + + + + + + The first name of a person + + + + +
+
+ + + + + + + + + + + + + + + A family name; in western cultures the last name + + + + +
+
+ + + + + + + + + + + + + + + The portion of a person's name indicating a relationship to ancestors + + + + +
+
+ + + + + + + + + + + + + + + A component of a persons name that is not a first name, surname, or lineage + + + + +
+
+ + + + + + + + + + + + + + + The printing history of a document + + + + + + +
+
+ + + + + + copyright + A name with a copyright + registered + A name with a registered copyright + service + A name of a service + trade + A name which is trademarked + + + + + Specifies the class of product name + + + + + + + + + + + + + + + + + + The formal name of a product + + + + +
+
+ + + + + + + + + + + + + + + A number assigned to a product + + + + +
+
+ + + + + + + + + + + + + + + The date of publication of a document + + + + +
+
+ + + + + + + + + + + + + + + The publisher of a document + + + + + + + +
+
+ + + + + + + + + + + + + + + The name of the publisher of a document + + + + +
+
+ + + + + + + + + + + + + + + Information about a particular release of a document + + + + +
+
+ + + + + + + + + + + + + + + + + + A history of the revisions to a document + + + + + + + +
+
+ + + + + + + + + + + + + + + An entry describing a single revision in the history of the revisions to a document + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A document revision number + + + + +
+
+ + + + + + + + + + + + + + + A description of a revision to a document + + + + +
+
+ + + + + + + + + + + + + + + A extended description of a revision to a document + + + + + + +
+
+ + + + + + + + + + + + + + + Numbers of the volumes in a series of books + + + + +
+
+ + + + + + + + + + + + + + + The volume number of a document in a set (as of books in a set or articles in a journal) + + + + +
+
+ + + + + + + + + + + + + + + The number of an issue of a journal + + + + +
+
+ + + + + + + + + + + + + + + A graphical user interface (GUI) keyboard shortcut + + + + +
+
+ + + hardware + A hardware application + software + A software application + + + + + Identifies the class of application + + + + + + + + + + + + + + + + + + + + + The name of a software program + + + + +
+
+ + + + + + + + + + + + + + + A software or application package + + + + +
+
+ + + + + + + + + + + + + + + The name of a class, in the object-oriented programming sense + + + + +
+
+ + + + + + + + + + + + + + + The name of an executable program or other software command + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + Data, generally text, displayed or presented by a computer + + + + + + +
+
+ + + altkey + An alternate or secondary key + constraint + A constraint + datatype + A data type + field + A field + foreignkey + A foreign key + group + A group + index + An index + key1 + The first or primary key + key2 + An alternate or secondary key + name + A name + primarykey + The primary key + procedure + A (stored) procedure + record + A record + rule + A rule + secondarykey + The secondary key + table + A table + user + A user + view + A view + + + + + Identifies the class of database artifact + + + + + + + + + + + + + + + + + + + + + The name of a database, or part of a database + + + + +
+
+ + + + + + + + + + + + + + + An email address + + + + +
+
+ + + + + + + + + + + + + + + A software environment variable + + + + +
+
+ + + + + + + + + + + + + + + An error code + + + + +
+
+ + + + + + + + + + + + + + + An error name + + + + +
+
+ + + + + + + + + + + + + + + An error message. + + + + +
+
+ + + + + + + + + + + + + + + The classification of an error message + + + + +
+
+ + + devicefile + A device + directory + A directory + extension + A filename extension + headerfile + A header file (as for a programming language) + libraryfile + A library file + partition + A partition (as of a hard disk) + symlink + A symbolic link + + + + + Identifies the class of filename + + + + + + Specifies the path of the filename + + + + + + + + + + + + + + + + + + + + + + + The name of a file + + + + +
+
+ + + + + + + + + + + + + + + The name of a function or subroutine, as in a programming language + + + + +
+
+ + + + + + + + + + + + + + + The text on a button in a GUI + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + Graphic and/or text appearing as a icon in a GUI + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The text of a label in a GUI + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The name of a menu in a GUI + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The name of a terminal menu item in a GUI + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The name of a submenu in a GUI + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A physical part of a computer system + + + + +
+
+ + + alt + The "Alt" key + backspace + The "Backspace" key + command + The "Command" key + control + The "Control" key + delete + The "Delete" key + down + The down arrow + end + The "End" key + enter + The "Enter" or "Return" key + escape + The "Escape" key + home + The "Home" key + insert + The "Insert" key + left + The left arrow + meta + The "Meta" key + option + The "Option" key + pagedown + The page down key + pageup + The page up key + right + The right arrow + shift + The "Shift" key + space + The spacebar + tab + The "Tab" key + up + The up arrow + + + + + + Identifies the function key + + + + + + + + Identifies the function key + other + Indicates a non-standard function key + + + + Specifies a keyword that identifies the non-standard key + + + + + + + + + + + + + + + + + + + + + + + + The text printed on a key on a keyboard + + + + +
+
+ + + + + + + + + + + + + + + The internal, frequently numeric, identifier for a key on a keyboard + + + + +
+
+ + + click + A (single) mouse click. + double-click + A double mouse click. + press + A mouse or key press. + seq + Sequential clicks or presses. + simul + Simultaneous clicks or presses. + + + + + + Identifies the nature of the action taken. If keycombo + contains more than one element, simul + is the default, otherwise there is no default. + + + + + + + + Identifies the nature of the action taken + other + Indicates a non-standard action + + + + Identifies the non-standard action in some unspecified way. + + + + + + + + + + + + + + + + + + + + + + + + A combination of input actions + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The symbolic name of a key on a keyboard + + + + +
+
+ + + + + + + + + + + + + + + A comment on a line in a verbatim listing + + + + +
+
+ + + + + + + + + + + + + + + Inline text that is some literal value + + + + +
+
+ + + Identifies the (computer) language of the code fragment + + + + + + + + + + + + + + + + + + + + An inline code fragment + + + + + + + + + +
+
+ + + Identifies the class of constant + limit + The value is a limit of some kind + + + + + + + + + + + + + + + + + + + + A programming or system constant + + + + +
+
+ + + + + + + + + + + + + + + The name of a variable + + + + +
+
+ + + + + + + + + + + + + + + A string of formatting markup in text that is to be represented literally + + + + +
+
+ + + + + + + + + + + + + + + A selection or series of selections from a menu + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + A key combination for an action that is also accessible through a menu + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The conventional name of a mouse button + + + + +
+
+ + + + + + + + + + + + + + + An option for a software command + + + + +
+
+ + + + + + + + + + + + + + + Optional information + + + + +
+
+ + + + + + + + + + + + + + + A unit of data associated with some part of a computer system + + + + +
+
+ + + command + A command + function + A function + option + An option + + + + + Identifies the class of parameter + + + + + + + + + + + + + + + + + + + + + A value or a symbolic reference to a value + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + A character or string indicating the start of an input field in a computer display + + + + + + +
+ + + + + + +
+ + + command + A command + function + A function + option + An option + parameter + A parameter + + + + + Identifies the nature of the replaceable text + + + + + + + + + + + + + + + + + + + + + Content that may or must be replaced by the user + + + + + + +
+
+ + + + + + + + + + + + + + + The value returned by a function + + + + +
+
+ + + + + + attribute + An attribute + attvalue + An attribute value + element + An element + emptytag + An empty element tag + endtag + An end tag + genentity + A general entity + localname + The local name part of a qualified name + namespace + A namespace + numcharref + A numeric character reference + paramentity + A parameter entity + pi + A processing instruction + prefix + The prefix part of a qualified name + comment + An SGML comment + starttag + A start tag + xmlpi + An XML processing instruction + + + + + Identifies the nature of the tag content + + + + + + Identifies the namespace of the tag content + + + + + + + + + + + + + + + + + + + + + A component of XML (or SGML) markup + + + + +
+
+ + + Identifies the class of symbol + limit + The value is a limit of some kind + + + + + + + + + + + + + + + + + + + + A name that is replaced by a value before processing + + + + +
+ + + + + + +
+ + + daemon + A daemon or other system process (syslogd) + domainname + A domain name (example.com) + etheraddress + An ethernet address (00:05:4E:49:FD:8E) + event + An event of some sort (SIGHUP) + eventhandler + An event handler of some sort (hangup) + filesystem + A filesystem (ext3) + fqdomainname + A fully qualified domain name (my.example.com) + groupname + A group name (wheel) + ipaddress + An IP address (127.0.0.1) + library + A library (libncurses) + macro + A macro + netmask + A netmask (255.255.255.192) + newsgroup + A newsgroup (comp.text.xml) + osname + An operating system name (Hurd) + process + A process (gnome-cups-icon) + protocol + A protocol (ftp) + resource + A resource + server + A server (mail.example.com) + service + A service (ppp) + systemname + A system name (hephaistos) + username + A user name (ndw) + + + + + Identifies the nature of the system item + + + + + + + + + + + + + + + + + + + + + A system-related item or term + + + + + + +
+
+ + + + Identifies the type of URI specified + + + + + + + + + + + + + + + + + + + A Uniform Resource Identifier + + + + +
+
+ + + + + + + + + + + + + + + A unit of information + + + + +
+
+ + + + + + + + + + + + + + + The classification of a value + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + Data entered by the user + + + + + + +
+
+ + + + + + + + + + + + + + + An abbreviation, especially one followed by a period + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + An often pronounceable word made from the initial (or selected) letters of a name or phrase + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + An inline bibliographic reference to another published work + + + + + + +
+
+ + + + + + + + + + + + + + + A citation to a reference page + + + + + + + +
+
+ + + + + + + + + + + + + + + The title of a reference page + + + + + + +
+
+ + + + + + + + + + + + + + + A reference volume number + + + + +
+
+ + + article + An article + bbs + A bulletin board system + book + A book + cdrom + A CD-ROM + chapter + A chapter (as of a book) + dvd + A DVD + emailmessage + An email message + gopher + A gopher page + journal + A journal + manuscript + A manuscript + newsposting + A posting to a newsgroup + part + A part (as of a book) + refentry + A reference entry + section + A section (as of a book or article) + series + A series + set + A set (as of books) + webpage + A web page + wiki + A wiki page + + + + + Identifies the nature of the publication being cited + + + + + + + + + + + + + + + + + + + + + The title of a cited work + + + + + + +
+
+ + + + + + + + + + + + + + + Emphasized text + + + + + + +
+
+ + + A limited span of emphasized text + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A word or phrase in a language other than the primary language of the document + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A span of text + + + + + + +
+
+ + + A limited span of text + + + + +
+
+ + + + + + + + + + + + + + + An inline quotation + + + + + + +
+
+ + + + + + + + + + + + + + + A subscript (as in H2 +O, the molecular formula for water) + + + + +
+
+ + + + + + + + + + + + + + + A superscript (as in x^2, the mathematical notation for x multiplied by itself) + + + + +
+
+ + + copyright + A copyright + registered + A registered copyright + service + A service + trade + A trademark + + + + + Identifies the class of trade mark + + + + + + + + + + + + + + + + + + + + + A trademark + + + + +
+
+ + + + + + + + + + + + + + + A word meant specifically as a word and not representing anything else + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + A cross reference to a footnote (a footnote mark) + + + @linkend on footnoteref must point to a footnote. + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A cross reference to another part of the document + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A hypertext link + + + + + + +
+
+ + + + + + + + + Holds additional information that may be used by the applicatoin when resolving the link + + + + + Specifies the URI of the document in which the link target appears + + + + + + Specifies the location of the link target in the document + + + + + Identifies application-specific customization of the link behavior + + + + + + + + + + + + + + + + + + + + + + + + + + + + A link that addresses its target indirectly + + + + + + +
+
+ + + + + + + + + + + + + + A spot in the document + + + + +
+
+ + + + + + + + + + + + + + A text-only annotation, often used for accessibility + + + + + + + + + +
+ + + Identifies one or more annotations that apply to this element + + +
+ + + + + + Identifies one ore more elements to which this annotation applies + + + + + + + + + + + + + + + + + + + An annotation + + + annotation must not occur in the descendants of annotation + + + + + + + + + +
+ + + + Specifies the XLink traversal-from + + + + + + + + Specifies the XLink label + + + + + + + + Specifies the XLink traversal-to + + + + +
+ + + + + + + + + + + + Identifies the XLink link type + extended + An XLink extended link + + + + + + + + + + + + + An XLink extended link + + + + + + + + + +
+
+ + + + + + + + + + + + Identifies the XLink link type + locator + An XLink locator link + + + + + + + + + + + + + + + + + An XLink locator in an extendedlink + + + + +
+
+ + + + + + + + + + + + Identifies the XLink link type + arc + An XLink arc link + + + + + + + + + + + + + + + + + + + + + + + + + An XLink arc in an extendedlink + + + + +
+ + + Identifies the editorial or publication status of the element on which it occurs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A collection of books + + + The root element must have a version attribute. + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A book + + + The root element must have a version attribute. + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + The dedication of a book or other component + + + The root element must have a version attribute. + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + Acknowledgements of a book or other component + + + The root element must have a version attribute. + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + Text at the back of a book describing facts about its production + + + The root element must have a version attribute. + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + An appendix in a Book or Article + + + The root element must have a version attribute. + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A chapter, as of a book + + + The root element must have a version attribute. + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A division in a book + + + The root element must have a version attribute. + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + Introductory matter preceding the first chapter of a book + + + The root element must have a version attribute. + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + An introduction to the contents of a part + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A recursive section + + + The root element must have a version attribute. + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A section of a document with no subdivisions + + + + + + + +
+ + + +
+ + + + + + faq + A collection of frequently asked questions. + journalarticle + An article in a journal or other periodical. + productsheet + A description of a product. + specification + A specification. + techreport + A technical report. + whitepaper + A white paper. + + + + + Identifies the nature of the article + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An article + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A top-level section of document + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A subsection within a Sect1 + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A subsection within a Sect2 + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A subsection within a Sect3 + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A subsection within a Sect4 + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + A collection of reference entries + + + The root element must have a version attribute. + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + A reference page (originally a UNIX man-style reference page) + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + Meta-information for a reference entry + + + + + + + + + + + + + + + + +
+ + + source + The name of the software product or component to which this topic applies + version + The version of the software product or component to which this topic applies + manual + The section title of the reference page (e.g., User Commands) + sectdesc + The section title of the reference page (believed synonymous with "manual" but in wide use) + software + The name of the software product or component to which this topic applies (e.g., SunOS x.y; believed synonymous with "source" but in wide use) + + + + + + Identifies the kind of miscellaneous information + + + + + + + Identifies the nature of non-standard miscellaneous information + + + + + + Identifies the kind of miscellaneious information + other + Indicates that the information is some 'other' kind. + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + Meta-information for a reference entry other than the title and volume number + + + + +
+
+ + + + + + + + + + + + + + + The name, purpose, and classification of a reference page + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A description of the topic of a reference page + + + + + + +
+
+ + + + + + + + + + + + + + + The name of (one of) the subject(s) of a reference page + + + + + + +
+
+ + + + + + + + + + + + + + + A short (one sentence) synopsis of the topic of a reference page + + + + + + +
+
+ + + + + + + + + + + + + + + The scope or other indication of applicability of a reference entry + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A syntactic synopsis of the subject of the reference page + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + A recursive section in a refentry + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A major subsection of a reference entry + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A subsection of a refsect1 + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A subsection of a refsect2 + + + The root element must have a version attribute. + + + + + + + + + +
+ + + + + + + + + + Specifies the base form of the term, the one that appears in the glossary. This allows adjectival, plural, and other variations of the term to appear in the element. The element content is the default base form. + + + +
+ + + + + + + + + + + + + + + + + + A wrapper for a list of glossary entries + + + + + + + + + + + + +
+
+ + + + + + Specifies the string by which the element's content is to be sorted; if unspecified, the content is used + + + + + + + + + + + + + + + + + An entry in a Glossary or GlossList + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + Specifies a list of keywords for the definition + + + + + + + + + + + + + + + + + A definition in a GlossEntry + + + + + + + + + +
+
+ + + + + + Identifies the other term + + + + + + + + + + + + + + + + + + A cross-reference from one glossentry + to another + + + @otherterm on glosssee must point to a glossentry. + + + + + + + + +
+
+ + + + + + Identifies the other term + + + + + + + + + + + + + + + + + + A cross-reference from one GlossEntry to another + + + @otherterm on glossseealso must point to a glossentry. + + + + + + + + +
+
+ + + + + + + + + + + + + + + + The first occurrence of a term + + + @linkend on firstterm must point to a glossentry. + + + + + + + + +
+
+ + + + + + + + + + + + + + + + A glossary term + + + @linkend on glossterm must point to a glossentry. + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A glossary + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A division in a Glossary + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + An inline definition of a term + + + A termdef must contain exactly one firstterm + + + + + + + + +
+ + + Identifies the relationship between the bibliographic elemnts + + +
+ + + + + + + + + + + + + + + An entry in a Bibliography + + + + + + +
+
+ + + + + + + + + + + + + + + An entry in a Bibliography + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + A raw container for related bibliographic information + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + A cooked container for related bibliographic information + + + + + + + + + +
+
+ + + + + + + + + + + + + + + Untyped bibliographic information + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A bibliography + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A section of a Bibliography + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A wrapper for a list of bibliography entries + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + The units (for example, pages) used to identify the beginning and ending of a reference. + + + + + + Identifies the beginning of a reference; the location within the work that is being referenced. + + + + + + Identifies the end of a reference. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A cross-reference to a bibliographic entry + + + + +
+ + + normal + Normal + preferred + Preferred + + + + + Specifies the significance of the term + + + + + + Specifies the IDs of the elements to which this term applies + + + + + + Indicates the page on which this index term occurs in some version of the printed document + + + + + all + All indexes + global + The global index (as for a combined index of a set of box) + local + The local index (the index for this document only) + + + + + Specifies the scope of the index term + + + + + + Specifies the string by which the term is to be sorted; if unspecified, the term content is used + + + + + Specifies the target index for this term + + +
+ + + + + + + + + + + + + + + A set of index terms in the meta-information of a document + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + Identifies the class of index term + singular + A singular index term + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A wrapper for an indexed term + + + + +
+
+ + + + + + Identifies the class of index term + startofrange + The start of a range + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A wrapper for an indexed term that covers a range + + + + +
+
+ + + + + + Identifies the class of index term + endofrange + The end of a range + + + + + Points to the start of the range + + + + + + + + + + + + + + + + + Identifies the end of a range associated with an indexed term + + + + +
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + The primary word or phrase under which an index term should be sorted + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A secondary word or phrase in an index term + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A tertiary word or phrase in an index term + + + + + + +
+
+ + + + + + + + + + + + + + + Part of an index term directing the reader instead to another entry in the index + + + + + + +
+
+ + + + + + + + + + + + + + + Part of an index term directing the reader also to another entry in the index + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An index to a book or part of a book + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An index to a set of books + + + The root element must have a version attribute. + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + A division in an index + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + An entry in an index + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + A primary term in an index entry, not in the text + + + + + + +
+
+ + + + + + + + + + + + + + + + + A secondary term in an index entry, rather than in the text + + + + + + +
+
+ + + + + + + + + + + + + + + + + A tertiary term in an index entry, rather than in the text + + + + + + +
+
+ + + + + + + + + + + + + + + + + A See +entry in an index, rather than in the text + + + + + + +
+
+ + + + + + + + + + + + + + + + + A See also + entry in an index, rather than in the text + + + + + + +
+ + + Indicates the page on which this element occurs in some version of the printed document + + +
+ + + + + + + + + + + + + + + + + + A table of contents + + + The root element must have a version attribute. + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + A division in a table of contents + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + A component title in a table of contents + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + A task to be completed + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A summary of a task + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + The prerequisites for a task + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + Information related to a task + + + + + + + +
+ + + calspair + Coordinates expressed as a pair of CALS graphic coordinates. + linecolumn + Coordinates expressed as a line and column. + linecolumnpair + Coordinates expressed as a pair of lines and columns. + linerange + Coordinates expressed as a line range. + + + + + + Identifies the units used in the coords attribute The default units vary according to the type of callout specified: calspair + for graphics and linecolumn + for line-oriented elements. + + + + + + + + Indicates that non-standard units are used for this area +. In this case otherunits + must be specified. + other + Coordinates expressed in some non-standard units. + + + + Identifies the units used in the coords + attribute when the units + attribute is other +. This attribute is forbidden otherwise. + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + A list of callout +s + + + + + + + + + + +
+
+ + + + + + Identifies the areas described by this callout. + + + + + + + + + + + + + + + A called out + description of a marked Area + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A program listing with associated areas used in callouts + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + A collection of regions in a graphic or code example + + + + + + + + + +
+
+ + + + + + Point to the callout +s which refer to this area. (This provides bidirectional linking which may be useful in online presentation.) + + + + + + Specifies an identifying number or string that may be used in presentation. The area label might be drawn on top of the figure, for example, at the position indicated by the coords attribute. + + + + + Provides the coordinates of the area. The coordinates must be interpreted using the units + specified. + + + + + + + + + + + + + + + + + + + + + + + + A region defined for a Callout in a graphic or code example + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + A region defined for a Callout in a graphic or code example + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A set of related areas in a graphic or code example + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A screen with associated areas used in callouts + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A wrapper for an image object with callouts + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + The location of a callout embedded in text + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + A cross reference to a co + + + + +
+
+ + + + + + + + + + + + + + + + + + A set of EBNF productions + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A production in a set of EBNF productions + + + + + + + + +
+
+ + + + + + + + + + + + + + + The left-hand side of an EBNF production + + + + +
+
+ + + + + + + + + + + + + + + The right-hand side of an EBNF production + + + + + + + + + + + +
+
+ + + + + + Specifies a URI that points to a production +where the nonterminal + is defined + + + + + + + + + + + + + + + + A non-terminal in an EBNF production + + + + +
+
+ + + + + + + + + + + + + + + A constraint in an EBNF production + + + + +
+
+ + + + + + + + + + + + + + + A cross-reference to an EBNF production + + + + +
+
+ + + + + + + + + + + + + + + + + + The definition of a constraint in an EBNF production + + + + + + + +
+ + + Specifies the alignment character when align + is set to char +. + + + + + Specifies the percentage of the column's total width that should appear to the left of the first occurance of the character identified in char + when align + is set to char +. + + 0 + 100 + + + + + + Specifies how the table is to be framed. Note that there is no way to obtain a border on only the starting edge (left, in left-to-right writing systems) of the table. + + all + Frame all four sides of the table. In some environments with limited control over table border formatting, such as HTML, this may imply additional borders. + bottom + Frame only the bottom of the table. + none + Place no border on the table. In some environments with limited control over table border formatting, such as HTML, this may disable other borders as well. + sides + Frame the left and right sides of the table. + top + Frame the top of the table. + topbot + Frame the top and bottom of the table. + + + + + + Specifies the presence or absence of the column separator + + 0 + No column separator rule. + 1 + Provide a column separator rule on the right + + + + + + Specifies the presence or absence of the row separator + + 0 + No row separator rule. + 1 + Provide a row separator rule below + + + + + + Specifies the orientation of the table + + land + 90 degrees counter-clockwise from the rest of the text flow. + port + The same orientation as the rest of the text flow. + + + + + + Specifies the table style + + + + + Indicates whether or not the entries in the first column should be considered row headers + + firstcol + Indicates that entries in the first column of the table are functionally row headers (analogous to the way that a thead provides column headers). + norowheader + Indicates that entries in the first column have no special significance with respect to column headers. + + + + + + Specifies the horizontal alignment of text in an entry. + + center + Centered. + char + Aligned on a particular character. + justify + Left and right justified. + left + Left justified. + right + Right justified. + + + + + + Specifies the vertical alignment of text in an entry. + + bottom + Aligned on the bottom of the entry. + middle + Aligned in the middle. + top + Aligned at the top of the entry. + + + + + + Specifies a column specification by name. + + + + + Specifies a starting column by name. + + + + + Specifies a span by name. + + + + + + Specifies a starting column by name. + + + Specifies an ending column by name. + + + + + + + + + + + + + + Provides a name for a column specification. + + + + + Provides a name for a span specification. + + +
+ + + + + + Additional style information for downstream processing; typically the name of a style. + + + + + The number of columns in the table. Must be an integer greater than zero. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A wrapper for the main content of a table, or part of a table + + + + + + + + + + + + + + + + +
+
+ + + + + + The number of the column to which this specification applies. Must be greater than any preceding column number. Defaults to one more than the number of the preceding column, if there is one, or one. + + + + + + Specifies the width of the column. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Specifications for a column in a table + + + + +
+
+ + + + + + Specifies a starting column by name. + + + + + Specifies an ending column by name. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Formatting information for a spanned column in a table + + + + +
+
+ + + + + + + + + + + + + + + + + + A table header consisting of one or more rows + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A table footer consisting of one or more rows + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A wrapper for the rows of a table or informal table + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + A row in a table + + + + + + + + + +
+
+ + + + + + Specifies the number of additional rows which this entry occupies. Defaults to zero. + + + + + + Specifies the rotation of this entry. A value of 1 (true) rotates the cell 90 degrees counter-clockwise. A value of 0 (false) leaves the cell unrotated. + + 0 + Do not rotate the cell. + 1 + Rotate the cell 90 degrees counter-clockwise. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A cell in a table + + + + + + + + + + + +
+
+ + + + + + Additional style information for downstream processing; typically the name of a style. + + + + + The number of columns in the entry table. Must be an integer greater than zero. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A subtable appearing in place of an Entry in a table + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A table header consisting of one or more rows + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A wrapper for the rows of a table or informal table + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + A row in a table + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Indicates if the short or long title should be used in a List of Tables + + 0 + Indicates that the full title should be used. + 1 + Indicates that the short short title (titleabbrev) should be used. + + + + + + Indicates if the table should appear in a List of Tables + + 0 + Indicates that the table should not occur in the List of Tables. + 1 + Indicates that the table should appear in the List of Tables. + + + + + + + + + + + + + + A formal table in a document + + + example must not occur in the descendants of table + + + + + figure must not occur in the descendants of table + + + + + equation must not occur in the descendants of table + + + + + caution must not occur in the descendants of table + + + + + important must not occur in the descendants of table + + + + + note must not occur in the descendants of table + + + + + tip must not occur in the descendants of table + + + + + warning must not occur in the descendants of table + + + + + informaltable must not occur in the descendants of table + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A table without a title + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + This attribute assigns a class name or set of class names to an element. Any number of elements may be assigned the same class name or names. Multiple class names must be separated by white space characters. + + + + + This attribute specifies style information for the current element. + + + + + This attribute offers advisory information about the element for which it is set. + + + + + + + + This attribute specifies the base language of an element's attribute values and text content. The default value of this attribute is unknown. + + + + + + + + Occurs when the pointing device button is clicked over an element. + + + + + Occurs when the pointing device button is double clicked over an element. + + + + + Occurs when the pointing device button is pressed over an element. + + + + + Occurs when the pointing device button is released over an element. + + + + + Occurs when the pointing device is moved onto an element. + + + + + Occurs when the pointing device is moved while it is over an element. + + + + + Occurs when the pointing device is moved away from an element. + + + + + Occurs when a key is pressed and released over an element. + + + + + Occurs when a key is pressed down over an element. + + + + + Occurs when a key is released over an element. + + + + + + + + + + + + + + + + + Specifies the alignment of data and the justification of text in a cell. + + left + Left-flush data/Left-justify text. This is the default value for table data. + center + Center data/Center-justify text. This is the default value for table headers. + right + Right-flush data/Right-justify text. + justify + Double-justify text. + char + Align text around a specific character. If a user agent doesn't support character alignment, behavior in the presence of this value is unspecified. + + + + + + This attribute specifies a single character within a text fragment to act as an axis for alignment. The default value for this attribute is the decimal point character for the current language as set by the lang attribute (e.g., the period in English and the comma in French). User agents are not required to support this attribute. + + + + + When present, this attribute specifies the offset to the first occurrence of the alignment character on each line. If a line doesn't include the alignment character, it should be horizontally shifted to end at the alignment position. When charoff is used to set the offset of an alignment character, the direction of offset is determined by the current text direction (set by the dir attribute). In left-to-right texts (the default), offset is from the left margin. In right-to-left texts, offset is from the right margin. User agents are not required to support this attribute. + + + + [0-9]+% + + + + + + + + + + Specifies the vertical position of data within a cell. + + top + Cell data is flush with the top of the cell. + middle + Cell data is centered vertically within the cell. This is the default value. + bottom + Cell data is flush with the bottom of the cell. + baseline + All cells in the same row as a cell whose valign attribute has this value should have their textual data positioned so that the first text line occurs on a baseline common to all cells in the row. This constraint does not apply to subsequent text lines in these cells. + + + + + + + + + Provides a summary of the table's purpose and structure for user agents rendering to non-visual media such as speech and Braille. + + + + + Specifies the desired width of the entire table and is intended for visual user agents. When the value is a percentage value, the value is relative to the user agent's available horizontal space. In the absence of any width specification, table width is determined by the user agent. + + + + [0-9]+% + + + + + + + Specifies the width (in pixels only) of the frame around a table. + + + + + + Specifies which sides of the frame surrounding a table will be visible. + + void + No sides. This is the default value. + above + The top side only. + below + The bottom side only. + hsides + The top and bottom sides only. + lhs + The left-hand side only. + rhs + The right-hand side only. + vsides + The right and left sides only. + box + All four sides. + border + All four sides. + + + + + + Specifies which rules will appear between cells within a table. The rendering of rules is user agent dependent. + + none + No rules. This is the default value. + groups + Rules will appear between row groups (see thead, tfoot, and tbody) and column groups (see colgroup and col) only. + rows + Rules will appear between rows only. + cols + Rules will appear between columns only. + all + Rules will appear between all rows and columns. + + + + + + Specifies how much space the user agent should leave between the left side of the table and the left-hand side of the leftmost column, the top of the table and the top side of the topmost row, and so on for the right and bottom of the table. The attribute also specifies the amount of space to leave between cells. + + + + [0-9]+% + + + + + + + Specifies the amount of space between the border of the cell and its contents. If the value of this attribute is a pixel length, all four margins should be this distance from the contents. If the value of the attribute is a percentage length, the top and bottom margins should be equally separated from the content based on a percentage of the available vertical space, and the left and right margins should be equally separated from the content based on a percentage of the available horizontal space. + + + + [0-9]+% + + + + + + + + + + + Provides an abbreviated form of the cell's content and may be rendered by user agents when appropriate in place of the cell's content. Abbreviated names should be short since user agents may render them repeatedly. For instance, speech synthesizers may render the abbreviated headers relating to a particular cell before rendering that cell's content. + + + + + This attribute may be used to place a cell into conceptual categories that can be considered to form axes in an n-dimensional space. User agents may give users access to these categories (e.g., the user may query the user agent for all cells that belong to certain categories, the user agent may present a table in the form of a table of contents, etc.). Please consult an HTML reference for more details. + + + + + Specifies the list of header cells that provide header information for the current data cell. The value of this attribute is a space-separated list of cell names; those cells must be named by setting their id attribute. Authors generally use the headers attribute to help non-visual user agents render header information about data cells (e.g., header information is spoken prior to the cell data), but the attribute may also be used in conjunction with style sheets. + + + + + Specifies the set of data cells for which the current header cell provides header information. This attribute may be used in place of the headers attribute, particularly for simple tables. + + row + The current cell provides header information for the rest of the row that contains it + col + The current cell provides header information for the rest of the column that contains it. + rowgroup + The header cell provides header information for the rest of the row group that contains it. + colgroup + The header cell provides header information for the rest of the column group that contains it. + + + + + + Specifies the number of rows spanned by the current cell. The default value of this attribute is one (1 +). The value zero (0 +) means that the cell spans all rows from the current row to the last row of the table section (thead +, tbody +, or tfoot +) in which the cell is defined. + + + + + + Specifies the number of columns spanned by the current cell. The default value of this attribute is one (1 +). The value zero (0 +) means that the cell spans all columns from the current column to the last column of the column group (colgroup +) in which the cell is defined. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A formal (captioned) HTML table in a document + + + example must not occur in the descendants of table + + + + + figure must not occur in the descendants of table + + + + + equation must not occur in the descendants of table + + + + + caution must not occur in the descendants of table + + + + + important must not occur in the descendants of table + + + + + note must not occur in the descendants of table + + + + + tip must not occur in the descendants of table + + + + + warning must not occur in the descendants of table + + + + + informaltable must not occur in the descendants of table + + + + + + +
+
+ + + + + + + + + An HTML table without a title + + + + +
+
+ + + + + + An HTML table caption + + + example must not occur in the descendants of caption + + + + + figure must not occur in the descendants of caption + + + + + table must not occur in the descendants of caption + + + + + equation must not occur in the descendants of caption + + + + + caution must not occur in the descendants of caption + + + + + important must not occur in the descendants of caption + + + + + note must not occur in the descendants of caption + + + + + tip must not occur in the descendants of caption + + + + + warning must not occur in the descendants of caption + + + + + sidebar must not occur in the descendants of caption + + + + + task must not occur in the descendants of caption + + + + + + + + +
+
+ + + + + + This attribute, whose value must be an integer > 0, specifies the number of columns spanned + by the col + element; the col + element shares its attributes with all the columns it spans. The default value for this attribute is 1 (i.e., a single column). If the span attribute is set to N > 1, the current col + element shares its attributes with the next N-1 columns. + + + + + + Specifies a default width for each column spanned by the current col + element. It has the same meaning as the width + attribute for the colgroup + element and overrides it. + + + + + + + + + Specifications for a column in an HTML table + + + + +
+
+ + + + + + This attribute, which must be an integer > 0, specifies the number of columns in a column group. In the absence of a span attribute, each colgroup + defines a column group containing one column. If the span attribute is set to N > 0, the current colgroup + element defines a column group containing N columns. User agents must ignore this attribute if the colgroup + element contains one or more col + elements. + + + + + + This attribute specifies a default width for each column in the current column group. In addition to the standard pixel, percentage, and relative values, this attribute allows the special form 0* + (zero asterisk) which means that the width of the each column in the group should be the minimum width necessary to hold the column's contents. This implies that a column's entire contents must be known before its width may be correctly computed. Authors should be aware that specifying 0* + will prevent visual user agents from rendering a table incrementally. This attribute is overridden for any column in the column group whose width is specified via a col + element. + + + + + + + + + A group of columns in an HTML table + + + + + + +
+
+ + + + + + + + + + A table header consisting of one or more rows in an HTML table + + + + + + +
+
+ + + + + + + + + + A table footer consisting of one or more rows in an HTML table + + + + + + +
+
+ + + + + + + + + + A wrapper for the rows of an HTML table or informal HTML table + + + + + + +
+
+ + + + + + + + + + A row in an HTML table + + + + + + + + + +
+
+ + + + + + + + + + + A table header entry in an HTML table + + + + + + + + + + + +
+
+ + + + + + + + + + + A table entry in an HTML table + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A detailed set of messages, usually error messages + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A wrapper for an entry in a message set + + + + + + + + + + + + +
+
+ + + + + + The audience to which the message relevant + + + + + The origin of the message + + + + + The level of importance or severity of a message + + + + + + + + + + + + + + + + + + + + + + + A wrapper for a simpler entry in a message set + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A message in a message set + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + The primary component of a message in a message set + + + + + +
+
+ + + + + + + + + + + + + + + + + + A subcomponent of a message in a message set + + + + + +
+
+ + + + + + + + + + + + + + + + + + A related component of a message in a message set + + + + + +
+
+ + + + + + + + + + + + + + + The actual text of a message component in a message set + + + + + + +
+
+ + + + + + + + + + + + + + + Information about a message in a message set + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + The level of importance or severity of a message in a message set + + + + +
+
+ + + + + + + + + + + + + + + The origin of a message in a message set + + + + +
+
+ + + + + + + + + + + + + + + The audience to which a message in a message set is relevant + + + + +
+
+ + + + + + + + + + + + + + + + + + Explanatory material relating to a message in a message set + + + + + + + +
+
+ + + + + + none + No labels + number + Numeric labels + qanda + "Q:" and "A:" labels + + + + + Specifies the default labelling + + + + + + + + + + + + + + + + + + + + + A question-and-answer set + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A titled division in a QandASet + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A question/answer set within a QandASet + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + A question in a QandASet + + + + + + + + + +
+
+ + + + + + + + + + + + + + + An answer to a question posed in a QandASet + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A label on a Question or Answer + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A displayed mathematical equation + + + example must not occur in the descendants of equation + + + + + figure must not occur in the descendants of equation + + + + + table must not occur in the descendants of equation + + + + + equation must not occur in the descendants of equation + + + + + caution must not occur in the descendants of equation + + + + + important must not occur in the descendants of equation + + + + + note must not occur in the descendants of equation + + + + + tip must not occur in the descendants of equation + + + + + warning must not occur in the descendants of equation + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + A displayed mathematical equation without a title + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + A mathematical equation or expression occurring inline + + + + + + + +
+
+ + + + + + + + + + + + + + + A mathematical phrase, an expression that can be represented with ordinary text and a small amount of markup + + + + + + + + + + +
+
+ + + + + + + + + + + + Specifies that the format of the data is MathML + mathml + Specifies MathML. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A MathML expression in a media object + + + + + + + +
+
+ + + Any element from the MathML namespace + + + + + + + + + + +
+
+ + + + + + + + + + + + Specifies that the format of the data is SVG + svg + Specifies SVG. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An SVG drawing in a media object + + + + + + + +
+
+ + + Any element from the SVG namespace + + + + + + + + + + +
+
diff --git a/plugins/relaxng/testData/highlighting/fixed-attribute_1.xml b/plugins/relaxng/testData/highlighting/fixed-attribute_1.xml new file mode 100644 index 000000000000..453b570495b0 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/fixed-attribute_1.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/fixed-attribute_2.xml b/plugins/relaxng/testData/highlighting/fixed-attribute_2.xml new file mode 100644 index 000000000000..a7a4b233198b --- /dev/null +++ b/plugins/relaxng/testData/highlighting/fixed-attribute_2.xml @@ -0,0 +1,2 @@ +"2.0"> + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/jpdl-3.1.xsd b/plugins/relaxng/testData/highlighting/jpdl-3.1.xsd new file mode 100644 index 000000000000..718783cf6911 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/jpdl-3.1.xsd @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/relaxng/testData/highlighting/mybook.xml b/plugins/relaxng/testData/highlighting/mybook.xml new file mode 100644 index 000000000000..c423ba825294 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/mybook.xml @@ -0,0 +1,525 @@ + + + + Lorem Ipsum + + Nulla scelerisque, nulla turpis + + + + + Petri + Mäkijärvi + + + + European Synchrotron Radiation Facility + +
Grenoble, France
+
+
+ + + + Dr + I. + M. + Noman + + + + Acme Industries, Inc. + +
Anytown, U.S.A.
+
+
+ + + + Maxwell + Smart + + + + C.O.N.T.R.O.L. + +
Washington D.C., U.S.A.
+
+
+
+ + + European Synchrotron Radiation Facility + +
Grenoble, France
+
+ + + 2007 + + European Synchrotron Radiation Facility + + + $Date: 2010/06/09 15:19:01 $ + + $Revision: 1.3 $ + +
+ + + + Lorem Ipsum + + + + + Petri + Mäkijärvi + + + + + + Dr + I. + M. + Noman + + + + + $Date: 2010/06/09 15:19:01 $ + + $Revision: 1.3 $ + + + + Consectetuer adipiscing elit + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + + Curabitur + + urna + + Consectetuer + + Curabitur urna. Maecenas eu nisi faucibus risus ornare + fringilla. Nam laoreet accumsan metus. Maecenas ac nunc non enim consequat + ultrices. Duis egestas condimentum velit. Nulla scelerisque. Nulla turpis. + Nam ante tortor, convallis sit amet, commodo at, dignissim at, dolor. + Proin sodales. Maecenas at enim. Aliquam nunc. Curabitur ullamcorper + molestie neque. Aliquam erat volutpat. Sed non dui et tellus ultrices + porttitor. + + + Curabitur rutrum lobortis orci. Vivamus a urna. Nulla feugiat + euismod massa. In odio quam, posuere at, mattis at, pretium quis, nisi. + Sed eget nibh. Vestibulum ante enim, mattis at, mollis eu, ullamcorper sit + amet, augue. Mauris quam massa, vestibulum rhoncus, bibendum eget, + adipiscing at, enim. Sed pharetra. Praesent ac nibh id massa bibendum + elementum. Sed urna nibh, pharetra in, dapibus at, tristique at, velit. + Maecenas lectus. Pellentesque aliquet pharetra lacus. Aliquam et tellus. + Aenean gravida tristique ipsum. Duis suscipit euismod dolor. Etiam + facilisis mi nec risus. Nam non purus sed nibh cursus luctus. Morbi nunc + sem, hendrerit eu, mattis sit amet, pulvinar nec, nulla. Duis lobortis + metus ut orci. Curabitur facilisis. + + + + Morbi a eros + + Cum sociis natoque penatibus et magnis dis parturient montes, + nascetur ridiculus mus + + Aenean in odio et dui vestibulum eleifend. Donec aliquet + magna. + + + . Curabitur nulla orci, porta eget, tincidunt dapibus, + tincidunt sed, ligula. Nunc vel sapien. In nec diam fermentum purus + tincidunt ullamcorper: + + + Donec facilisis aliquet libero. Maecenas sem dui, scelerisque + vitae, convallis at, gravida eu, purus. Proin quis nisl. Mauris ac purus + eu dolor fringilla tempus. Aliquam elementum. In a neque. Praesent + ipsum. Maecenas elementum magna sit amet eros. Praesent non + sapien. + + +
+ Morbi maecanas sem dui + + + + + + + + + + + + +
+ + + Nullam dapibus + + Mauris et erat egestas libero volutpat vestibulum. Curabitur + viverra iaculis quam. Nulla egestas dui eget odio. Nam dictum elit in + massa. Phasellus nec elit. Maecenas bibendum. Lorem ipsum dolor sit + amet, consectetuer adipiscing elit. Nullam dapibus, erat suscipit + iaculis porta, turpis arcu laoreet elit, sed ultrices ligula risus eu + velit. Phasellus risus lorem, vulputate vitae, ultricies id, elementum + ut, quam. Donec augue dui, vestibulum vitae, vehicula venenatis, + hendrerit venenatis, mi. Sed at libero eu tortor consequat aliquam. + Donec odio lectus, scelerisque eget, auctor id, tincidunt ac, libero. + Duis interdum hendrerit arcu. Pellentesque habitant morbi tristique + senectus et netus et malesuada fames ac turpis egestas. Etiam + tincidunt feugiat purus. Nulla suscipit libero et dui. Vestibulum + dignissim urna a risus. + + +
+ + + Vestibulum ante + + Vestibulum ante ipsum primis in faucibus orci + + luctus + + ultirce + + luctus et ultrice + + posuere cubilia Curae; Cras purus odio, faucibus + et, euismod sollicitudin, vehicula eu, urna. Mauris tempor. Vivamus sit + amet nisi vel dolor ultricies placerat. Nulla adipiscing feugiat erat. + Pellentesque vulputate posuere pede. Ut id sem at neque commodo + + ultricie + + ultricies. Suspendisse sed enim. Nulla facilisi. Proin + ullamcorper vestibulum tellus. Donec varius scelerisque eros. + Pellentesque feugiat velit et neque. Proin urna neque, interdum sed, + auctor sed, vulputate et, nunc. In cursus nisl. Etiam pharetra, nisl + quis sagittis ultricies, sapien tellus tincidunt ante, in congue mauris + enim eu metus. Suspendisse fringilla elementum libero. Cras nonummy sem + mattis tellus. Praesent faucibus sem eu dui. Nam vel lacus vitae diam + sollicitudin tristique. Nulla facilisi. + + + Donec egestas nisl id neque. Nullam + + leo leo + + leo leo, bibendum sit amet, pellentesque sit amet, + sagittis eu, nibh. Praesent malesuada dictum nunc. In interdum imperdiet + felis. Cras rutrum leo sit amet odio. Mauris ultrices, augue sit amet + lacinia sollicitudin, lorem leo euismod elit, in pharetra mauris augue + id turpis. Vestibulum dictum sapien et sapien. Donec eleifend felis quis + leo fringilla consequat. Mauris vitae dolor pretium velit tincidunt + vehicula. Suspendisse facilisis rutrum urna. Proin viverra vulputate + magna. Vivamus massa nibh, eleifend condimentum, elementum eget, + lobortis nec, diam. Phasellus sollicitudin. Donec quis orci ornare felis + cursus porta. Nullam purus lectus, fringilla eu, feugiat vel, tristique + eu, est. + + +
+ + + Donec eleifend + + Donec eleifend, justo ac interdum rutrum, massa ligula convallis + tellus, quis elementum elit lectus eu sapien. Ut metus massa, vehicula ut, + semper ut, eleifend eu, quam. Cras quis augue. Maecenas enim ante, cursus + vestibulum, consectetuer et, dictum sit amet, dolor. Phasellus ultrices + est id est. Maecenas scelerisque nisl quis eros. Vivamus rhoncus. + Pellentesque habitant morbi tristique senectus et netus et malesuada fames + ac turpis egestas. Mauris diam turpis, faucibus non, scelerisque sit amet, + porttitor a, enim. Ut bibendum pulvinar neque. + + + Pellentesque lacinia, eros at dapibus rhoncus, lectus magna pharetra + sapien, sed convallis ligula mi a sapien. Donec tempor libero ut nibh. + Quisque et lectus eu arcu iaculis rutrum. Donec et ligula. Integer gravida + aliquam diam. Curabitur in augue non massa convallis accumsan. Mauris nisl + neque, dictum quis, eleifend nec, ornare a, nisl. Praesent id elit. Mauris + et leo at odio placerat iaculis. Morbi faucibus dictum nibh. + + + + + Pellentesque augue + + Quisque molestie dignissim urna. Donec mattis pellentesque augue. + Nullam neque diam, bibendum ut, placerat nec, pharetra ac, eros. Sed + libero risus, nonummy vitae, tincidunt a, blandit ut, tortor. Nulla quis + libero. Vivamus ac ligula. Proin dignissim, orci ut mattis sodales, lectus + ligula convallis libero, sed feugiat libero odio non massa. Sed elementum. + Nullam id enim. Sed non arcu quis leo vulputate adipiscing. Nam et orci. + Integer sed nunc. Maecenas sem turpis, pulvinar ac, volutpat non, + ultricies rhoncus, tellus. Fusce porttitor. Nullam cursus odio vel nisi + elementum elementum. Integer venenatis. Sed hendrerit, tortor a semper + ultrices, lorem sapien lacinia erat, eu suscipit risus nisl id elit. In + hac habitasse platea dictumst. + + + Nulla facilisi. Morbi imperdiet varius ante. Proin enim est, tempus + eget, laoreet eget, aliquet nec, pede. Aliquam justo risus, luctus vel, + consectetuer in, sollicitudin in, lectus. Donec eu diam et dolor dapibus + sagittis. Aliquam aliquam, neque eget imperdiet lobortis, turpis ligula + elementum pede, eget sodales purus dui nec mi. Integer vel purus. Cras + adipiscing lobortis arcu. Integer commodo. Curabitur pretium, purus a + adipiscing vestibulum, lacus justo faucibus sapien, a sagittis est urna + sit amet est. Nullam diam. Maecenas vulputate, lacus et adipiscing + ultrices, tortor urna euismod arcu, in vestibulum quam nibh nec erat. + Quisque bibendum lorem vitae diam. Nulla lobortis. Nam porttitor, nisl et + convallis mollis, metus nisl euismod nisl, sed adipiscing tortor augue ut + leo. Donec eleifend lorem quis tellus. + + +
+ + + + Duis egestas condimentum + + + + + Petri + Mäkijärvi + + + + + + Maxwell + Smart + + + + $Date: 2010/06/09 15:19:01 $ + + $Revision: 1.3 $ + + + + Maecenas at enim + + Aliquam erat volutpat, consectetuer adipiscing elit. + + Curabitur + + urna + + Consectetuer + + Curabitur urna. Maecenas eu nisi faucibus risus ornare + fringilla. Nam laoreet accumsan metus. Maecenas ac nunc non enim consequat + ultrices. Duis egestas condimentum velit. Nulla scelerisque. Nulla turpis. + Nam ante tortor, convallis sit amet, commodo at, dignissim at, dolor. + Proin sodales. Maecenas at enim. Aliquam nunc. Curabitur ullamcorper + molestie neque. Aliquam erat volutpat. Sed non dui et tellus ultrices + porttitor. + + + Curabitur rutrum lobortis orci. Vivamus a urna. Nulla feugiat + euismod massa. In odio quam, posuere at, mattis at, pretium quis, nisi. + Sed eget nibh. Vestibulum ante enim, mattis at, mollis eu, ullamcorper sit + amet, augue. Mauris quam massa, vestibulum rhoncus, bibendum eget, + adipiscing at, enim. Sed pharetra. Praesent ac nibh id massa bibendum + elementum. Sed urna nibh, pharetra in, dapibus at, tristique at, velit. + Maecenas lectus. Pellentesque aliquet pharetra lacus. Aliquam et tellus. + Aenean gravida tristique ipsum. Duis suscipit euismod dolor. Etiam + facilisis mi nec risus. Nam non purus sed nibh cursus luctus. Morbi nunc + sem, hendrerit eu, mattis sit amet, pulvinar nec, nulla. Duis lobortis + metus ut orci. Curabitur facilisis. + + + + Curabitur nulla orci + + Cum sociis natoque penatibus et magnis dis parturient montes, + nascetur ridiculus mus + + Aenean in odio et dui vestibulum eleifend. Donec aliquet + magna. + + + . Curabitur nulla orci, porta eget, tincidunt dapibus, + tincidunt sed, ligula. Nunc vel sapien. In nec diam fermentum purus + tincidunt ullamcorper: + + + Donec facilisis aliquet libero. Maecenas sem dui, scelerisque + vitae, convallis at, gravida eu, purus. Proin quis nisl. Mauris ac purus + eu dolor fringilla tempus. Aliquam elementum. In a neque. Praesent + ipsum. Maecenas elementum magna sit amet eros. Praesent non + sapien. + + + + Maecenas bibendum + + Nulla facilisi. Morbi imperdiet varius ante. Proin enim est, tempus + eget, laoreet eget, aliquet nec, pede. Aliquam justo risus, luctus vel, + consectetuer in, sollicitudin in, lectus. Donec eu diam et dolor dapibus + sagittis. Aliquam aliquam, neque eget imperdiet lobortis, turpis ligula + elementum pede, eget sodales purus dui nec mi. Integer vel purus. Cras + adipiscing lobortis arcu. Integer commodo. Curabitur pretium, purus a + adipiscing vestibulum, lacus justo faucibus sapien, a sagittis est urna + sit amet est. Nullam diam. Maecenas vulputate, lacus et adipiscing + ultrices, tortor urna euismod arcu, in vestibulum quam nibh nec erat. + Quisque bibendum lorem vitae diam. Nulla lobortis. Nam porttitor, nisl et + convallis mollis, metus nisl euismod nisl, sed adipiscing tortor augue ut + leo. Donec eleifend lorem quis tellus. + + + Mauris et erat egestas libero volutpat vestibulum. Curabitur + viverra iaculis quam. Nulla egestas dui eget odio. Nam dictum elit in + massa. Phasellus nec elit. Maecenas bibendum. Lorem ipsum dolor sit + amet, consectetuer adipiscing elit. Nullam dapibus, erat suscipit + iaculis porta, turpis arcu laoreet elit, sed ultrices ligula risus eu + velit. Phasellus risus lorem, vulputate vitae, ultricies id, elementum + ut, quam. Donec augue dui, vestibulum vitae, vehicula venenatis, + hendrerit venenatis, mi. Sed at libero eu tortor consequat aliquam. + Donec odio lectus, scelerisque eget, auctor id, tincidunt ac, libero. + Duis interdum hendrerit arcu. Pellentesque habitant morbi tristique + senectus et netus et malesuada fames ac turpis egestas. Etiam + tincidunt feugiat purus. Nulla suscipit libero et dui. Vestibulum + dignissim urna a risus. + + + + + + faucibus orci + + Vestibulum ante ipsum primis in faucibus orci + + luctus + + ultirce + + luctus et ultrice + + posuere cubilia Curae; Cras purus odio, faucibus + et, euismod sollicitudin, vehicula eu, urna. Mauris tempor. Vivamus sit + amet nisi vel dolor ultricies placerat. Nulla adipiscing feugiat erat. + Pellentesque vulputate posuere pede. Ut id sem at neque commodo + + ultricie + + ultricies. Suspendisse sed enim. Nulla facilisi. Proin + ullamcorper vestibulum tellus. Donec varius scelerisque eros. + Pellentesque feugiat velit et neque. Proin urna neque, interdum sed, + auctor sed, vulputate et, nunc. In cursus nisl. Etiam pharetra, nisl + quis sagittis ultricies, sapien tellus tincidunt ante, in congue mauris + enim eu metus. Suspendisse fringilla elementum libero. Cras nonummy sem + mattis tellus. Praesent faucibus sem eu dui. Nam vel lacus vitae diam + sollicitudin tristique. Nulla facilisi. + + + Donec egestas nisl id neque. Nullam + + leo leo + + leo leo, bibendum sit amet, pellentesque sit amet, + sagittis eu, nibh. Praesent malesuada dictum nunc. In interdum imperdiet + felis. Cras rutrum leo sit amet odio. Mauris ultrices, augue sit amet + lacinia sollicitudin, lorem leo euismod elit, in pharetra mauris augue + id turpis. Vestibulum dictum sapien et sapien. Donec eleifend felis quis + leo fringilla consequat. Mauris vitae dolor pretium velit tincidunt + vehicula. Suspendisse facilisis rutrum urna. Proin viverra vulputate + magna. Vivamus massa nibh, eleifend condimentum, elementum eget, + lobortis nec, diam. Phasellus sollicitudin. Donec quis orci ornare felis + cursus porta. Nullam purus lectus, fringilla eu, feugiat vel, tristique + eu, est. + + + + + + Maecenas scelerisque + + Donec eleifend, justo ac interdum rutrum, massa ligula convallis + tellus, quis elementum elit lectus eu sapien. Ut metus massa, vehicula ut, + semper ut, eleifend eu, quam. Cras quis augue. Maecenas enim ante, cursus + vestibulum, consectetuer et, dictum sit amet, dolor. Phasellus ultrices + est id est. Maecenas scelerisque nisl quis eros. Vivamus rhoncus. + Pellentesque habitant morbi tristique senectus et netus et malesuada fames + ac turpis egestas. Mauris diam turpis, faucibus non, scelerisque sit amet, + porttitor a, enim. Ut bibendum pulvinar neque. + + + Pellentesque lacinia, eros at dapibus rhoncus, lectus magna pharetra + sapien, sed convallis ligula mi a sapien. Donec tempor libero ut nibh. + Quisque et lectus eu arcu iaculis rutrum. Donec et ligula. Integer gravida + aliquam diam. Curabitur in augue non massa convallis accumsan. Mauris nisl + neque, dictum quis, eleifend nec, ornare a, nisl. Praesent id elit. Mauris + et leo at odio placerat iaculis. Morbi faucibus dictum nibh. + + + + + Dignissim urna + + Quisque molestie dignissim urna. Donec mattis pellentesque augue. + Nullam neque diam, bibendum ut, placerat nec, pharetra ac, eros. Sed + libero risus, nonummy vitae, tincidunt a, blandit ut, tortor. Nulla quis + libero. Vivamus ac ligula. Proin dignissim, orci ut mattis sodales, lectus + ligula convallis libero, sed feugiat libero odio non massa. Sed elementum. + Nullam id enim. Sed non arcu quis leo vulputate adipiscing. Nam et orci. + Integer sed nunc. Maecenas sem turpis, pulvinar ac, volutpat non, + ultricies rhoncus, tellus. Fusce porttitor. Nullam cursus odio vel nisi + elementum elementum. Integer venenatis. Sed hendrerit, tortor a semper + ultrices, lorem sapien lacinia erat, eu suscipit risus nisl id elit. In + hac habitasse platea dictumst. + + + Nulla facilisi. Morbi imperdiet varius ante. Proin enim est, tempus + eget, laoreet eget, aliquet nec, pede. Aliquam justo risus, luctus vel, + consectetuer in, sollicitudin in, lectus. Donec eu diam et dolor dapibus + sagittis. Aliquam aliquam, neque eget imperdiet lobortis, turpis ligula + elementum pede, eget sodales purus dui nec mi. Integer vel purus. Cras + adipiscing lobortis arcu. Integer commodo. Curabitur pretium, purus a + adipiscing vestibulum, lacus justo faucibus sapien, a sagittis est urna + sit amet est. Nullam diam. Maecenas vulputate, lacus et adipiscing + ultrices, tortor urna euismod arcu, in vestibulum quam nibh nec erat. + Quisque bibendum lorem vitae diam. Nulla lobortis. Nam porttitor, nisl et + convallis mollis, metus nisl euismod nisl, sed adipiscing tortor augue ut + leo. Donec eleifend lorem quis tellus. + + + + + +
diff --git a/plugins/relaxng/testData/highlighting/nested-composite.rng b/plugins/relaxng/testData/highlighting/nested-composite.rng new file mode 100644 index 000000000000..76962fcd5074 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/nested-composite.rng @@ -0,0 +1,16 @@ + + + + + + + + id + name + content-type + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/nested-fragment-2.xml b/plugins/relaxng/testData/highlighting/nested-fragment-2.xml new file mode 100644 index 000000000000..7426fc0b8fdc --- /dev/null +++ b/plugins/relaxng/testData/highlighting/nested-fragment-2.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + input + data + output + application/pdf + Created-by-Pages.pdf + + + + + + + + + System.out.println("id = " + attachment.getId()); return "true"; + + + + + + + + + + + + + + + + + + + + + + + INFO + Glückwunsch, Saschas Workflow! + + + + + + + + + + diff --git a/plugins/relaxng/testData/highlighting/nested-fragment.xml b/plugins/relaxng/testData/highlighting/nested-fragment.xml new file mode 100644 index 000000000000..4b48d475d55f --- /dev/null +++ b/plugins/relaxng/testData/highlighting/nested-fragment.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/optional-attribute_1.xml b/plugins/relaxng/testData/highlighting/optional-attribute_1.xml new file mode 100644 index 000000000000..23a34ce84cd0 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/optional-attribute_1.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/optional-attribute_2.xml b/plugins/relaxng/testData/highlighting/optional-attribute_2.xml new file mode 100644 index 000000000000..e9d8157b77f4 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/optional-attribute_2.xml @@ -0,0 +1,2 @@ +y="abc"> + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/optional-element_1.xml b/plugins/relaxng/testData/highlighting/optional-element_1.xml new file mode 100644 index 000000000000..9b035d4b42ae --- /dev/null +++ b/plugins/relaxng/testData/highlighting/optional-element_1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/relaxng.rng b/plugins/relaxng/testData/highlighting/relaxng.rng new file mode 100644 index 000000000000..f6d1618033c9 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/relaxng.rng @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + choice + interleave + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/relaxng/testData/highlighting/rnc/addressbook.rnc b/plugins/relaxng/testData/highlighting/rnc/addressbook.rnc new file mode 100644 index 000000000000..abce02816e0b --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/addressbook.rnc @@ -0,0 +1,10 @@ +default namespace = "urn:test:addressBook" + +element addressBook { + element card { + (attribute name { text } + | (attribute givenName { text }, + attribute familyName { text })), + attribute email { text } + }* +} diff --git a/plugins/relaxng/testData/highlighting/rnc/annotation.rnc b/plugins/relaxng/testData/highlighting/rnc/annotation.rnc new file mode 100644 index 000000000000..180459513442 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/annotation.rnc @@ -0,0 +1,9 @@ +namespace a = "http://www.example.com/annotation" + +element addressBook { + [ a:documentation [ xml:lang="en" "Information about a single address." ] ] + element card { + element name { text }, + element email { text } + }* +} \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/backward-include-def.rnc b/plugins/relaxng/testData/highlighting/rnc/backward-include-def.rnc new file mode 100644 index 000000000000..6724dc7bb7ae --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/backward-include-def.rnc @@ -0,0 +1,6 @@ +default namespace = "backward-include-def.rng" + +include "backward-include-ref.rnc" +start = element t { foo } +foo = element foo { backward } +backward = element x { empty } diff --git a/plugins/relaxng/testData/highlighting/rnc/backward-include-ref.rnc b/plugins/relaxng/testData/highlighting/rnc/backward-include-ref.rnc new file mode 100644 index 000000000000..1417891212d7 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/backward-include-ref.rnc @@ -0,0 +1,3 @@ +default namespace = "backward-include-def.rng" + +foo |= element bar { backward } diff --git a/plugins/relaxng/testData/highlighting/rnc/bad-element.xml b/plugins/relaxng/testData/highlighting/rnc/bad-element.xml new file mode 100644 index 000000000000..c6fe83fd29bb --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/bad-element.xml @@ -0,0 +1,3 @@ + + <foo /> + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/bad-parent-ref-1.rnc b/plugins/relaxng/testData/highlighting/rnc/bad-parent-ref-1.rnc new file mode 100644 index 000000000000..cc3a6416087a --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/bad-parent-ref-1.rnc @@ -0,0 +1,8 @@ +grammar { + start = foo + + foo = grammar { + x = element bar { parent outer } + outer = attribute outer.att { text } + } +} \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/create-datatypes-prefix-1.rnc b/plugins/relaxng/testData/highlighting/rnc/create-datatypes-prefix-1.rnc new file mode 100644 index 000000000000..14b82c45b174 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/create-datatypes-prefix-1.rnc @@ -0,0 +1 @@ +a = element foo { xxx:string } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/create-datatypes-prefix-1_after.rnc b/plugins/relaxng/testData/highlighting/rnc/create-datatypes-prefix-1_after.rnc new file mode 100644 index 000000000000..6453a7356ed1 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/create-datatypes-prefix-1_after.rnc @@ -0,0 +1,2 @@ +datatypes xxx = "" +a = element foo { xxx:string } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/create-definition-1.rnc b/plugins/relaxng/testData/highlighting/rnc/create-definition-1.rnc new file mode 100644 index 000000000000..06e3aac3f59c --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/create-definition-1.rnc @@ -0,0 +1,2 @@ + +start = doesntexist \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/create-definition-1_after.rnc b/plugins/relaxng/testData/highlighting/rnc/create-definition-1_after.rnc new file mode 100644 index 000000000000..b9b44ab6503f --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/create-definition-1_after.rnc @@ -0,0 +1,3 @@ + +start = doesntexist +doesntexist = \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/create-definition-2.rnc b/plugins/relaxng/testData/highlighting/rnc/create-definition-2.rnc new file mode 100644 index 000000000000..8d41409be4c7 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/create-definition-2.rnc @@ -0,0 +1,5 @@ + +foo = grammar { + start = parent unresolved +} +bar = element bar { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/create-definition-2_after.rnc b/plugins/relaxng/testData/highlighting/rnc/create-definition-2_after.rnc new file mode 100644 index 000000000000..669f6c45dc49 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/create-definition-2_after.rnc @@ -0,0 +1,6 @@ + +foo = grammar { + start = parent unresolved +} +bar = element bar { empty } +unresolved = \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/create-ns-prefix-1.rnc b/plugins/relaxng/testData/highlighting/rnc/create-ns-prefix-1.rnc new file mode 100644 index 000000000000..7dcf4e33f835 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/create-ns-prefix-1.rnc @@ -0,0 +1 @@ +a = element xxx:foo { } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/create-ns-prefix-1_after.rnc b/plugins/relaxng/testData/highlighting/rnc/create-ns-prefix-1_after.rnc new file mode 100644 index 000000000000..fef6eefe2933 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/create-ns-prefix-1_after.rnc @@ -0,0 +1,2 @@ +namespace xxx = "" +a = element xxx:foo { } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/datatype-prefix.rnc b/plugins/relaxng/testData/highlighting/rnc/datatype-prefix.rnc new file mode 100644 index 000000000000..8214bf8b825e --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/datatype-prefix.rnc @@ -0,0 +1,3 @@ +datatypes xxx = "yyy" + +element foo { xxx:string } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/docbook.rnc b/plugins/relaxng/testData/highlighting/rnc/docbook.rnc new file mode 100644 index 000000000000..3d04f22042f0 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/docbook.rnc @@ -0,0 +1,10639 @@ + +namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" +namespace ctrl = "http://nwalsh.com/xmlns/schema-control/" +default namespace db = "http://docbook.org/ns/docbook" +namespace html = "http://www.w3.org/1999/xhtml" +namespace mml = "http://www.w3.org/1998/Math/MathML" +namespace rng = "http://relaxng.org/ns/structure/1.0" +namespace s = "http://www.ascc.net/xml/schematron" +namespace svg = "http://www.w3.org/2000/svg" +namespace xlink = "http://www.w3.org/1999/xlink" +s:ns [ + prefix = "a" + uri = "http://relaxng.org/ns/compatibility/annotations/1.0" +] +s:ns [ prefix = "ctrl" uri = "http://nwalsh.com/xmlns/schema-control/" ] +s:ns [ prefix = "db" uri = "http://docbook.org/ns/docbook" ] +s:ns [ + prefix = "dbx" + uri = + "http://sourceforge.net/projects/docbook/defguide/schema/extra-markup" +] +s:ns [ prefix = "html" uri = "http://www.w3.org/1999/xhtml" ] +s:ns [ prefix = "mml" uri = "http://www.w3.org/1998/Math/MathML" ] +s:ns [ prefix = "rng" uri = "http://relaxng.org/ns/structure/1.0" ] +s:ns [ prefix = "s" uri = "http://www.ascc.net/xml/schematron" ] +s:ns [ prefix = "svg" uri = "http://www.w3.org/2000/svg" ] +s:ns [ prefix = "xlink" uri = "http://www.w3.org/1999/xlink" ] + +# DocBook V5.0CR5 + +# See http://docbook.org/ns/docbook + +# This file is part of DocBook V5.0CR5 +# +# Copyright 1992-2005 HaL Computer Systems, Inc., +# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software +# Corporation, Norman Walsh, Sun Microsystems, Inc., and the +# Organization for the Advancement of Structured Information +# Standards (OASIS). +# +# Release: $Id: docbook.rnc,v 1.1 2007/08/24 17:36:05 sweinreuter Exp $ +# +# Permission to use, copy, modify and distribute the DocBook schema +# and its accompanying documentation for any purpose and without fee +# is hereby granted in perpetuity, provided that the above copyright +# notice and this paragraph appear in all copies. The copyright +# holders make no representation about the suitability of the schema +# for any purpose. It is provided "as is" without expressed or implied +# warranty. +# +# If you modify the DocBook schema in any way, label your schema as a +# variant of DocBook. See the reference documentation +# (http://docbook.org/tdg5/en/html/ch05.html#s-notdocbook) +# for more information. +# +# Please direct all questions, bug reports, or suggestions for changes +# to the docbook@lists.oasis-open.org mailing list. For more +# information, see http://www.oasis-open.org/docbook/. +# +# ====================================================================== +start = + (db.set + | db.book + | db.divisions + | db.components + | db.navigation.components + | db.section + | db.para) + | (db.sect1 | db.sect2 | db.sect3 | db.sect4 | db.sect5) + | (db.refentry | db.refsection) + | (db.refsect1 | db.refsect2 | db.refsect3) + | db.setindex +div { + db._any.attribute = + + ## Any attribute including in any attribute in any namespace. + attribute * { text } + db._any = + + ## Any element from almost any namespace + element * - (db:* | html:*) { + (db._any.attribute | text | db._any)* + } +} +db.arch.attribute = + + ## Designates the computer or chip architecture to which the element applies + attribute arch { text } +db.audience.attribute = + + ## Designates the intended audience to which the element applies, for example, system administrators, programmers, or new users. + attribute audience { text } +db.condition.attribute = + + ## provides a standard place for application-specific effectivity + attribute condition { text } +db.conformance.attribute = + + ## Indicates standards conformance characteristics of the element + attribute conformance { text } +db.os.attribute = + + ## Indicates the operating system to which the element is applicable + attribute os { text } +db.revision.attribute = + + ## Indicates the editorial revision to which the element belongs + attribute revision { text } +db.security.attribute = + + ## Indicates something about the security level associated with the element to which it applies + attribute security { text } +db.userlevel.attribute = + + ## Indicates the level of user experience for which the element applies + attribute userlevel { text } +db.vendor.attribute = + + ## Indicates the computer vendor to which the element applies. + attribute vendor { text } +db.wordsize.attribute = + + ## Indicates the word size (width in bits) of the computer architecture to which the element applies + attribute wordsize { text } +db.effectivity.attributes = + db.arch.attribute? + & db.audience.attribute? + & db.condition.attribute? + & db.conformance.attribute? + & db.os.attribute? + & db.revision.attribute? + & db.security.attribute? + & db.userlevel.attribute? + & db.vendor.attribute? + & db.wordsize.attribute? +db.endterm.attribute = + + ## Points to the element whose content is to be used as the text of the link + attribute endterm { xsd:IDREF } +db.linkend.attribute = + + ## Points to an internal link target by identifying the value of its xml:id attribute + attribute linkend { xsd:IDREF } +db.linkends.attribute = + + ## Points to one or more internal link targets by identifying the value of their xml:id attributes + attribute linkends { xsd:IDREFS } +db.xlink.href.attribute = + + ## Identifies a link target with a URI + attribute xlink:href { xsd:anyURI } +db.xlink.type.attribute = + + ## Identifies the XLink link type + attribute xlink:type { + + ## An XLink simple link + "simple" + } +db.xlink.role.attribute = + + ## Identifies the XLink role of the link + attribute xlink:role { xsd:anyURI } +db.xlink.arcrole.attribute = + + ## Identifies the XLink arcrole of the link + attribute xlink:arcrole { xsd:anyURI } +db.xlink.title.attribute = + + ## Identifies the XLink title of the link + attribute xlink:title { text }? +db.xlink.show.enumeration = + + ## An application traversing to the ending resource should load it in a new window, frame, pane, or other relevant presentation context. + "new" + | + ## An application traversing to the ending resource should load the resource in the same window, frame, pane, or other relevant presentation context in which the starting resource was loaded. + "replace" + | + ## An application traversing to the ending resource should load its presentation in place of the presentation of the starting resource. + "embed" + | + ## The behavior of an application traversing to the ending resource is unconstrained by XLink. The application should look for other markup present in the link to determine the appropriate behavior. + "other" + | + ## The behavior of an application traversing to the ending resource is unconstrained by this specification. No other markup is present to help the application determine the appropriate behavior. + "none" +db.xlink.show.attribute = + + ## Identifies the XLink show behavior of the link + attribute xlink:show { db.xlink.show.enumeration } +db.xlink.actuate.enumeration = + + ## An application should traverse to the ending resource immediately on loading the starting resource. + "onLoad" + | + ## An application should traverse from the starting resource to the ending resource only on a post-loading event triggered for the purpose of traversal. + "onRequest" + | + ## The behavior of an application traversing to the ending resource is unconstrained by this specification. The application should look for other markup present in the link to determine the appropriate behavior. + "other" + | + ## The behavior of an application traversing to the ending resource is unconstrained by this specification. No other markup is present to help the application determine the appropriate behavior. + "none" +db.xlink.actuate.attribute = + + ## Identifies the XLink actuate behavior of the link + attribute xlink:actuate { db.xlink.actuate.enumeration } +db.href.attributes = + db.xlink.href.attribute + & db.xlink.type.attribute? + & db.xlink.role.attribute? + & db.xlink.arcrole.attribute? + & db.xlink.title.attribute? + & db.xlink.show.attribute? + & db.xlink.actuate.attribute? +db.xml.id.attribute = + + ## Identifies the unique ID value of the element + attribute xml:id { xsd:ID } +db.version.attribute = + + ## Specifies the DocBook version of the element and its descendants + attribute version { text } +db.xml.lang.attribute = + + ## Specifies the natural language of the element and its descendants + attribute xml:lang { text } +db.xml.base.attribute = + + ## Specifies the base URI of the element and its descendants + attribute xml:base { xsd:anyURI } +db.remap.attribute = + + ## Provides the name or similar semantic identifier assigned to the content in some previous markup scheme + attribute remap { text } +db.xreflabel.attribute = + + ## Provides the text that is to be generated for a cross reference to the element + attribute xreflabel { text } +db.xrefstyle.attribute = + + ## Specifies a keyword or keywords identifying additional style information + attribute xrefstyle { text } +db.revisionflag.enumeration = + + ## The element has been changed. + "changed" + | + ## The element is new (has been added to the document). + "added" + | + ## The element has been deleted. + "deleted" + | + ## Explicitly turns off revision markup for this element. + "off" +db.revisionflag.attribute = + + ## Identifies the revision status of the element + attribute revisionflag { db.revisionflag.enumeration } +db.dir.enumeration = + + ## Left-to-right text + "ltr" + | + ## Right-to-left text + "rtl" + | + ## Left-to-right override + "lro" + | + ## Right-to-left override + "rlo" +db.dir.attribute = + + ## Identifies the direction of text in an element + attribute dir { db.dir.enumeration } +db.common.base.attributes = + db.version.attribute? + & db.xml.lang.attribute? + & db.xml.base.attribute? + & db.remap.attribute? + & db.xreflabel.attribute? + & db.revisionflag.attribute? + & db.dir.attribute? + & db.effectivity.attributes +db.common.attributes = + db.xml.id.attribute? + & db.common.base.attributes + & db.annotations.attribute? +db.common.idreq.attributes = + db.xml.id.attribute + & db.common.base.attributes + & db.annotations.attribute? +db.common.linking.attributes = + (db.linkend.attribute | db.href.attributes)? +db.common.req.linking.attributes = + db.linkend.attribute | db.href.attributes +db.common.data.attributes = + + ## Specifies the format of the data + attribute format { text }?, + ( + ## Indentifies the location of the data by URI + attribute fileref { xsd:anyURI } + | + ## Identifies the location of the data by external identifier (entity name) + attribute entityref { xsd:ENTITY }) +db.verbatim.continuation.enumeration = + + ## Line numbering continues from the immediately preceding element with the same name. + "continues" + | + ## Line numbering restarts (begins at 1, usually). + "restarts" +db.verbatim.continuation.attribute = + + ## Determines whether line numbering continues from the previous element or restarts. + attribute continuation { db.verbatim.continuation.enumeration } +db.verbatim.linenumbering.enumeration = + + ## Lines are numbered. + "numbered" + | + ## Lines are not numbered. + "unnumbered" +db.verbatim.linenumbering.attribute = + + ## Determines whether lines are numbered. + attribute linenumbering { db.verbatim.linenumbering.enumeration } +db.verbatim.startinglinenumber.attribute = + + ## Specifies the initial line number. + attribute startinglinenumber { xsd:integer } +db.verbatim.language.attribute = + + ## Identifies the language (i.e. programming language) of the verbatim content. + attribute language { text } +db.verbatim.xml.space.attribute = + + ## Can be used to indicate explicitly that whitespace in the verbatim environment is preserved. Whitespace must always be preserved in verbatim environments whether this attribute is specified or not. + attribute xml:space { + + ## Whitespace must be preserved. + "preserve" + } +db.verbatim.attributes = + db.verbatim.continuation.attribute? + & db.verbatim.linenumbering.attribute? + & db.verbatim.startinglinenumber.attribute? + & db.verbatim.language.attribute? + & db.verbatim.xml.space.attribute? +db.label.attribute = + + ## Specifies an identifying string for presentation purposes + attribute label { text } +db.width.characters.attribute = + + ## Specifies the width (in characters) of the element + attribute width { xsd:nonNegativeInteger } +db.spacing.enumeration = + + ## The spacing should be "compact". + "compact" + | + ## The spacing should be "normal". + "normal" +db.spacing.attribute = + + ## Specifies (a hint about) the spacing of the content + attribute spacing { db.spacing.enumeration } +db.pgwide.enumeration = + + ## The element should be rendered in the current text flow (with the flow column width). + "0" + | + ## The element should be rendered across the full text page. + "1" +db.pgwide.attribute = + + ## Indicates if the element is rendered across the column or the page + attribute pgwide { db.pgwide.enumeration } +db.language.attribute = + + ## Identifies the language (i.e. programming language) of the content. + attribute language { text } +db.performance.enumeration = + + ## The content describes an optional step or steps. + "optional" + | + ## The content describes a required step or steps. + "required" +db.performance.attribute = + + ## Specifies if the content is required or optional. + attribute performance { db.performance.enumeration } +db.floatstyle.attribute = + + ## Specifies style information to be used when rendering the float + attribute floatstyle { text } +db.width.attribute = + + ## Specifies the width of the element + attribute width { text } +db.depth.attribute = + + ## Specifies the depth of the element + attribute depth { text } +db.contentwidth.attribute = + + ## Specifies the width of the content rectangle + attribute contentwidth { text } +db.contentdepth.attribute = + + ## Specifies the depth of the content rectangle + attribute contentdepth { text } +db.scalefit.enumeration = + + ## False (do not scale-to-fit; anamorphic scaling may occur) + "0" + | + ## True (scale-to-fit; anamorphic scaling is forbidden) + "1" +db.scale.attribute = + + ## Specifies the scaling factor + attribute scale { xsd:positiveInteger } +db.halign.enumeration = + + ## Centered horizontally + "center" + | + ## Aligned horizontally on the specified character + "char" + | + ## Fully justified (left and right margins or edges) + "justify" + | + ## Left aligned + "left" + | + ## Right aligned + "right" +db.valign.enumeration = + + ## Aligned on the bottom of the region + "bottom" + | + ## Centered vertically + "middle" + | + ## Aligned on the top of the region + "top" +db.biblio.class.enumeration = + + ## A document object identifier. + "doi" + | + ## An international standard book number. + "isbn" + | + ## An international standard technical report number (ISO 10444). + "isrn" + | + ## An international standard serial number. + "issn" + | + ## A Library of Congress reference number. + "libraryofcongress" + | + ## A publication number (an internal number or possibly organizational standard). + "pubsnumber" + | + ## A Uniform Resource Identifier + "uri" +db.biblio.class-enum.attribute = + + ## Identifies the kind of bibliographic identifier + attribute class { db.biblio.class.enumeration }? +db.biblio.class-other.attribute = + + ## Identifies the nature of the non-standard bibliographic identifier + attribute otherclass { xsd:NMTOKEN } +db.biblio.class-other.attributes = + + ## Identifies the kind of bibliographic identifier + attribute class { + + ## Indicates that the identifier is some 'other' kind. + "other" + } + & db.biblio.class-other.attribute +db.biblio.class.attribute = + db.biblio.class-enum.attribute | db.biblio.class-other.attributes +db.ubiq.inlines = + (db.inlinemediaobject + | db.remark + | db.superscript + | db.subscript + | db.link.inlines + | db.alt) + | db.annotation + | db.indexterm +db._text = (text | db.ubiq.inlines | db._phrase | db.replaceable)* +db._title = db.title? & db.titleabbrev? & db.subtitle? +db._title.req = db.title & db.titleabbrev? & db.subtitle? +db._title.only = db.title? & db.titleabbrev? +db._title.onlyreq = db.title & db.titleabbrev? +db._info = (db._title.req?, db.titleforbidden.info?) | db.info? +db._info.title.req = + (db._title.req, db.titleforbidden.info?) | db.titlereq.info +db._info.title.only = + (db._title.only, db.titleforbidden.info?) | db.titleonly.info +db._info.title.onlyreq = + (db._title.onlyreq, db.titleforbidden.info?) | db.titleonlyreq.info +db._info.title.forbidden = db.titleforbidden.info? +db.all.inlines = + text + | db.ubiq.inlines + | db.general.inlines + | db.domain.inlines + | db.extension.inlines +db.general.inlines = + db.publishing.inlines + | db.product.inlines + | db.bibliography.inlines + | db.graphic.inlines + | db.indexing.inlines + | db.link.inlines +db.domain.inlines = + (db.technical.inlines + | db.error.inlines + | db.os.inlines + | db.programming.inlines + | db.markup.inlines + | db.gui.inlines + | db.keyboard.inlines) + | db.math.inlines +db.technical.inlines = + (db.replaceable + | db.systemitem + | db.option + | db.optional + | db.package + | db.parameter + | db.property) + | db.termdef + | db.nonterminal +db.error.inlines = + db.errorcode | db.errortext | db.errorname | db.errortype +db.oo.inlines = db.ooclass | db.ooexception | db.oointerface +db.programming.inlines = + db.function + | db.parameter + | db.varname + | db.returnvalue + | db.type + | db.classname + | db.exceptionname + | db.interfacename + | db.methodname + | db.modifier + | db.initializer + | db.oo.inlines +db.product.inlines = + db.productnumber + | db.productname + | db.database + | db.application + | db.hardware + | db.trademark +db.os.inlines = + db.prompt + | db.envar + | db.filename + | db.command + | db.computeroutput + | db.userinput +db.markup.inlines = + db.tag + | db.markup + | db.token + | db.symbol + | db.literal + | db.code + | db.constant + | db.email + | db.uri +db.bibliography.inlines = + db.citation + | db.citerefentry + | db.citetitle + | db.citebiblioid + | db.author + | db.person + | db.personname + | db.org + | db.orgname + | db.editor + | db.jobtitle +db.publishing.inlines = + (db.abbrev + | db.acronym + | db.date + | db.emphasis + | db.footnote + | db.footnoteref + | db.foreignphrase + | db.phrase + | db.quote + | db.subscript + | db.superscript + | db.wordasword) + | db.glossary.inlines + | db.coref +db.graphic.inlines = db.inlinemediaobject +db.indexing.inlines = notAllowed | db.indexterm +db.gui.inlines = + db.guiicon + | db.guibutton + | db.guimenuitem + | db.guimenu + | db.guisubmenu + | db.guilabel + | db.menuchoice + | db.mousebutton +db.keyboard.inlines = + db.keycombo + | db.keycap + | db.keycode + | db.keysym + | db.shortcut + | db.accel +db.link.inlines = + (db.xref | db.link | db.olink | db.anchor) | db.biblioref +db.extension.inlines = notAllowed +db.nopara.blocks = + (db.list.blocks + | db.admonition.blocks + | db.formal.blocks + | db.informal.blocks + | db.publishing.blocks + | db.graphic.blocks + | db.technical.blocks + | db.verbatim.blocks + | db.synopsis.blocks + | db.bridgehead + | db.remark + | db.revhistory) + | db.indexterm +db.para.blocks = db.anchor | db.para | db.formalpara | db.simpara +db.all.blocks = + (db.nopara.blocks | db.para.blocks | db.extension.blocks) + | db.annotation +db.formal.blocks = (db.example | db.figure | db.table) | db.equation +db.informal.blocks = + (db.informalexample | db.informalfigure | db.informaltable) + | db.informalequation +db.publishing.blocks = + db.sidebar | db.blockquote | db.address | db.epigraph +db.graphic.blocks = db.mediaobject | db.screenshot +db.technical.blocks = + db.procedure + | db.task + | (db.productionset | db.constraintdef) + | db.msgset +db.admonition.blocks = + db.caution | db.important | db.note | db.tip | db.warning +db.list.blocks = + (db.itemizedlist + | db.orderedlist + | db.procedure + | db.simplelist + | db.variablelist + | db.segmentedlist) + | db.glosslist + | db.bibliolist + | db.calloutlist + | db.qandaset +db.verbatim.blocks = + (db.programlisting | db.screen | db.literallayout | db.synopsis) + | (db.programlistingco | db.screenco) +db.synopsis.blocks = + db.cmdsynopsis + | db.funcsynopsis + | db.classsynopsis + | db.methodsynopsis + | db.constructorsynopsis + | db.destructorsynopsis + | db.fieldsynopsis +db.extension.blocks = notAllowed +db.info.extension = db._any +db.info.elements = + (db.abstract + | db.address + | db.artpagenums + | db.author + | db.authorgroup + | db.authorinitials + | db.bibliocoverage + | db.biblioid + | db.bibliosource + | db.collab + | db.confgroup + | db.contractsponsor + | db.contractnum + | db.copyright + | db.cover + | db.date + | db.edition + | db.editor + | db.issuenum + | db.keywordset + | db.legalnotice + | db.mediaobject + | db.org + | db.orgname + | db.othercredit + | db.pagenums + | db.printhistory + | db.productname + | db.productnumber + | db.pubdate + | db.publisher + | db.publishername + | db.releaseinfo + | db.revhistory + | db.seriesvolnums + | db.subjectset + | db.volumenum + | db.info.extension) + | db.annotation + | db.extendedlink + | (db.bibliomisc | db.bibliomset | db.bibliorelation | db.biblioset) + | db.itermset +db.bibliographic.elements = + db.info.elements + | db.publishing.inlines + | db.citerefentry + | db.citetitle + | db.citebiblioid + | db.person + | db.personname + | db.subtitle + | db.title +div { + db.title.role.attribute = attribute role { text } + db.title.attlist = + db.title.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.title = + + ## The text of the title of a section of a document or of a formal block-level element + element title { db.title.attlist, db.all.inlines* } +} +div { + db.titleabbrev.role.attribute = attribute role { text } + db.titleabbrev.attlist = + db.titleabbrev.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.titleabbrev = + + ## The abbreviation of a title + element titleabbrev { db.titleabbrev.attlist, db.all.inlines* } +} +div { + db.subtitle.role.attribute = attribute role { text } + db.subtitle.attlist = + db.subtitle.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.subtitle = + + ## The subtitle of a document + element subtitle { db.subtitle.attlist, db.all.inlines* } +} +div { + db.info.role.attribute = attribute role { text } + db.info.attlist = db.info.role.attribute? & db.common.attributes + db.info = + + ## A wrapper for information about a component or other block + element info { db.info.attlist, (db._title & db.info.elements*) } +} +div { + db.titlereq.info.role.attribute = attribute role { text } + db.titlereq.info.attlist = + db.titlereq.info.role.attribute? & db.common.attributes + db.titlereq.info = + + ## A wrapper for information about a component or other block with a required title + element info { + db.titlereq.info.attlist, (db._title.req & db.info.elements*) + } +} +div { + db.titleonly.info.role.attribute = attribute role { text } + db.titleonly.info.attlist = + db.titleonly.info.role.attribute? & db.common.attributes + db.titleonly.info = + + ## A wrapper for information about a component or other block with only a title + element info { + db.titleonly.info.attlist, (db._title.only & db.info.elements*) + } +} +div { + db.titleonlyreq.info.role.attribute = attribute role { text } + db.titleonlyreq.info.attlist = + db.titleonlyreq.info.role.attribute? & db.common.attributes + db.titleonlyreq.info = + + ## A wrapper for information about a component or other block with only a required title + element info { + db.titleonlyreq.info.attlist, + (db._title.onlyreq & db.info.elements*) + } +} +div { + db.titleforbidden.info.role.attribute = attribute role { text } + db.titleforbidden.info.attlist = + db.titleforbidden.info.role.attribute? & db.common.attributes + db.titleforbidden.info = + + ## A wrapper for information about a component or other block without a title + element info { db.titleforbidden.info.attlist, db.info.elements* } +} +div { + db.subjectset.role.attribute = attribute role { text } + db.subjectset.scheme.attribute = + + ## Identifies the controlled vocabulary used by this set's terms + attribute scheme { xsd:NMTOKEN } + db.subjectset.attlist = + db.subjectset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.subjectset.scheme.attribute? + db.subjectset = + + ## A set of terms describing the subject matter of a document + element subjectset { db.subjectset.attlist, db.subject+ } +} +div { + db.subject.role.attribute = attribute role { text } + db.subject.weight.attribute = + + ## Specifies a ranking for this subject relative to other subjects in the same set + attribute weight { text } + db.subject.attlist = + db.subject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.subject.weight.attribute? + db.subject = + + ## One of a group of terms describing the subject matter of a document + element subject { db.subject.attlist, db.subjectterm+ } +} +div { + db.subjectterm.role.attribute = attribute role { text } + db.subjectterm.attlist = + db.subjectterm.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.subjectterm = + + ## A term in a group of terms describing the subject matter of a document + element subjectterm { db.subjectterm.attlist, text } +} +div { + db.keywordset.role.attribute = attribute role { text } + db.keywordset.attlist = + db.keywordset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.keywordset = + + ## A set of keywords describing the content of a document + element keywordset { db.keywordset.attlist, db.keyword+ } +} +div { + db.keyword.role.attribute = attribute role { text } + db.keyword.attlist = + db.keyword.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.keyword = + + ## One of a set of keywords describing the content of a document + element keyword { db.keyword.attlist, text } +} +db.table.choice = notAllowed | db.cals.table | db.html.table +db.informaltable.choice = + notAllowed | db.cals.informaltable | db.html.informaltable +db.table = db.table.choice +db.informaltable = db.informaltable.choice +div { + db.procedure.role.attribute = attribute role { text } + db.procedure.attlist = + db.procedure.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.procedure.info = db._info.title.only + db.procedure = + + ## A list of operations to be performed in a well-defined sequence + element procedure { + db.procedure.attlist, db.procedure.info, db.all.blocks*, db.step+ + } +} +div { + db.step.role.attribute = attribute role { text } + db.step.attlist = + db.step.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.performance.attribute? + db.step.info = db._info.title.only + # + # This content model is blocks*, step|stepalternatives, blocks* but + # expressed this way it avoids UPA issues in XSD and DTD versions + db.step = + + ## A unit of action in a procedure + element step { + db.step.attlist, + db.step.info, + ((db.all.blocks+, + ((db.substeps | db.stepalternatives), db.all.blocks*)?) + | ((db.substeps | db.stepalternatives), db.all.blocks*)) + } +} +div { + db.stepalternatives.role.attribute = attribute role { text } + db.stepalternatives.attlist = + db.stepalternatives.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.performance.attribute? + db.stepalternatives.info = db._info.title.forbidden + db.stepalternatives = + + ## Alternative steps in a procedure + element stepalternatives { + db.stepalternatives.attlist, db.stepalternatives.info, db.step+ + } +} +div { + db.substeps.role.attribute = attribute role { text } + db.substeps.attlist = + db.substeps.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.performance.attribute? + db.substeps = + + ## A wrapper for steps that occur within steps in a procedure + element substeps { db.substeps.attlist, db.step+ } +} +div { + db.sidebar.role.attribute = attribute role { text } + db.sidebar.attlist = + db.sidebar.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.sidebar.info = db._info.title.only + db.sidebar = + + ## A portion of a document that is isolated from the main narrative flow + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:sidebar" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:sidebar)" + "sidebar must not occur in the descendants of sidebar" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element sidebar { + db.sidebar.attlist, db.sidebar.info, db.all.blocks+ + } +} +div { + db.abstract.role.attribute = attribute role { text } + db.abstract.attlist = + db.abstract.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.abstract.info = db._info.title.only + db.abstract = + + ## A summary + element abstract { + db.abstract.attlist, db.abstract.info, db.para.blocks+ + } +} +div { + db.personblurb.role.attribute = attribute role { text } + db.personblurb.attlist = + db.personblurb.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.personblurb.info = db._info.title.only + db.personblurb = + + ## A short description or note about a person + element personblurb { + db.personblurb.attlist, db.personblurb.info, db.para.blocks+ + } +} +div { + db.blockquote.role.attribute = attribute role { text } + db.blockquote.attlist = + db.blockquote.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.blockquote.info = db._info.title.only + db.blockquote = + + ## A quotation set off from the main text + element blockquote { + db.blockquote.attlist, + db.blockquote.info, + db.attribution?, + db.all.blocks+ + } +} +div { + db.attribution.role.attribute = attribute role { text } + db.attribution.attlist = + db.attribution.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.attribution = + + ## The source of a block quote or epigraph + element attribution { + db.attribution.attlist, + (db._text + | db.person + | db.personname + | db.citetitle + | db.citation)* + } +} +div { + db.bridgehead.renderas.enumeration = + + ## Render as a first-level section + "sect1" + | + ## Render as a second-level section + "sect2" + | + ## Render as a third-level section + "sect3" + | + ## Render as a fourth-level section + "sect4" + | + ## Render as a fifth-level section + "sect5" + db.bridgehead.renderas-enum.attribute = + + ## Indicates how the bridge head should be rendered + attribute renderas { db.bridgehead.renderas.enumeration }? + db.bridgehead.renderas-other.attribute = + + ## Identifies the nature of the non-standard rendering + attribute otherrenderas { xsd:NMTOKEN } + db.bridgehead.renderas-other.attributes = + + ## Indicates how the bridge head should be rendered + attribute renderas { + + ## Identifies a non-standard rendering + "other" + } + & db.bridgehead.renderas-other.attribute + db.bridgehead.renderas.attribute = + db.bridgehead.renderas-enum.attribute + | db.bridgehead.renderas-other.attributes + db.bridgehead.role.attribute = attribute role { text } + db.bridgehead.attlist = + db.bridgehead.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.bridgehead.renderas.attribute? + db.bridgehead = + + ## A free-floating heading + element bridgehead { db.bridgehead.attlist, db.all.inlines* } +} +div { + db.remark.role.attribute = attribute role { text } + db.remark.attlist = + db.remark.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.remark = + + ## A remark (or comment) intended for presentation in a draft manuscript + element remark { db.remark.attlist, db._text } +} +div { + db.epigraph.role.attribute = attribute role { text } + db.epigraph.attlist = + db.epigraph.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.epigraph.info = db._info.title.forbidden + db.epigraph = + + ## A short inscription at the beginning of a document or component + element epigraph { + db.epigraph.attlist, + db.epigraph.info, + db.attribution?, + (db.para.blocks | db.literallayout)+ + } +} +div { + db.footnote.role.attribute = attribute role { text } + db.footnote.label.attribute = + + ## Identifies the desired footnote mark + attribute label { xsd:NMTOKEN } + db.footnote.attlist = + db.footnote.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.footnote.label.attribute? + db.footnote = + + ## A footnote + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:footnote)" + "footnote must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:table)" + "table must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:indexterm)" + "indexterm must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:sidebar)" + "sidebar must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:task)" + "task must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:epigraph)" + "epigraph must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element footnote { db.footnote.attlist, db.all.blocks+ } +} +div { + db.formalpara.role.attribute = attribute role { text } + db.formalpara.attlist = + db.formalpara.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.formalpara.info = db._info.title.onlyreq + db.formalpara = + + ## A paragraph with a title + element formalpara { + db.formalpara.attlist, + db.formalpara.info, + db.indexing.inlines*, + db.para + } +} +div { + db.para.role.attribute = attribute role { text } + db.para.attlist = + db.para.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.para.info = db._info.title.forbidden + db.para = + + ## A paragraph + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:para" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element para { + db.para.attlist, + db.para.info, + (db.all.inlines | db.nopara.blocks)* + } +} +div { + db.simpara.role.attribute = attribute role { text } + db.simpara.attlist = + db.simpara.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.simpara.info = db._info.title.forbidden + db.simpara = + + ## A paragraph that contains only text and inline markup, no block elements + element simpara { + db.simpara.attlist, db.simpara.info, db.all.inlines* + } +} +db.admonition.contentmodel = db._info.title.only, db.all.blocks+ +div { + db.caution.role.attribute = attribute role { text } + db.caution.attlist = + db.caution.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.caution = + + ## A note of caution + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caution" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of caution" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caution" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of caution" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caution" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of caution" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caution" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of caution" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caution" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of caution" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element caution { db.caution.attlist, db.admonition.contentmodel } +} +div { + db.important.role.attribute = attribute role { text } + db.important.attlist = + db.important.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.important = + + ## An admonition set off from the text + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:important" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of important" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:important" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of important" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:important" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of important" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:important" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of important" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:important" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of important" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element important { + db.important.attlist, db.admonition.contentmodel + } +} +div { + db.note.role.attribute = attribute role { text } + db.note.attlist = + db.note.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.note = + + ## A message set off from the text + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:note" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of note" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:note" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of note" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:note" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of note" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:note" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of note" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:note" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of note" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element note { db.note.attlist, db.admonition.contentmodel } +} +div { + db.tip.role.attribute = attribute role { text } + db.tip.attlist = + db.tip.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.tip = + + ## A suggestion to the user, set off from the text + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:tip" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of tip" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:tip" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of tip" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:tip" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of tip" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:tip" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of tip" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:tip" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of tip" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element tip { db.tip.attlist, db.admonition.contentmodel } +} +div { + db.warning.role.attribute = attribute role { text } + db.warning.attlist = + db.warning.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.warning = + + ## An admonition set off from the text + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:warning" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of warning" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:warning" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of warning" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:warning" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of warning" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:warning" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of warning" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:warning" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of warning" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element warning { db.warning.attlist, db.admonition.contentmodel } +} +div { + db.itemizedlist.role.attribute = attribute role { text } + db.itemizedlist.mark.attribute = + + ## Identifies the type of mark to be used on items in this list + attribute mark { xsd:NMTOKEN } + db.itemizedlist.attlist = + db.itemizedlist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.spacing.attribute? + & db.itemizedlist.mark.attribute? + db.itemizedlist.info = db._info.title.only + db.itemizedlist = + + ## A list in which each entry is marked with a bullet or other dingbat + element itemizedlist { + db.itemizedlist.attlist, + db.itemizedlist.info, + db.all.blocks*, + db.listitem+ + } +} +div { + db.orderedlist.role.attribute = attribute role { text } + db.orderedlist.continuation.enumeration = + + ## Specifies that numbering should begin where the preceding list left off + "continues" + | + ## Specifies that numbering should begin again at 1 + "restarts" + db.orderedlist.continuation.attribute = + + ## Indicates how list numbering should begin relative to the immediately preceding list + attribute continuation { db.orderedlist.continuation.enumeration } + db.orderedlist.startingnumber.attribute = + + ## Specifies the initial line number. + attribute startingnumber { xsd:integer } + db.orderedlist.inheritnum.enumeration = + + ## Specifies that numbering should ignore list nesting + "ignore" + | + ## Specifies that numbering should inherit from outer-level lists + "inherit" + db.orderedlist.inheritnum.attribute = + + ## Indicates whether or not item numbering should be influenced by list nesting + attribute inheritnum { db.orderedlist.inheritnum.enumeration } + db.orderedlist.numeration.enumeration = + + ## Specifies Arabic numeration (1, 2, 3, …) + "arabic" + | + ## Specifies upper-case alphabetic numeration (A, B, C, …) + "upperalpha" + | + ## Specifies lower-case alphabetic numeration (a, b, c, …) + "loweralpha" + | + ## Specifies upper-case Roman numeration (I, II, III, …) + "upperroman" + | + ## Specifies lower-case Roman numeration (i, ii, iii …) + "lowerroman" + db.orderedlist.numeration.attribute = + + ## Indicates the desired numeration + attribute numeration { db.orderedlist.numeration.enumeration } + db.orderedlist.attlist = + db.orderedlist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.spacing.attribute? + & (db.orderedlist.continuation.attribute + | db.orderedlist.startingnumber.attribute)? + & db.orderedlist.inheritnum.attribute? + & db.orderedlist.numeration.attribute? + db.orderedlist.info = db._info.title.only + db.orderedlist = + + ## A list in which each entry is marked with a sequentially incremented label + element orderedlist { + db.orderedlist.attlist, + db.orderedlist.info, + db.all.blocks*, + db.listitem+ + } +} +div { + db.listitem.role.attribute = attribute role { text } + db.listitem.override.attribute = + + ## Specifies the keyword for the type of mark that should be used on this + ## item, instead of the mark that would be used by default + attribute override { xsd:NMTOKEN } + db.listitem.attlist = + db.listitem.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.listitem.override.attribute? + db.listitem = + + ## A wrapper for the elements of a list item + element listitem { db.listitem.attlist, db.all.blocks+ } +} +div { + db.segmentedlist.role.attribute = attribute role { text } + db.segmentedlist.attlist = + db.segmentedlist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.segmentedlist.info = db._info.title.only + db.segmentedlist = + + ## A segmented list, a list of sets of elements + element segmentedlist { + db.segmentedlist.attlist, + db.segmentedlist.info, + db.segtitle+, + db.seglistitem+ + } +} +div { + db.segtitle.role.attribute = attribute role { text } + db.segtitle.attlist = + db.segtitle.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.segtitle = + + ## The title of an element of a list item in a segmented list + element segtitle { db.segtitle.attlist, db.all.inlines* } +} +div { + db.seglistitem.role.attribute = attribute role { text } + db.seglistitem.attlist = + db.seglistitem.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.seglistitem = + + ## A list item in a segmented list + [ + s:pattern [ + name = "Cardinality of segments and titles" + "\x{a}" ~ + " " + s:rule [ + context = "db:seglistitem" + "\x{a}" ~ + " " + s:assert [ + test = "count(db:seg) = count(../db:segtitle)" + "The number of seg elements must be the same as the number of segtitle elements in the parent segmentedlist" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element seglistitem { db.seglistitem.attlist, db.seg+ } +} +div { + db.seg.role.attribute = attribute role { text } + db.seg.attlist = + db.seg.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.seg = + + ## An element of a list item in a segmented list + element seg { db.seg.attlist, db.all.inlines* } +} +div { + db.simplelist.role.attribute = attribute role { text } + db.simplelist.type.enumeration = + + ## A tabular presentation in row-major order. + "horiz" + | + ## A tabular presentation in column-major order. + "vert" + | + ## An inline presentation, usually a comma-delimited list. + "inline" + db.simplelist.type.attribute = + + ## Specifies the type of list presentation. + [ a:defaultValue = "vert" ] + attribute type { db.simplelist.type.enumeration } + db.simplelist.columns.attribute = + + ## Specifies the number of columns for horizontal or vertical presentation + attribute columns { xsd:integer } + db.simplelist.attlist = + db.simplelist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.simplelist.type.attribute? + & db.simplelist.columns.attribute? + db.simplelist = + + ## An undecorated list of single words or short phrases + element simplelist { db.simplelist.attlist, db.member+ } +} +div { + db.member.role.attribute = attribute role { text } + db.member.attlist = + db.member.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.member = + + ## An element of a simple list + element member { db.member.attlist, db.all.inlines* } +} +div { + db.variablelist.role.attribute = attribute role { text } + db.variablelist.termlength.attribute = + + ## Indicates a length beyond which the presentation system may consider a term too long and select an alternate presentation for that term, item, or list + attribute termlength { text } + db.variablelist.attlist = + db.variablelist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.spacing.attribute? + & db.variablelist.termlength.attribute? + db.variablelist.info = db._info.title.only + db.variablelist = + + ## A list in which each entry is composed of a set of one or more terms and an associated description + element variablelist { + db.variablelist.attlist, + db.variablelist.info, + db.all.blocks*, + db.varlistentry+ + } +} +div { + db.varlistentry.role.attribute = attribute role { text } + db.varlistentry.attlist = + db.varlistentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.varlistentry = + + ## A wrapper for a set of terms and the associated description in a variable list + element varlistentry { + db.varlistentry.attlist, db.term+, db.listitem + } +} +div { + db.term.role.attribute = attribute role { text } + db.term.attlist = + db.term.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.term = + + ## The word or phrase being defined or described in a variable list + element term { db.term.attlist, db.all.inlines* } +} +div { + db.example.role.attribute = attribute role { text } + db.example.label.attribute = db.label.attribute + db.example.width.attribute = db.width.characters.attribute + db.example.pgwide.attribute = db.pgwide.attribute + db.example.floatstyle.attribute = db.floatstyle.attribute + db.example.attlist = + db.example.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.example.label.attribute? + & db.example.floatstyle.attribute? + & (db.example.width.attribute | db.example.pgwide.attribute)? + db.example.info = db._info.title.onlyreq + db.example = + + ## A formal example, with a title + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:table)" + "table must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element example { + db.example.attlist, db.example.info, db.all.blocks+, db.caption? + } +} +div { + db.informalexample.role.attribute = attribute role { text } + db.informalexample.width.attribute = db.width.characters.attribute + db.informalexample.floatstyle.attribute = db.floatstyle.attribute + db.informalexample.attlist = + db.informalexample.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.informalexample.floatstyle.attribute? + & db.informalexample.width.attribute? + db.informalexample.info = db._info.title.forbidden + db.informalexample = + + ## A displayed example without a title + element informalexample { + db.informalexample.attlist, + db.informalexample.info, + db.all.blocks+, + db.caption? + } +} +db.verbatim.inlines = (db.all.inlines | db.lineannotation) | db.co +db.verbatim.contentmodel = + db._info.title.forbidden, (db.textobject | db.verbatim.inlines*) +div { + db.programlisting.role.attribute = attribute role { text } + db.programlisting.width.attribute = db.width.characters.attribute + db.programlisting.attlist = + db.programlisting.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + & db.programlisting.width.attribute? + db.programlisting = + + ## A literal listing of all or part of a program + element programlisting { + db.programlisting.attlist, db.verbatim.contentmodel + } +} +div { + db.literallayout.role.attribute = attribute role { text } + db.literallayout.class.enumeration = + + ## The literal layout should be formatted with a monospaced font + "monospaced" + | + ## The literal layout should be formatted with the current font + "normal" + db.literallayout.class.attribute = + + ## Specifies the class of literal layout + attribute class { db.literallayout.class.enumeration } + db.literallayout.attlist = + db.literallayout.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + & db.literallayout.class.attribute? + db.literallayout = + + ## A block of text in which line breaks and white space are to be reproduced faithfully + element literallayout { + db.literallayout.attlist, db.verbatim.contentmodel + } +} +div { + db.screen.role.attribute = attribute role { text } + db.screen.width.attribute = db.width.characters.attribute + db.screen.attlist = + db.screen.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + & db.screen.width.attribute? + db.screen = + + ## Text that a user sees or might see on a computer screen + element screen { db.screen.attlist, db.verbatim.contentmodel } +} +div { + db.screenshot.role.attribute = attribute role { text } + db.screenshot.attlist = + db.screenshot.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.screenshot.info = db._info + db.screenshot = + + ## A representation of what the user sees or might see on a computer screen + element screenshot { + db.screenshot.attlist, db.screenshot.info, db.mediaobject + } +} +div { + db.figure.role.attribute = attribute role { text } + db.figure.label.attribute = db.label.attribute + db.figure.pgwide.attribute = db.pgwide.attribute + db.figure.floatstyle.attribute = db.floatstyle.attribute + db.figure.attlist = + db.figure.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.figure.label.attribute? + & db.figure.pgwide.attribute? + & db.figure.floatstyle.attribute? + db.figure.info = db._info.title.onlyreq + db.figure = + + ## A formal figure, generally an illustration, with a title + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:table)" + "table must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element figure { + db.figure.attlist, db.figure.info, db.all.blocks+, db.caption? + } +} +div { + db.informalfigure.role.attribute = attribute role { text } + db.informalfigure.label.attribute = db.label.attribute + db.informalfigure.pgwide.attribute = db.pgwide.attribute + db.informalfigure.floatstyle.attribute = db.floatstyle.attribute + db.informalfigure.attlist = + db.informalfigure.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.informalfigure.label.attribute? + & db.informalfigure.pgwide.attribute? + & db.informalfigure.floatstyle.attribute? + db.informalfigure.info = db._info.title.forbidden + db.informalfigure = + + ## A untitled figure + element informalfigure { + db.informalfigure.attlist, + db.informalfigure.info, + db.all.blocks+, + db.caption? + } +} +db.mediaobject.content = + (db.videoobject | db.audioobject | db.imageobject | db.textobject) + | db.imageobjectco +div { + db.mediaobject.role.attribute = attribute role { text } + db.mediaobject.attlist = + db.mediaobject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.mediaobject.info = db._info.title.forbidden + db.mediaobject = + + ## A displayed media object (video, audio, image, etc.) + element mediaobject { + db.mediaobject.attlist, + db.mediaobject.info, + db.alt?, + db.mediaobject.content+, + db.caption? + } +} +div { + db.inlinemediaobject.role.attribute = attribute role { text } + db.inlinemediaobject.attlist = + db.inlinemediaobject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.inlinemediaobject.info = db._info.title.forbidden + db.inlinemediaobject = + + ## An inline media object (video, audio, image, and so on) + element inlinemediaobject { + db.inlinemediaobject.attlist, + db.inlinemediaobject.info, + db.alt?, + db.mediaobject.content+ + } +} +div { + db.videoobject.role.attribute = attribute role { text } + db.videoobject.attlist = + db.videoobject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.videoobject.info = db._info.title.forbidden + db.videoobject = + + ## A wrapper for video data and its associated meta-information + element videoobject { + db.videoobject.attlist, db.videoobject.info, db.videodata + } +} +div { + db.audioobject.role.attribute = attribute role { text } + db.audioobject.attlist = + db.audioobject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.audioobject.info = db._info.title.forbidden + db.audioobject = + + ## A wrapper for audio data and its associated meta-information + element audioobject { + db.audioobject.attlist, db.audioobject.info, db.audiodata + } +} +db.imageobject.content = + db.imagedata | db.imagedata.mathml | db.imagedata.svg +div { + db.imageobject.role.attribute = attribute role { text } + db.imageobject.attlist = + db.imageobject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.imageobject.info = db._info.title.forbidden + db.imageobject = + + ## A wrapper for image data and its associated meta-information + element imageobject { + db.imageobject.attlist, + db.imageobject.info, + db.imageobject.content + } +} +div { + db.textobject.role.attribute = attribute role { text } + db.textobject.attlist = + db.textobject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.textobject.info = db._info.title.forbidden + db.textobject = + + ## A wrapper for a text description of an object and its associated meta-information + element textobject { + db.textobject.attlist, + db.textobject.info, + (db.phrase | db.textdata | db.all.blocks+) + } +} +div { + db.videodata.role.attribute = attribute role { text } + db.videodata.align.enumeration = db.halign.enumeration + db.videodata.align.attribute = + + ## Specifies the (horizontal) alignment of the video data + attribute align { db.videodata.align.enumeration } + db.videodata.valign.enumeration = db.valign.enumeration + db.videodata.valign.attribute = + + ## Specifies the vertical alignment of the video data + attribute valign { db.videodata.valign.enumeration } + db.videodata.width.attribute = db.width.attribute + db.videodata.depth.attribute = db.depth.attribute + db.videodata.contentwidth.attribute = db.contentwidth.attribute + db.videodata.contentdepth.attribute = db.contentdepth.attribute + db.videodata.scalefit.enumeration = db.scalefit.enumeration + db.videodata.scalefit.attribute = + + ## Determines if anamorphic scaling is forbidden + attribute scalefit { db.videodata.scalefit.enumeration } + db.videodata.scale.attribute = db.scale.attribute + db.videodata.attlist = + db.videodata.role.attribute? + & db.common.attributes + & db.common.data.attributes + & db.videodata.align.attribute? + & db.videodata.valign.attribute? + & db.videodata.width.attribute? + & db.videodata.contentwidth.attribute? + & db.videodata.scalefit.attribute? + & db.videodata.scale.attribute? + & db.videodata.depth.attribute? + & db.videodata.contentdepth.attribute? + db.videodata.info = db._info.title.forbidden + db.videodata = + + ## Pointer to external video data + element videodata { db.videodata.attlist, db.videodata.info } +} +div { + db.audiodata.role.attribute = attribute role { text } + db.audiodata.attlist = + db.audiodata.role.attribute? + & db.common.attributes + & db.common.data.attributes + db.audiodata.info = db._info.title.forbidden + db.audiodata = + + ## Pointer to external audio data + element audiodata { db.audiodata.attlist, db.audiodata.info } +} +div { + db.imagedata.role.attribute = attribute role { text } + db.imagedata.align.enumeration = db.halign.enumeration + db.imagedata.align.attribute = + + ## Specifies the (horizontal) alignment of the image data + attribute align { db.imagedata.align.enumeration } + db.imagedata.valign.enumeration = db.valign.enumeration + db.imagedata.valign.attribute = + + ## Specifies the vertical alignment of the image data + attribute valign { db.imagedata.valign.enumeration } + db.imagedata.width.attribute = db.width.attribute + db.imagedata.depth.attribute = db.depth.attribute + db.imagedata.contentwidth.attribute = db.contentwidth.attribute + db.imagedata.contentdepth.attribute = db.contentdepth.attribute + db.imagedata.scalefit.enumeration = db.scalefit.enumeration + db.imagedata.scalefit.attribute = + + ## Determines if anamorphic scaling is forbidden + attribute scalefit { db.imagedata.scalefit.enumeration } + db.imagedata.scale.attribute = db.scale.attribute + db.imagedata.attlist = + db.imagedata.role.attribute? + & db.common.attributes + & db.common.data.attributes + & db.imagedata.align.attribute? + & db.imagedata.valign.attribute? + & db.imagedata.width.attribute? + & db.imagedata.contentwidth.attribute? + & db.imagedata.scalefit.attribute? + & db.imagedata.scale.attribute? + & db.imagedata.depth.attribute? + & db.imagedata.contentdepth.attribute? + db.imagedata.info = db._info.title.forbidden + db.imagedata = + + ## Pointer to external image data + element imagedata { db.imagedata.attlist, db.imagedata.info } +} +div { + db.textdata.role.attribute = attribute role { text } + db.textdata.encoding.attribute = + + ## Identifies the encoding of the text in the external file + attribute encoding { text } + db.textdata.attlist = + db.textdata.role.attribute? + & db.common.attributes + & db.common.data.attributes + & db.textdata.encoding.attribute? + db.textdata.info = db._info.title.forbidden + db.textdata = + + ## Pointer to external text data + element textdata { db.textdata.attlist, db.textdata.info } +} +div { + db.caption.role.attribute = attribute role { text } + db.caption.attlist = + db.caption.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.caption.info = db._info.title.forbidden + db.caption = + + ## A caption + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:table)" + "table must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:sidebar)" + "sidebar must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:task)" + "task must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element caption { + db.caption.attlist, db.caption.info, db.all.blocks+ + } +} +div { + db.synopsis.role.attribute = attribute role { text } + db.synopsis.label.attribute = db.label.attribute + db.synopsis.attlist = + db.synopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + & db.synopsis.label.attribute? + db.synopsis = + + ## A general-purpose element for representing the syntax of commands or functions + element synopsis { db.synopsis.attlist, db.verbatim.contentmodel } +} +div { + db.cmdsynopsis.role.attribute = attribute role { text } + db.cmdsynopsis.sepchar.attribute = + + ## Specifies the character that should separate the command and its top-level arguments + attribute sepchar { text } + db.cmdsynopsis.cmdlength.attribute = + + ## Indicates the displayed length of the command; this information may be used to intelligently indent command synopses which extend beyond one line + attribute cmdlength { text } + db.cmdsynopsis.label.attribute = db.label.attribute + db.cmdsynopsis.attlist = + db.cmdsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.cmdsynopsis.sepchar.attribute? + & db.cmdsynopsis.cmdlength.attribute? + & db.cmdsynopsis.label.attribute? + db.cmdsynopsis.info = db._info.title.forbidden + db.cmdsynopsis = + + ## A syntax summary for a software command + element cmdsynopsis { + db.cmdsynopsis.attlist, + db.cmdsynopsis.info, + (db.command | db.arg | db.group | db.sbr)+, + db.synopfragment* + } +} +db.rep.enumeration = + + ## Can not be repeated. + "norepeat" + | + ## Can be repeated. + "repeat" +db.rep.attribute = + + ## Indicates whether or not repetition is possible. + [ a:defaultValue = "norepeat" ] attribute rep { db.rep.enumeration } +db.choice.enumeration = + + ## Formatted to indicate that it is optional. + "opt" + | + ## Formatted without indication. + "plain" + | + ## Formatted to indicate that it is required. + "req" +db.choice.opt.attribute = + + ## Indicates optionality. + [ a:defaultValue = "opt" ] attribute choice { db.choice.enumeration } +db.choice.req.attribute = + + ## Indicates optionality. + [ a:defaultValue = "req" ] attribute choice { db.choice.enumeration } +div { + db.arg.role.attribute = attribute role { text } + db.arg.rep.attribute = db.rep.attribute + db.arg.choice.attribute = db.choice.opt.attribute + db.arg.attlist = + db.arg.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.arg.rep.attribute? + & db.arg.choice.attribute? + db.arg = + + ## An argument in a CmdSynopsis + element arg { + db.arg.attlist, + (db._text + | db.arg + | db.group + | db.option + | db.synopfragmentref + | db.sbr)* + } +} +div { + db.group.role.attribute = attribute role { text } + db.group.rep.attribute = db.rep.attribute + db.group.choice.attribute = db.choice.opt.attribute + db.group.attlist = + db.group.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.group.rep.attribute? + & db.group.choice.attribute? + db.group = + + ## A group of elements in a CmdSynopsis + element group { + db.group.attlist, + (db.arg + | db.group + | db.option + | db.synopfragmentref + | db.replaceable + | db.sbr)+ + } +} +div { + db.sbr.role.attribute = attribute role { text } + db.sbr.attlist = db.sbr.role.attribute? & db.common.attributes + db.sbr = + + ## An explicit line break in a command synopsis + element sbr { db.sbr.attlist, empty } +} +div { + db.synopfragment.role.attribute = attribute role { text } + db.synopfragment.attlist = + db.synopfragment.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.synopfragment = + + ## A portion of a CmdSynopsis broken out from the main body of the synopsis + element synopfragment { + db.synopfragment.attlist, (db.arg | db.group)+ + } +} +div { + db.synopfragmentref.role.attribute = attribute role { text } + db.synopfragmentref.attlist = + db.synopfragmentref.role.attribute? + & db.common.attributes + & db.linkend.attribute + db.synopfragmentref = + + ## A reference to a fragment of a command synopsis + [ + s:pattern [ + name = "Synopsis fragment type constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:synopfragmentref" + "\x{a}" ~ + " " + s:assert [ + test = + "local-name(//*[@xml:id=current()/@linkend]) = 'synopfragment' and namespace-uri(//*[@xml:id=current()/@linkend]) = 'http://docbook.org/ns/docbook'" + "@linkend on synopfragmentref must point to a synopfragment." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element synopfragmentref { db.synopfragmentref.attlist, text } +} +div { + db.funcsynopsis.role.attribute = attribute role { text } + db.funcsynopsis.attlist = + db.funcsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.language.attribute? + db.funcsynopsis.info = db._info.title.forbidden + db.funcsynopsis = + + ## The syntax summary for a function definition + element funcsynopsis { + db.funcsynopsis.attlist, + db.funcsynopsis.info, + (db.funcsynopsisinfo | db.funcprototype)+ + } +} +div { + db.funcsynopsisinfo.role.attribute = attribute role { text } + db.funcsynopsisinfo.attlist = + db.funcsynopsisinfo.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + db.funcsynopsisinfo = + + ## Information supplementing the FuncDefs of a FuncSynopsis + element funcsynopsisinfo { + db.funcsynopsisinfo.attlist, db.verbatim.contentmodel + } +} +div { + db.funcprototype.role.attribute = attribute role { text } + db.funcprototype.attlist = + db.funcprototype.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.funcprototype = + + ## The prototype of a function + element funcprototype { + db.funcprototype.attlist, + db.modifier*, + db.funcdef, + (db.void | db.varargs | (db.paramdef+, db.varargs?)), + db.modifier* + } +} +div { + db.funcdef.role.attribute = attribute role { text } + db.funcdef.attlist = + db.funcdef.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.funcdef = + + ## A function (subroutine) name and its return type + element funcdef { + db.funcdef.attlist, (db._text | db.type | db.function)* + } +} +div { + db.void.role.attribute = attribute role { text } + db.void.attlist = + db.void.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.void = + + ## An empty element in a function synopsis indicating that the function in question takes no arguments + element void { db.void.attlist, empty } +} +div { + db.varargs.role.attribute = attribute role { text } + db.varargs.attlist = + db.varargs.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.varargs = + + ## An empty element in a function synopsis indicating a variable number of arguments + element varargs { db.varargs.attlist, empty } +} +div { + db.paramdef.role.attribute = attribute role { text } + db.paramdef.choice.enumeration = + + ## Formatted to indicate that it is optional. + "opt" + | + ## Formatted to indicate that it is required. + "req" + db.paramdef.choice.attribute = + + ## Indicates optionality. + [ a:defaultValue = "opt" ] + attribute choice { db.paramdef.choice.enumeration } + db.paramdef.attlist = + db.paramdef.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.paramdef.choice.attribute? + db.paramdef = + + ## Information about a function parameter in a programming language + element paramdef { + db.paramdef.attlist, + (db._text + | db.initializer + | db.type + | db.parameter + | db.funcparams)* + } +} +div { + db.funcparams.role.attribute = attribute role { text } + db.funcparams.attlist = + db.funcparams.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.funcparams = + + ## Parameters for a function referenced through a function pointer in a synopsis + element funcparams { db.funcparams.attlist, db._text } +} +div { + db.classsynopsis.role.attribute = attribute role { text } + db.classsynopsis.class.enumeration = + + ## This is the synopsis of a class + "class" + | + ## This is the synopsis of an interface + "interface" + db.classsynopsis.class.attribute = + + ## Specifies the nature of the synopsis + attribute class { db.classsynopsis.class.enumeration } + db.classsynopsis.attlist = + db.classsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.language.attribute? + & db.classsynopsis.class.attribute? + db.classsynopsis = + + ## The syntax summary for a class definition + element classsynopsis { + db.classsynopsis.attlist, + db.oo.inlines+, + (db.classsynopsisinfo + | db.methodsynopsis + | db.constructorsynopsis + | db.destructorsynopsis + | db.fieldsynopsis)* + } +} +div { + db.classsynopsisinfo.role.attribute = attribute role { text } + db.classsynopsisinfo.attlist = + db.classsynopsisinfo.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + db.classsynopsisinfo = + + ## Information supplementing the contents of a ClassSynopsis + element classsynopsisinfo { + db.classsynopsisinfo.attlist, db.verbatim.contentmodel + } +} +div { + db.ooclass.role.attribute = attribute role { text } + db.ooclass.attlist = + db.ooclass.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.ooclass = + + ## A class in an object-oriented programming language + element ooclass { + db.ooclass.attlist, (db.package | db.modifier)*, db.classname + } +} +div { + db.oointerface.role.attribute = attribute role { text } + db.oointerface.attlist = + db.oointerface.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.oointerface = + + ## An interface in an object-oriented programming language + element oointerface { + db.oointerface.attlist, + (db.package | db.modifier)*, + db.interfacename + } +} +div { + db.ooexception.role.attribute = attribute role { text } + db.ooexception.attlist = + db.ooexception.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.ooexception = + + ## An exception in an object-oriented programming language + element ooexception { + db.ooexception.attlist, + (db.package | db.modifier)*, + db.exceptionname + } +} +db.modifier.xml.space.attribute = + + ## Can be used to indicate that whitespace in the modifier should be preserved (for multi-line annotations, for example). + attribute xml:space { + + ## Extra whitespace and line breaks must be preserved. + [ + # Ideally the definition of xml:space used on modifier would be + # different from the definition used on the verbatim elements. The + # verbatim elements forbid the use of xml:space="default" which + # wouldn't be a problem on modifier. But doing that causes the + # generated XSD schemas to be broken so I'm just reusing the existing + # definition for now. It won't be backwards incompatible to fix this + # problem in the future. + # | ## Extra whitespace and line breaks are not preserved. + # "default" + + ] + "preserve" + } +div { + db.modifier.role.attribute = attribute role { text } + db.modifier.attlist = + db.modifier.xml.space.attribute? + & db.modifier.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.modifier = + + ## Modifiers in a synopsis + element modifier { db.modifier.attlist, db._text } +} +div { + db.interfacename.role.attribute = attribute role { text } + db.interfacename.attlist = + db.interfacename.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.interfacename = + + ## The name of an interface + element interfacename { db.interfacename.attlist, db._text } +} +div { + db.exceptionname.role.attribute = attribute role { text } + db.exceptionname.attlist = + db.exceptionname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.exceptionname = + + ## The name of an exception + element exceptionname { db.exceptionname.attlist, db._text } +} +div { + db.fieldsynopsis.role.attribute = attribute role { text } + db.fieldsynopsis.attlist = + db.fieldsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.language.attribute? + db.fieldsynopsis = + + ## The name of a field in a class definition + element fieldsynopsis { + db.fieldsynopsis.attlist, + db.modifier*, + db.type?, + db.varname, + db.initializer? + } +} +div { + db.initializer.role.attribute = attribute role { text } + db.initializer.attlist = + db.initializer.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.initializer = + + ## The initializer for a FieldSynopsis + element initializer { db.initializer.attlist, db._text } +} +div { + db.constructorsynopsis.role.attribute = attribute role { text } + db.constructorsynopsis.attlist = + db.constructorsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.language.attribute? + db.constructorsynopsis = + + ## A syntax summary for a constructor + element constructorsynopsis { + db.constructorsynopsis.attlist, + db.modifier*, + db.methodname?, + (db.methodparam+ | db.void?), + db.exceptionname* + } +} +div { + db.destructorsynopsis.role.attribute = attribute role { text } + db.destructorsynopsis.attlist = + db.destructorsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.language.attribute? + db.destructorsynopsis = + + ## A syntax summary for a destructor + element destructorsynopsis { + db.destructorsynopsis.attlist, + db.modifier*, + db.methodname?, + (db.methodparam+ | db.void?), + db.exceptionname* + } +} +div { + db.methodsynopsis.role.attribute = attribute role { text } + db.methodsynopsis.attlist = + db.methodsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.language.attribute? + db.methodsynopsis = + + ## A syntax summary for a method + element methodsynopsis { + db.methodsynopsis.attlist, + db.modifier*, + (db.type | db.void)?, + db.methodname, + (db.methodparam+ | db.void), + db.exceptionname*, + db.modifier* + } +} +div { + db.methodname.role.attribute = attribute role { text } + db.methodname.attlist = + db.methodname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.methodname = + + ## The name of a method + element methodname { db.methodname.attlist, db._text } +} +div { + db.methodparam.role.attribute = attribute role { text } + db.methodparam.rep.attribute = db.rep.attribute + db.methodparam.choice.attribute = db.choice.req.attribute + db.methodparam.attlist = + db.methodparam.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.methodparam.rep.attribute? + & db.methodparam.choice.attribute? + db.methodparam = + + ## Parameters to a method + element methodparam { + db.methodparam.attlist, + db.modifier*, + db.type?, + ((db.modifier*, db.parameter, db.initializer?) | db.funcparams), + db.modifier* + } +} +div { + db.address.role.attribute = attribute role { text } + db.address.attlist = + db.address.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + db.address = + + ## A real-world address, generally a postal address + element address { + db.address.attlist, + (db._text + | db.personname + | db.pob + | db.street + | db.city + | db.state + | db.postcode + | db.country + | db.phone + | db.fax + | db.email + | db.otheraddr)* + } +} +div { + db.street.role.attribute = attribute role { text } + db.street.attlist = + db.street.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.street = + + ## A street address in an address + element street { db.street.attlist, db._text } +} +div { + db.pob.role.attribute = attribute role { text } + db.pob.attlist = + db.pob.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.pob = + + ## A post office box in an address + element pob { db.pob.attlist, db._text } +} +div { + db.postcode.role.attribute = attribute role { text } + db.postcode.attlist = + db.postcode.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.postcode = + + ## A postal code in an address + element postcode { db.postcode.attlist, db._text } +} +div { + db.city.role.attribute = attribute role { text } + db.city.attlist = + db.city.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.city = + + ## The name of a city in an address + element city { db.city.attlist, db._text } +} +div { + db.state.role.attribute = attribute role { text } + db.state.attlist = + db.state.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.state = + + ## A state or province in an address + element state { db.state.attlist, db._text } +} +div { + db.country.role.attribute = attribute role { text } + db.country.attlist = + db.country.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.country = + + ## The name of a country + element country { db.country.attlist, db._text } +} +div { + db.phone.role.attribute = attribute role { text } + db.phone.attlist = + db.phone.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.phone = + + ## A telephone number + element phone { db.phone.attlist, db._text } +} +div { + db.fax.role.attribute = attribute role { text } + db.fax.attlist = + db.fax.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.fax = + + ## A fax number + element fax { db.fax.attlist, db._text } +} +div { + db.otheraddr.role.attribute = attribute role { text } + db.otheraddr.attlist = + db.otheraddr.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.otheraddr = + + ## Uncategorized information in address + element otheraddr { db.otheraddr.attlist, db._text } +} +div { + db.affiliation.role.attribute = attribute role { text } + db.affiliation.attlist = + db.affiliation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.affiliation = + + ## The institutional affiliation of an individual + element affiliation { + db.affiliation.attlist, + db.shortaffil?, + db.jobtitle*, + (db.org? | (db.orgname?, db.orgdiv*, db.address*)) + } +} +div { + db.shortaffil.role.attribute = attribute role { text } + db.shortaffil.attlist = + db.shortaffil.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.shortaffil = + + ## A brief description of an affiliation + element shortaffil { db.shortaffil.attlist, db._text } +} +div { + db.jobtitle.role.attribute = attribute role { text } + db.jobtitle.attlist = + db.jobtitle.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.jobtitle = + + ## The title of an individual in an organization + element jobtitle { db.jobtitle.attlist, db._text } +} +div { + db.orgname.class.enumeration = + + ## A consortium + "consortium" + | + ## A corporation + "corporation" + | + ## An informal organization + "informal" + | + ## A non-profit organization + "nonprofit" + db.orgname.class-enum.attribute = + + ## Specifies the nature of the organization + attribute class { db.orgname.class.enumeration } + db.orgname.class-other.attributes = + + ## Specifies the nature of the organization + attribute class { + + ## Indicates a non-standard organization class + "other" + }, + + ## Identifies the non-standard nature of the organization + attribute otherclass { text } + db.orgname.class.attribute = + db.orgname.class-enum.attribute | db.orgname.class-other.attributes + db.orgname.role.attribute = attribute role { text } + db.orgname.attlist = + db.orgname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.orgname.class.attribute? + db.orgname = + + ## The name of an organization other than a corporation + element orgname { db.orgname.attlist, db._text } +} +div { + db.orgdiv.role.attribute = attribute role { text } + db.orgdiv.attlist = + db.orgdiv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.orgdiv = + + ## A division of an organization + element orgdiv { db.orgdiv.attlist, db.all.inlines* } +} +div { + db.artpagenums.role.attribute = attribute role { text } + db.artpagenums.attlist = + db.artpagenums.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.artpagenums = + + ## The page numbers of an article as published + element artpagenums { db.artpagenums.attlist, db._text } +} +div { + db.personname.role.attribute = attribute role { text } + db.personname.attlist = + db.personname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.personname = + + ## The personal name of an individual + element personname { + db.personname.attlist, + (db._text + | (db.honorific + | db.firstname + | db.surname + | db.lineage + | db.othername)+) + } +} +db.person.author.contentmodel = + db.personname, + (db.personblurb + | db.affiliation + | db.email + | db.address + | db.contrib)* +db.org.author.contentmodel = + db.orgname, + (db.orgdiv | db.affiliation | db.email | db.address | db.contrib)* +db.credit.contentmodel = + db.person.author.contentmodel | db.org.author.contentmodel +div { + db.author.role.attribute = attribute role { text } + db.author.attlist = + db.author.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.author = + + ## The name of an individual author + element author { db.author.attlist, db.credit.contentmodel } +} +div { + db.authorgroup.role.attribute = attribute role { text } + db.authorgroup.attlist = + db.authorgroup.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.authorgroup = + + ## Wrapper for author information when a document has multiple authors or collabarators + element authorgroup { + db.authorgroup.attlist, (db.author | db.editor | db.othercredit)+ + } +} +div { + db.collab.role.attribute = attribute role { text } + db.collab.attlist = + db.collab.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.collab = + + ## Identifies a collaborator + element collab { + db.collab.attlist, + (db.person | db.personname | db.org | db.orgname)+, + db.affiliation* + } +} +div { + db.authorinitials.role.attribute = attribute role { text } + db.authorinitials.attlist = + db.authorinitials.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.authorinitials = + + ## The initials or other short identifier for an author + element authorinitials { db.authorinitials.attlist, db._text } +} +div { + db.person.role.attribute = attribute role { text } + db.person.attlist = + db.person.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.person = + + ## A person and associated metadata + element person { + db.person.attlist, + db.personname, + (db.address | db.affiliation | db.email | db.personblurb)* + } +} +div { + db.org.role.attribute = attribute role { text } + db.org.attlist = + db.org.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.org = + + ## An organization and associated metadata + element org { + db.org.attlist, + db.orgname, + (db.address | db.affiliation | db.email | db.orgdiv)* + } +} +div { + db.confgroup.role.attribute = attribute role { text } + db.confgroup.attlist = + db.confgroup.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.confgroup = + + ## A wrapper for document meta-information about a conference + element confgroup { + db.confgroup.attlist, + (db.confdates + | db.conftitle + | db.confnum + | db.confsponsor + | db.address)* + } +} +div { + db.confdates.role.attribute = attribute role { text } + db.confdates.attlist = + db.confdates.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.confdates = + + ## The dates of a conference for which a document was written + element confdates { db.confdates.attlist, db._text } +} +div { + db.conftitle.role.attribute = attribute role { text } + db.conftitle.attlist = + db.conftitle.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.conftitle = + + ## The title of a conference for which a document was written + element conftitle { db.conftitle.attlist, db._text } +} +div { + db.confnum.role.attribute = attribute role { text } + db.confnum.attlist = + db.confnum.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.confnum = + + ## An identifier, frequently numerical, associated with a conference for which a document was written + element confnum { db.confnum.attlist, db._text } +} +div { + db.confsponsor.role.attribute = attribute role { text } + db.confsponsor.attlist = + db.confsponsor.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.confsponsor = + + ## The sponsor of a conference for which a document was written + element confsponsor { db.confsponsor.attlist, db._text } +} +div { + db.contractnum.role.attribute = attribute role { text } + db.contractnum.attlist = + db.contractnum.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.contractnum = + + ## The contract number of a document + element contractnum { db.contractnum.attlist, db._text } +} +div { + db.contractsponsor.role.attribute = attribute role { text } + db.contractsponsor.attlist = + db.contractsponsor.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.contractsponsor = + + ## The sponsor of a contract + element contractsponsor { db.contractsponsor.attlist, db._text } +} +div { + db.copyright.role.attribute = attribute role { text } + db.copyright.attlist = + db.copyright.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.copyright = + + ## Copyright information about a document + element copyright { db.copyright.attlist, db.year+, db.holder* } +} +div { + db.year.role.attribute = attribute role { text } + db.year.attlist = + db.year.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.year = + + ## The year of publication of a document + element year { db.year.attlist, db._text } +} +div { + db.holder.role.attribute = attribute role { text } + db.holder.attlist = + db.holder.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.holder = + + ## The name of the individual or organization that holds a copyright + element holder { db.holder.attlist, db._text } +} +db.cover.contentmodel = + (db.para.blocks + | db.extension.blocks + | db.list.blocks + | db.informal.blocks + | db.publishing.blocks + | db.graphic.blocks + | db.technical.blocks + | db.verbatim.blocks + | db.bridgehead + | db.synopsis.blocks + | db.remark + | db.revhistory)+ +div { + db.cover.role.attribute = attribute role { text } + db.cover.attlist = + db.cover.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.cover = + + ## Additional content for the cover of a publication + element cover { db.cover.attlist, db.cover.contentmodel } +} +db.date.contentmodel = + xsd:date | xsd:dateTime | xsd:gYearMonth | xsd:gYear | text +div { + db.date.role.attribute = attribute role { text } + db.date.attlist = + db.date.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.date = + + ## The date of publication or revision of a document + element date { db.date.attlist, db.date.contentmodel } +} +div { + db.edition.role.attribute = attribute role { text } + db.edition.attlist = + db.edition.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.edition = + + ## The name or number of an edition of a document + element edition { db.edition.attlist, db._text } +} +div { + db.editor.role.attribute = attribute role { text } + db.editor.attlist = + db.editor.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.editor = + + ## The name of the editor of a document + element editor { db.editor.attlist, db.credit.contentmodel } +} +div { + db.biblioid.role.attribute = attribute role { text } + db.biblioid.attlist = + db.biblioid.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.biblio.class.attribute + db.biblioid = + + ## An identifier for a document + element biblioid { db.biblioid.attlist, db._text } +} +div { + db.citebiblioid.role.attribute = attribute role { text } + db.citebiblioid.attlist = + db.citebiblioid.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.biblio.class.attribute + db.citebiblioid = + + ## A citation of a bibliographic identifier + element citebiblioid { db.citebiblioid.attlist, db._text } +} +div { + db.bibliosource.role.attribute = attribute role { text } + db.bibliosource.attlist = + db.bibliosource.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.biblio.class.attribute + db.bibliosource = + + ## The source of a document + element bibliosource { db.bibliosource.attlist, db._text } +} +div { + db.bibliorelation.type.enumeration = + + ## The described resource pre-existed the referenced resource, which is essentially the same intellectual content presented in another format + "hasformat" + | + ## The described resource includes the referenced resource either physically or logically + "haspart" + | + ## The described resource has a version, edition, or adaptation, namely, the referenced resource + "hasversion" + | + ## The described resource is the same intellectual content of the referenced resource, but presented in another format + "isformatof" + | + ## The described resource is a physical or logical part of the referenced resource + "ispartof" + | + ## The described resource is referenced, cited, or otherwise pointed to by the referenced resource + "isreferencedby" + | + ## The described resource is supplanted, displaced, or superceded by the referenced resource + "isreplacedby" + | + ## The described resource is required by the referenced resource, either physically or logically + "isrequiredby" + | + ## The described resource is a version, edition, or adaptation of the referenced resource; changes in version imply substantive changes in content rather than differences in format + "isversionof" + | + ## The described resource references, cites, or otherwise points to the referenced resource + "references" + | + ## The described resource supplants, displaces, or supersedes the referenced resource + "replaces" + | + ## The described resource requires the referenced resource to support its function, delivery, or coherence of content + "requires" + db.bibliorelation.type-enum.attribute = + + ## Identifies the type of relationship + attribute type { db.bibliorelation.type.enumeration }? + db.bibliorelation.type-other.attributes = + + ## Identifies the type of relationship + attribute type { + + ## The described resource has a non-standard relationship with the referenced resource + "othertype" + }?, + + ## A keyword that identififes the type of the non-standard relationship + attribute othertype { xsd:NMTOKEN } + db.bibliorelation.type.attribute = + db.bibliorelation.type-enum.attribute + | db.bibliorelation.type-other.attributes + db.bibliorelation.role.attribute = attribute role { text } + db.bibliorelation.attlist = + db.bibliorelation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.biblio.class.attribute + & db.bibliorelation.type.attribute + db.bibliorelation = + + ## The relationship of a document to another + element bibliorelation { db.bibliorelation.attlist, db._text } +} +div { + db.bibliocoverage.spacial.enumeration = + + ## The DCMI Point identifies a point in space using its geographic coordinates + "dcmipoint" + | + ## ISO 3166 Codes for the representation of names of countries + "iso3166" + | + ## The DCMI Box identifies a region of space using its geographic limits + "dcmibox" + | + ## The Getty Thesaurus of Geographic Names + "tgn" + db.bibliocoverage.spatial-enum.attribute = + + ## Specifies the type of spatial coverage + attribute spatial { db.bibliocoverage.spacial.enumeration }? + db.bibliocoverage.spatial-other.attributes = + + ## Specifies the type of spatial coverage + attribute spatial { + + ## Identifies a non-standard type of coverage + "otherspatial" + }?, + + ## A keyword that identifies the type of non-standard coverage + attribute otherspatial { xsd:NMTOKEN } + db.bibliocoverage.spatial.attribute = + db.bibliocoverage.spatial-enum.attribute + | db.bibliocoverage.spatial-other.attributes + db.bibliocoverage.temporal.enumeration = + + ## A specification of the limits of a time interval + "dcmiperiod" + | + ## W3C Encoding rules for dates and times—a profile based on ISO 8601 + "w3c-dtf" + db.bibliocoverage.temporal-enum.attribute = + + ## Specifies the type of temporal coverage + attribute temporal { db.bibliocoverage.temporal.enumeration }? + db.bibliocoverage.temporal-other.attributes = + + ## Specifies the type of temporal coverage + attribute temporal { + + ## Specifies a non-standard type of coverage + "othertemporal" + }?, + + ## A keyword that identifies the type of non-standard coverage + attribute othertemporal { xsd:NMTOKEN } + db.bibliocoverage.temporal.attribute = + db.bibliocoverage.temporal-enum.attribute + | db.bibliocoverage.temporal-other.attributes + db.bibliocoverage.coverage.attrib = + db.bibliocoverage.spatial.attribute + & db.bibliocoverage.temporal.attribute + db.bibliocoverage.role.attribute = attribute role { text } + db.bibliocoverage.attlist = + db.bibliocoverage.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.bibliocoverage.coverage.attrib + db.bibliocoverage = + + ## The spatial or temporal coverage of a document + element bibliocoverage { db.bibliocoverage.attlist, db._text } +} +div { + db.legalnotice.role.attribute = attribute role { text } + db.legalnotice.attlist = + db.legalnotice.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.legalnotice.info = db._info.title.only + db.legalnotice = + + ## A statement of legal obligations or requirements + element legalnotice { + db.legalnotice.attlist, db.legalnotice.info, db.all.blocks+ + } +} +div { + db.othercredit.class.enumeration = + + ## A copy editor + "copyeditor" + | + ## A graphic designer + "graphicdesigner" + | + ## Some other contributor + "other" + | + ## A production editor + "productioneditor" + | + ## A technical editor + "technicaleditor" + | + ## A translator + "translator" + db.othercredit.class-enum.attribute = + + ## Identifies the nature of the contributor + attribute class { db.othercredit.class.enumeration }? + db.othercredit.class-other.attribute = + + ## Identifies the nature of the non-standard contribution + attribute otherclass { xsd:NMTOKEN } + db.othercredit.class-other.attributes = + + ## Identifies the nature of the contributor + attribute class { + + ## Identifies a non-standard contribution + "other" + } + & db.othercredit.class-other.attribute + db.othercredit.class.attribute = + db.othercredit.class-enum.attribute + | db.othercredit.class-other.attributes + db.othercredit.role.attribute = attribute role { text } + db.othercredit.attlist = + db.othercredit.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.othercredit.class.attribute + db.othercredit = + + ## A person or entity, other than an author or editor, credited in a document + element othercredit { + db.othercredit.attlist, db.credit.contentmodel + } +} +div { + db.pagenums.role.attribute = attribute role { text } + db.pagenums.attlist = + db.pagenums.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.pagenums = + + ## The numbers of the pages in a book, for use in a bibliographic entry + element pagenums { db.pagenums.attlist, db._text } +} +div { + db.contrib.role.attribute = attribute role { text } + db.contrib.attlist = + db.contrib.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.contrib = + + ## A summary of the contributions made to a document by a credited source + element contrib { db.contrib.attlist, db._text } +} +div { + db.honorific.role.attribute = attribute role { text } + db.honorific.attlist = + db.honorific.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.honorific = + + ## The title of a person + element honorific { db.honorific.attlist, db._text } +} +div { + db.firstname.role.attribute = attribute role { text } + db.firstname.attlist = + db.firstname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.firstname = + + ## The first name of a person + element firstname { db.firstname.attlist, db._text } +} +div { + db.surname.role.attribute = attribute role { text } + db.surname.attlist = + db.surname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.surname = + + ## A family name; in western cultures the last name + element surname { db.surname.attlist, db._text } +} +div { + db.lineage.role.attribute = attribute role { text } + db.lineage.attlist = + db.lineage.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.lineage = + + ## The portion of a person's name indicating a relationship to ancestors + element lineage { db.lineage.attlist, db._text } +} +div { + db.othername.role.attribute = attribute role { text } + db.othername.attlist = + db.othername.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.othername = + + ## A component of a persons name that is not a first name, surname, or lineage + element othername { db.othername.attlist, db._text } +} +div { + db.printhistory.role.attribute = attribute role { text } + db.printhistory.attlist = + db.printhistory.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.printhistory = + + ## The printing history of a document + element printhistory { db.printhistory.attlist, db.para.blocks+ } +} +div { + db.productname.role.attribute = attribute role { text } + db.productname.class.enumeration = + + ## A name with a copyright + "copyright" + | + ## A name with a registered copyright + "registered" + | + ## A name of a service + "service" + | + ## A name which is trademarked + "trade" + db.productname.class.attribute = + + ## Specifies the class of product name + attribute class { db.productname.class.enumeration } + db.productname.attlist = + db.productname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.productname.class.attribute? + db.productname = + + ## The formal name of a product + element productname { db.productname.attlist, db._text } +} +div { + db.productnumber.role.attribute = attribute role { text } + db.productnumber.attlist = + db.productnumber.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.productnumber = + + ## A number assigned to a product + element productnumber { db.productnumber.attlist, db._text } +} +div { + db.pubdate.role.attribute = attribute role { text } + db.pubdate.attlist = + db.pubdate.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.pubdate = + + ## The date of publication of a document + element pubdate { db.pubdate.attlist, db.date.contentmodel } +} +div { + db.publisher.role.attribute = attribute role { text } + db.publisher.attlist = + db.publisher.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.publisher = + + ## The publisher of a document + element publisher { + db.publisher.attlist, db.publishername, db.address* + } +} +div { + db.publishername.role.attribute = attribute role { text } + db.publishername.attlist = + db.publishername.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.publishername = + + ## The name of the publisher of a document + element publishername { db.publishername.attlist, db._text } +} +div { + db.releaseinfo.role.attribute = attribute role { text } + db.releaseinfo.attlist = + db.releaseinfo.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.releaseinfo = + + ## Information about a particular release of a document + element releaseinfo { db.releaseinfo.attlist, db._text } +} +div { + db.revhistory.role.attribute = attribute role { text } + db.revhistory.attlist = + db.revhistory.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.revhistory.info = db._info.title.only + db.revhistory = + + ## A history of the revisions to a document + element revhistory { + db.revhistory.attlist, db.revhistory.info, db.revision+ + } +} +div { + db.revision.role.attribute = attribute role { text } + db.revision.attlist = + db.revision.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.revision = + + ## An entry describing a single revision in the history of the revisions to a document + element revision { + db.revision.attlist, + db.revnumber?, + db.date, + (db.authorinitials | db.author)*, + (db.revremark | db.revdescription)? + } +} +div { + db.revnumber.role.attribute = attribute role { text } + db.revnumber.attlist = + db.revnumber.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.revnumber = + + ## A document revision number + element revnumber { db.revnumber.attlist, db._text } +} +div { + db.revremark.role.attribute = attribute role { text } + db.revremark.attlist = + db.revremark.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.revremark = + + ## A description of a revision to a document + element revremark { db.revremark.attlist, db._text } +} +div { + db.revdescription.role.attribute = attribute role { text } + db.revdescription.attlist = + db.revdescription.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.revdescription = + + ## A extended description of a revision to a document + element revdescription { db.revdescription.attlist, db.all.blocks* } +} +div { + db.seriesvolnums.role.attribute = attribute role { text } + db.seriesvolnums.attlist = + db.seriesvolnums.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.seriesvolnums = + + ## Numbers of the volumes in a series of books + element seriesvolnums { db.seriesvolnums.attlist, db._text } +} +div { + db.volumenum.role.attribute = attribute role { text } + db.volumenum.attlist = + db.volumenum.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.volumenum = + + ## The volume number of a document in a set (as of books in a set or articles in a journal) + element volumenum { db.volumenum.attlist, db._text } +} +div { + db.issuenum.role.attribute = attribute role { text } + db.issuenum.attlist = + db.issuenum.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.issuenum = + + ## The number of an issue of a journal + element issuenum { db.issuenum.attlist, db._text } +} +div { + db.accel.role.attribute = attribute role { text } + db.accel.attlist = + db.accel.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.accel = + + ## A graphical user interface (GUI) keyboard shortcut + element accel { db.accel.attlist, db._text } +} +div { + db.application.class.enumeration = + + ## A hardware application + "hardware" + | + ## A software application + "software" + db.application.class.attribute = + + ## Identifies the class of application + attribute class { db.application.class.enumeration } + db.application.role.attribute = attribute role { text } + db.application.attlist = + db.application.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.application.class.attribute? + db.application = + + ## The name of a software program + element application { db.application.attlist, db._text } +} +div { + db.package.role.attribute = attribute role { text } + db.package.attlist = + db.package.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.package = + + ## A software or application package + element package { db.package.attlist, db._text } +} +div { + db.classname.role.attribute = attribute role { text } + db.classname.attlist = + db.classname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.classname = + + ## The name of a class, in the object-oriented programming sense + element classname { db.classname.attlist, db._text } +} +div { + db.command.role.attribute = attribute role { text } + db.command.attlist = + db.command.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.command = + + ## The name of an executable program or other software command + element command { db.command.attlist, db._text } +} +db.computeroutput.inlines = + (text + | db.ubiq.inlines + | db.os.inlines + | db.technical.inlines + | db.markup.inlines) + | db.co +div { + db.computeroutput.role.attribute = attribute role { text } + db.computeroutput.attlist = + db.computeroutput.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.computeroutput = + + ## Data, generally text, displayed or presented by a computer + element computeroutput { + db.computeroutput.attlist, db.computeroutput.inlines* + } +} +div { + db.database.class.enumeration = + + ## An alternate or secondary key + "altkey" + | + ## A constraint + "constraint" + | + ## A data type + "datatype" + | + ## A field + "field" + | + ## A foreign key + "foreignkey" + | + ## A group + "group" + | + ## An index + "index" + | + ## The first or primary key + "key1" + | + ## An alternate or secondary key + "key2" + | + ## A name + "name" + | + ## The primary key + "primarykey" + | + ## A (stored) procedure + "procedure" + | + ## A record + "record" + | + ## A rule + "rule" + | + ## The secondary key + "secondarykey" + | + ## A table + "table" + | + ## A user + "user" + | + ## A view + "view" + db.database.class.attribute = + + ## Identifies the class of database artifact + attribute class { db.database.class.enumeration } + db.database.role.attribute = attribute role { text } + db.database.attlist = + db.database.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.database.class.attribute? + db.database = + + ## The name of a database, or part of a database + element database { db.database.attlist, db._text } +} +div { + db.email.role.attribute = attribute role { text } + db.email.attlist = + db.email.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.email = + + ## An email address + element email { db.email.attlist, db._text } +} +div { + db.envar.role.attribute = attribute role { text } + db.envar.attlist = + db.envar.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.envar = + + ## A software environment variable + element envar { db.envar.attlist, db._text } +} +div { + db.errorcode.role.attribute = attribute role { text } + db.errorcode.attlist = + db.errorcode.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.errorcode = + + ## An error code + element errorcode { db.errorcode.attlist, db._text } +} +div { + db.errorname.role.attribute = attribute role { text } + db.errorname.attlist = + db.errorname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.errorname = + + ## An error name + element errorname { db.errorname.attlist, db._text } +} +div { + db.errortext.role.attribute = attribute role { text } + db.errortext.attlist = + db.errortext.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.errortext = + + ## An error message. + element errortext { db.errortext.attlist, db._text } +} +div { + db.errortype.role.attribute = attribute role { text } + db.errortype.attlist = + db.errortype.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.errortype = + + ## The classification of an error message + element errortype { db.errortype.attlist, db._text } +} +div { + db.filename.class.enumeration = + + ## A device + "devicefile" + | + ## A directory + "directory" + | + ## A filename extension + "extension" + | + ## A header file (as for a programming language) + "headerfile" + | + ## A library file + "libraryfile" + | + ## A partition (as of a hard disk) + "partition" + | + ## A symbolic link + "symlink" + db.filename.class.attribute = + + ## Identifies the class of filename + attribute class { db.filename.class.enumeration } + db.filename.path.attribute = + + ## Specifies the path of the filename + attribute path { text } + db.filename.role.attribute = attribute role { text } + db.filename.attlist = + db.filename.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.filename.path.attribute? + & db.filename.class.attribute? + db.filename = + + ## The name of a file + element filename { db.filename.attlist, db._text } +} +div { + db.function.role.attribute = attribute role { text } + db.function.attlist = + db.function.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.function = + + ## The name of a function or subroutine, as in a programming language + element function { db.function.attlist, db._text } +} +div { + db.guibutton.role.attribute = attribute role { text } + db.guibutton.attlist = + db.guibutton.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.guibutton = + + ## The text on a button in a GUI + element guibutton { + db.guibutton.attlist, + (db._text | db.accel | db.superscript | db.subscript)* + } +} +div { + db.guiicon.role.attribute = attribute role { text } + db.guiicon.attlist = + db.guiicon.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.guiicon = + + ## Graphic and/or text appearing as a icon in a GUI + element guiicon { + db.guiicon.attlist, + (db._text | db.accel | db.superscript | db.subscript)* + } +} +div { + db.guilabel.role.attribute = attribute role { text } + db.guilabel.attlist = + db.guilabel.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.guilabel = + + ## The text of a label in a GUI + element guilabel { + db.guilabel.attlist, + (db._text | db.accel | db.superscript | db.subscript)* + } +} +div { + db.guimenu.role.attribute = attribute role { text } + db.guimenu.attlist = + db.guimenu.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.guimenu = + + ## The name of a menu in a GUI + element guimenu { + db.guimenu.attlist, + (db._text | db.accel | db.superscript | db.subscript)* + } +} +div { + db.guimenuitem.role.attribute = attribute role { text } + db.guimenuitem.attlist = + db.guimenuitem.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.guimenuitem = + + ## The name of a terminal menu item in a GUI + element guimenuitem { + db.guimenuitem.attlist, + (db._text | db.accel | db.superscript | db.subscript)* + } +} +div { + db.guisubmenu.role.attribute = attribute role { text } + db.guisubmenu.attlist = + db.guisubmenu.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.guisubmenu = + + ## The name of a submenu in a GUI + element guisubmenu { + db.guisubmenu.attlist, + (db._text | db.accel | db.superscript | db.subscript)* + } +} +div { + db.hardware.role.attribute = attribute role { text } + db.hardware.attlist = + db.hardware.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.hardware = + + ## A physical part of a computer system + element hardware { db.hardware.attlist, db._text } +} +div { + db.keycap.function.enumeration = + + ## The "Alt" key + "alt" + | + ## The "Backspace" key + "backspace" + | + ## The "Command" key + "command" + | + ## The "Control" key + "control" + | + ## The "Delete" key + "delete" + | + ## The down arrow + "down" + | + ## The "End" key + "end" + | + ## The "Enter" or "Return" key + "enter" + | + ## The "Escape" key + "escape" + | + ## The "Home" key + "home" + | + ## The "Insert" key + "insert" + | + ## The left arrow + "left" + | + ## The "Meta" key + "meta" + | + ## The "Option" key + "option" + | + ## The page down key + "pagedown" + | + ## The page up key + "pageup" + | + ## The right arrow + "right" + | + ## The "Shift" key + "shift" + | + ## The spacebar + "space" + | + ## The "Tab" key + "tab" + | + ## The up arrow + "up" + db.keycap.function-enum.attribute = + + ## Identifies the function key + attribute function { db.keycap.function.enumeration }? + db.keycap.function-other.attributes = + + ## Identifies the function key + attribute function { + + ## Indicates a non-standard function key + "other" + }?, + + ## Specifies a keyword that identifies the non-standard key + attribute otherfunction { text } + db.keycap.function.attrib = + db.keycap.function-enum.attribute + | db.keycap.function-other.attributes + db.keycap.role.attribute = attribute role { text } + db.keycap.attlist = + db.keycap.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.keycap.function.attrib + db.keycap = + + ## The text printed on a key on a keyboard + element keycap { db.keycap.attlist, db._text } +} +div { + db.keycode.role.attribute = attribute role { text } + db.keycode.attlist = + db.keycode.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.keycode = + + ## The internal, frequently numeric, identifier for a key on a keyboard + element keycode { db.keycode.attlist, db._text } +} +div { + db.keycombo.action.enumeration = + + ## A (single) mouse click. + "click" + | + ## A double mouse click. + "double-click" + | + ## A mouse or key press. + "press" + | + ## Sequential clicks or presses. + "seq" + | + ## Simultaneous clicks or presses. + "simul" + db.keycombo.action-enum.attribute = + + ## Identifies the nature of the action taken. If keycombo + ## contains more than one element, simul + ## is the default, otherwise there is no default. + attribute action { db.keycombo.action.enumeration }? + db.keycombo.action-other.attributes = + + ## Identifies the nature of the action taken + attribute action { + + ## Indicates a non-standard action + "other" + }?, + + ## Identifies the non-standard action in some unspecified way. + attribute otheraction { text } + db.keycombo.action.attrib = + db.keycombo.action-enum.attribute + | db.keycombo.action-other.attributes + db.keycombo.role.attribute = attribute role { text } + db.keycombo.attlist = + db.keycombo.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.keycombo.action.attrib + db.keycombo = + + ## A combination of input actions + element keycombo { + db.keycombo.attlist, + (db.keycap | db.keycombo | db.keysym | db.mousebutton)+ + } +} +div { + db.keysym.role.attribute = attribute role { text } + db.keysym.attlist = + db.keysym.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.keysym = + + ## The symbolic name of a key on a keyboard + element keysym { db.keysym.attlist, db._text } +} +div { + db.lineannotation.role.attribute = attribute role { text } + db.lineannotation.attlist = + db.lineannotation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.lineannotation = + + ## A comment on a line in a verbatim listing + element lineannotation { db.lineannotation.attlist, db._text } +} +div { + db.literal.role.attribute = attribute role { text } + db.literal.attlist = + db.literal.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.literal = + + ## Inline text that is some literal value + element literal { db.literal.attlist, db._text } +} +div { + code.language.attribute = + + ## Identifies the (computer) language of the code fragment + attribute language { text } + db.code.role.attribute = attribute role { text } + db.code.attlist = + db.code.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & code.language.attribute? + db.code = + + ## An inline code fragment + element code { + db.code.attlist, (db.programming.inlines | db._text)* + } +} +div { + db.constant.class.attribute = + + ## Identifies the class of constant + attribute class { + + ## The value is a limit of some kind + "limit" + } + db.constant.role.attribute = attribute role { text } + db.constant.attlist = + db.constant.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.constant.class.attribute? + db.constant = + + ## A programming or system constant + element constant { db.constant.attlist, db._text } +} +div { + db.varname.role.attribute = attribute role { text } + db.varname.attlist = + db.varname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.varname = + + ## The name of a variable + element varname { db.varname.attlist, db._text } +} +div { + db.markup.role.attribute = attribute role { text } + db.markup.attlist = + db.markup.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.markup = + + ## A string of formatting markup in text that is to be represented literally + element markup { db.markup.attlist, db._text } +} +div { + db.menuchoice.role.attribute = attribute role { text } + db.menuchoice.attlist = + db.menuchoice.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.menuchoice = + + ## A selection or series of selections from a menu + element menuchoice { + db.menuchoice.attlist, + db.shortcut?, + (db.guibutton + | db.guiicon + | db.guilabel + | db.guimenu + | db.guimenuitem + | db.guisubmenu)+ + } +} +div { + db.shortcut.action.attrib = db.keycombo.action.attrib + db.shortcut.role.attribute = attribute role { text } + db.shortcut.attlist = + db.shortcut.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.shortcut.action.attrib + db.shortcut = + + ## A key combination for an action that is also accessible through a menu + element shortcut { + db.shortcut.attlist, + (db.keycap | db.keycombo | db.keysym | db.mousebutton)+ + } +} +div { + db.mousebutton.role.attribute = attribute role { text } + db.mousebutton.attlist = + db.mousebutton.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.mousebutton = + + ## The conventional name of a mouse button + element mousebutton { db.mousebutton.attlist, db._text } +} +div { + db.option.role.attribute = attribute role { text } + db.option.attlist = + db.option.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.option = + + ## An option for a software command + element option { db.option.attlist, db._text } +} +div { + db.optional.role.attribute = attribute role { text } + db.optional.attlist = + db.optional.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.optional = + + ## Optional information + element optional { db.optional.attlist, db._text } +} +div { + db.property.role.attribute = attribute role { text } + db.property.attlist = + db.property.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.property = + + ## A unit of data associated with some part of a computer system + element property { db.property.attlist, db._text } +} +div { + db.parameter.class.enumeration = + + ## A command + "command" + | + ## A function + "function" + | + ## An option + "option" + db.parameter.class.attribute = + + ## Identifies the class of parameter + attribute class { db.parameter.class.enumeration } + db.parameter.role.attribute = attribute role { text } + db.parameter.attlist = + db.parameter.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.parameter.class.attribute? + db.parameter = + + ## A value or a symbolic reference to a value + element parameter { db.parameter.attlist, db._text } +} +db.prompt.inlines = db._text | db.co +div { + db.prompt.role.attribute = attribute role { text } + db.prompt.attlist = + db.prompt.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.prompt = + + ## A character or string indicating the start of an input field in a computer display + element prompt { db.prompt.attlist, db.prompt.inlines* } +} +db.replaceable.inlines = db._text | db.co +div { + db.replaceable.class.enumeration = + + ## A command + "command" + | + ## A function + "function" + | + ## An option + "option" + | + ## A parameter + "parameter" + db.replaceable.class.attribute = + + ## Identifies the nature of the replaceable text + attribute class { db.replaceable.class.enumeration } + db.replaceable.role.attribute = attribute role { text } + db.replaceable.attlist = + db.replaceable.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.replaceable.class.attribute? + db.replaceable = + + ## Content that may or must be replaced by the user + element replaceable { + db.replaceable.attlist, db.replaceable.inlines* + } +} +div { + db.returnvalue.role.attribute = attribute role { text } + db.returnvalue.attlist = + db.returnvalue.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.returnvalue = + + ## The value returned by a function + element returnvalue { db.returnvalue.attlist, db._text } +} +div { + db.tag.role.attribute = attribute role { text } + db.tag.class.enumeration = + + ## An attribute + "attribute" + | + ## An attribute value + "attvalue" + | + ## An element + "element" + | + ## An empty element tag + "emptytag" + | + ## An end tag + "endtag" + | + ## A general entity + "genentity" + | + ## The local name part of a qualified name + "localname" + | + ## A namespace + "namespace" + | + ## A numeric character reference + "numcharref" + | + ## A parameter entity + "paramentity" + | + ## A processing instruction + "pi" + | + ## The prefix part of a qualified name + "prefix" + | + ## An SGML comment + "comment" + | + ## A start tag + "starttag" + | + ## An XML processing instruction + "xmlpi" + db.tag.class.attribute = + + ## Identifies the nature of the tag content + attribute class { db.tag.class.enumeration } + db.tag.namespace.attribute = + + ## Identifies the namespace of the tag content + attribute namespace { xsd:anyURI } + db.tag.attlist = + db.tag.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.tag.class.attribute? + & db.tag.namespace.attribute? + db.tag = + + ## A component of XML (or SGML) markup + element tag { db.tag.attlist, db._text } +} +div { + db.symbol.class.attribute = + + ## Identifies the class of symbol + attribute class { + + ## The value is a limit of some kind + "limit" + } + db.symbol.role.attribute = attribute role { text } + db.symbol.attlist = + db.symbol.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.symbol.class.attribute? + db.symbol = + + ## A name that is replaced by a value before processing + element symbol { db.symbol.attlist, db._text } +} +db.systemitem.inlines = db._text | db.co +div { + db.systemitem.class.enumeration = + + ## A daemon or other system process (syslogd) + "daemon" + | + ## A domain name (example.com) + "domainname" + | + ## An ethernet address (00:05:4E:49:FD:8E) + "etheraddress" + | + ## An event of some sort (SIGHUP) + "event" + | + ## An event handler of some sort (hangup) + "eventhandler" + | + ## A filesystem (ext3) + "filesystem" + | + ## A fully qualified domain name (my.example.com) + "fqdomainname" + | + ## A group name (wheel) + "groupname" + | + ## An IP address (127.0.0.1) + "ipaddress" + | + ## A library (libncurses) + "library" + | + ## A macro + "macro" + | + ## A netmask (255.255.255.192) + "netmask" + | + ## A newsgroup (comp.text.xml) + "newsgroup" + | + ## An operating system name (Hurd) + "osname" + | + ## A process (gnome-cups-icon) + "process" + | + ## A protocol (ftp) + "protocol" + | + ## A resource + "resource" + | + ## A server (mail.example.com) + "server" + | + ## A service (ppp) + "service" + | + ## A system name (hephaistos) + "systemname" + | + ## A user name (ndw) + "username" + db.systemitem.class.attribute = + + ## Identifies the nature of the system item + attribute class { db.systemitem.class.enumeration } + db.systemitem.role.attribute = attribute role { text } + db.systemitem.attlist = + db.systemitem.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.systemitem.class.attribute? + db.systemitem = + + ## A system-related item or term + element systemitem { db.systemitem.attlist, db.systemitem.inlines* } +} +div { + db.uri.type.attribute = + + ## Identifies the type of URI specified + attribute type { text }? + db.uri.role.attribute = attribute role { text } + db.uri.attlist = + db.uri.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.uri.type.attribute + db.uri = + + ## A Uniform Resource Identifier + element uri { db.uri.attlist, db._text } +} +div { + db.token.role.attribute = attribute role { text } + db.token.attlist = + db.token.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.token = + + ## A unit of information + element token { db.token.attlist, db._text } +} +div { + db.type.role.attribute = attribute role { text } + db.type.attlist = + db.type.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.type = + + ## The classification of a value + element type { db.type.attlist, db._text } +} +db.userinput.inlines = + (text + | db.ubiq.inlines + | db.os.inlines + | db.technical.inlines + | db.markup.inlines) + | db.co +div { + db.userinput.role.attribute = attribute role { text } + db.userinput.attlist = + db.userinput.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.userinput = + + ## Data entered by the user + element userinput { db.userinput.attlist, db.userinput.inlines* } +} +div { + db.abbrev.role.attribute = attribute role { text } + db.abbrev.attlist = + db.abbrev.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.abbrev = + + ## An abbreviation, especially one followed by a period + element abbrev { + db.abbrev.attlist, + (db._text | db.superscript | db.subscript | db.trademark)* + } +} +div { + db.acronym.role.attribute = attribute role { text } + db.acronym.attlist = + db.acronym.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.acronym = + + ## An often pronounceable word made from the initial (or selected) letters of a name or phrase + element acronym { + db.acronym.attlist, + (db._text | db.superscript | db.subscript | db.trademark)* + } +} +div { + db.citation.role.attribute = attribute role { text } + db.citation.attlist = + db.citation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.citation = + + ## An inline bibliographic reference to another published work + element citation { db.citation.attlist, db.all.inlines* } +} +div { + db.citerefentry.role.attribute = attribute role { text } + db.citerefentry.attlist = + db.citerefentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.citerefentry = + + ## A citation to a reference page + element citerefentry { + db.citerefentry.attlist, db.refentrytitle, db.manvolnum? + } +} +div { + db.refentrytitle.role.attribute = attribute role { text } + db.refentrytitle.attlist = + db.refentrytitle.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refentrytitle = + + ## The title of a reference page + element refentrytitle { db.refentrytitle.attlist, db.all.inlines* } +} +div { + db.manvolnum.role.attribute = attribute role { text } + db.manvolnum.attlist = + db.manvolnum.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.manvolnum = + + ## A reference volume number + element manvolnum { db.manvolnum.attlist, db._text } +} +div { + db.citetitle.pubwork.enumeration = + + ## An article + "article" + | + ## A bulletin board system + "bbs" + | + ## A book + "book" + | + ## A CD-ROM + "cdrom" + | + ## A chapter (as of a book) + "chapter" + | + ## A DVD + "dvd" + | + ## An email message + "emailmessage" + | + ## A gopher page + "gopher" + | + ## A journal + "journal" + | + ## A manuscript + "manuscript" + | + ## A posting to a newsgroup + "newsposting" + | + ## A part (as of a book) + "part" + | + ## A reference entry + "refentry" + | + ## A section (as of a book or article) + "section" + | + ## A series + "series" + | + ## A set (as of books) + "set" + | + ## A web page + "webpage" + | + ## A wiki page + "wiki" + db.citetitle.pubwork.attribute = + + ## Identifies the nature of the publication being cited + attribute pubwork { db.citetitle.pubwork.enumeration } + db.citetitle.role.attribute = attribute role { text } + db.citetitle.attlist = + db.citetitle.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.citetitle.pubwork.attribute? + db.citetitle = + + ## The title of a cited work + element citetitle { db.citetitle.attlist, db.all.inlines* } +} +div { + db.emphasis.role.attribute = attribute role { text } + db.emphasis.attlist = + db.emphasis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.emphasis = + + ## Emphasized text + element emphasis { db.emphasis.attlist, db.all.inlines* } +} +div { + db._emphasis = + + ## A limited span of emphasized text + element emphasis { db.emphasis.attlist, (db._text | db._emphasis)* } +} +div { + db.foreignphrase.role.attribute = attribute role { text } + db.foreignphrase.attlist = + db.foreignphrase.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.foreignphrase = + + ## A word or phrase in a language other than the primary language of the document + element foreignphrase { + db.foreignphrase.attlist, (text | db.general.inlines)* + } +} +div { + db.phrase.role.attribute = attribute role { text } + db.phrase.attlist = + db.phrase.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.phrase = + + ## A span of text + element phrase { db.phrase.attlist, db.all.inlines* } +} +div { + db._phrase = + + ## A limited span of text + element phrase { db.phrase.attlist, db._text } +} +div { + db.quote.role.attribute = attribute role { text } + db.quote.attlist = + db.quote.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.quote = + + ## An inline quotation + element quote { db.quote.attlist, db.all.inlines* } +} +div { + db.subscript.role.attribute = attribute role { text } + db.subscript.attlist = + db.subscript.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.subscript = + + ## A subscript (as in H2 + ## O, the molecular formula for water) + element subscript { db.subscript.attlist, db._text } +} +div { + db.superscript.role.attribute = attribute role { text } + db.superscript.attlist = + db.superscript.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.superscript = + + ## A superscript (as in x^2, the mathematical notation for x multiplied by itself) + element superscript { db.superscript.attlist, db._text } +} +div { + db.trademark.class.enumeration = + + ## A copyright + "copyright" + | + ## A registered copyright + "registered" + | + ## A service + "service" + | + ## A trademark + "trade" + db.trademark.class.attribute = + + ## Identifies the class of trade mark + attribute class { db.trademark.class.enumeration } + db.trademark.role.attribute = attribute role { text } + db.trademark.attlist = + db.trademark.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.trademark.class.attribute? + db.trademark = + + ## A trademark + element trademark { db.trademark.attlist, db._text } +} +div { + db.wordasword.role.attribute = attribute role { text } + db.wordasword.attlist = + db.wordasword.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.wordasword = + + ## A word meant specifically as a word and not representing anything else + element wordasword { db.wordasword.attlist, db._text } +} +div { + db.footnoteref.role.attribute = attribute role { text } + db.footnoteref.label.attribute = db.label.attribute + db.footnoteref.attlist = + db.footnoteref.role.attribute? + & db.common.attributes + & db.linkend.attribute + & db.footnoteref.label.attribute? + db.footnoteref = + + ## A cross reference to a footnote (a footnote mark) + [ + s:pattern [ + name = "Footnote reference type constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnoteref" + "\x{a}" ~ + " " + s:assert [ + test = + "local-name(//*[@xml:id=current()/@linkend]) = 'footnote' and namespace-uri(//*[@xml:id=current()/@linkend]) = 'http://docbook.org/ns/docbook'" + "@linkend on footnoteref must point to a footnote." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element footnoteref { db.footnoteref.attlist, empty } +} +div { + db.xref.role.attribute = attribute role { text } + db.xref.xrefstyle.attribute = db.xrefstyle.attribute + db.xref.endterm.attribute = db.endterm.attribute + db.xref.attlist = + db.xref.role.attribute? + & db.common.attributes + & db.common.req.linking.attributes + & db.xref.xrefstyle.attribute? + & db.xref.endterm.attribute? + db.xref = + + ## A cross reference to another part of the document + element xref { db.xref.attlist, empty } +} +div { + db.link.role.attribute = attribute role { text } + db.link.xrefstyle.attribute = db.xrefstyle.attribute + db.link.endterm.attribute = db.endterm.attribute + db.link.attlist = + db.link.role.attribute? + & db.common.attributes + & db.common.req.linking.attributes + & db.link.xrefstyle.attribute? + & db.link.endterm.attribute? + db.link = + + ## A hypertext link + element link { db.link.attlist, db.all.inlines* } +} +div { + db.olink.role.attribute = attribute role { text } + db.olink.xrefstyle.attribute = db.xrefstyle.attribute + db.olink.localinfo.attribute = + + ## Holds additional information that may be used by the applicatoin when resolving the link + attribute localinfo { text } + db.olink.targetdoc.attribute = + + ## Specifies the URI of the document in which the link target appears + attribute targetdoc { xsd:anyURI } + db.olink.targetptr.attribute = + + ## Specifies the location of the link target in the document + attribute targetptr { text } + db.olink.type.attribute = + + ## Identifies application-specific customization of the link behavior + attribute type { text } + db.olink.attlist = + db.common.attributes + & db.olink.targetdoc.attribute? + & db.olink.role.attribute? + & db.olink.xrefstyle.attribute? + & db.olink.localinfo.attribute? + & db.olink.targetptr.attribute? + & db.olink.type.attribute? + db.olink = + + ## A link that addresses its target indirectly + element olink { db.olink.attlist, db.all.inlines* } +} +div { + db.anchor.role.attribute = attribute role { text } + db.anchor.attlist = + db.anchor.role.attribute? & db.common.idreq.attributes + db.anchor = + + ## A spot in the document + element anchor { db.anchor.attlist, empty } +} +div { + db.alt.role.attribute = attribute role { text } + db.alt.attlist = db.alt.role.attribute? & db.common.attributes + db.alt = + + ## A text-only annotation, often used for accessibility + element alt { db.alt.attlist, (text | db.inlinemediaobject)* } +} +db.annotations.attribute = + + ## Identifies one or more annotations that apply to this element + attribute annotations { text } +div { + db.annotation.role.attribute = attribute role { text } + db.annotation.annotates.attribute = + + ## Identifies one ore more elements to which this annotation applies + attribute annotates { text } + db.annotation.attlist = + db.annotation.role.attribute? + & db.annotation.annotates.attribute? + & db.common.attributes + db.annotation.info = db._info.title.only + db.annotation = + + ## An annotation + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:annotation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:annotation)" + "annotation must not occur in the descendants of annotation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element annotation { + db.annotation.attlist, db.annotation.info, db.all.blocks+ + } +} +db.xlink.from.attribute = + + ## Specifies the XLink traversal-from + attribute xlink:from { xsd:NMTOKEN }? +db.xlink.label.attribute = + + ## Specifies the XLink label + attribute xlink:label { xsd:NMTOKEN }? +db.xlink.to.attribute = + + ## Specifies the XLink traversal-to + attribute xlink:to { xsd:NMTOKEN }? +div { + db.extendedlink.role.attribute = attribute role { text } + db.extendedlink.attlist = + db.extendedlink.role.attribute? + & db.common.attributes + & + ## Identifies the XLink link type + [ a:defaultValue = "extended" ] + attribute xlink:type { + + ## An XLink extended link + "extended" + }? + & db.xlink.role.attribute? + & db.xlink.title.attribute? + db.extendedlink = + + ## An XLink extended link + element extendedlink { + db.extendedlink.attlist, (db.locator | db.arc)+ + } +} +div { + db.locator.role.attribute = attribute role { text } + db.locator.attlist = + db.locator.role.attribute? + & db.common.attributes + & + ## Identifies the XLink link type + [ a:defaultValue = "locator" ] + attribute xlink:type { + + ## An XLink locator link + "locator" + }? + & db.xlink.href.attribute + & db.xlink.role.attribute? + & db.xlink.title.attribute? + & db.xlink.label.attribute? + db.locator = + + ## An XLink locator in an extendedlink + element locator { db.locator.attlist, empty } +} +div { + db.arc.role.attribute = attribute role { text } + db.arc.attlist = + db.arc.role.attribute? + & db.common.attributes + & + ## Identifies the XLink link type + [ a:defaultValue = "arc" ] + attribute xlink:type { + + ## An XLink arc link + "arc" + }? + & db.xlink.arcrole.attribute? + & db.xlink.title.attribute? + & db.xlink.show.attribute? + & db.xlink.actuate.attribute? + & db.xlink.from.attribute? + & db.xlink.to.attribute? + db.arc = + + ## An XLink arc in an extendedlink + element arc { db.arc.attlist, empty } +} +db.status.attribute = + + ## Identifies the editorial or publication status of the element on which it occurs + attribute status { text } +db.toplevel.sections = + ((db.section+, db.simplesect*) | db.simplesect+) + | (db.sect1+, db.simplesect*) + | db.refentry+ +db.toplevel.blocks.or.sections = + (db.all.blocks+, db.toplevel.sections?) | db.toplevel.sections +db.recursive.sections = + ((db.section+, db.simplesect*) | db.simplesect+) + | db.refentry+ +db.recursive.blocks.or.sections = + (db.all.blocks+, db.recursive.sections?) | db.recursive.sections +db.divisions = db.part | db.reference +db.components = + db.dedication + | db.acknowledgements + | db.preface + | db.chapter + | db.appendix + | db.article + | db.colophon +db.navigation.components = + notAllowed | db.glossary | db.bibliography | db.index | db.toc +db.component.contentmodel = + db.navigation.components*, + db.toplevel.blocks.or.sections, + db.navigation.components* +db.setindex.components = notAllowed | db.setindex +db.toc.components = notAllowed | db.toc +db.set.components = db.set | db.book +div { + db.set.status.attribute = db.status.attribute + db.set.role.attribute = attribute role { text } + db.set.attlist = + db.set.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.set.status.attribute? + db.set.info = db._info.title.req + db.set = + + ## A collection of books + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:set" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element set { + db.set.attlist, + db.set.info, + db.toc.components?, + db.set.components+, + db.setindex.components? + } +} +div { + db.book.status.attribute = db.status.attribute + db.book.role.attribute = attribute role { text } + db.book.attlist = + db.book.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.book.status.attribute? + db.book.info = db._info.title.req + db.book = + + ## A book + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:book" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element book { + db.book.attlist, + db.book.info, + (db.navigation.components | db.components | db.divisions)+ + } +} +div { + db.dedication.status.attribute = db.status.attribute + db.dedication.role.attribute = attribute role { text } + db.dedication.attlist = + db.dedication.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.dedication.status.attribute? + db.dedication.info = db._info + db.dedication = + + ## The dedication of a book or other component + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:dedication" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element dedication { + db.dedication.attlist, db.dedication.info, db.all.blocks+ + } +} +div { + db.acknowledgements.status.attribute = db.status.attribute + db.acknowledgements.role.attribute = attribute role { text } + db.acknowledgements.attlist = + db.acknowledgements.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.acknowledgements.status.attribute? + db.acknowledgements.info = db._info + db.acknowledgements = + + ## Acknowledgements of a book or other component + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:acknowledgements" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element acknowledgements { + db.acknowledgements.attlist, + db.acknowledgements.info, + db.all.blocks+ + } +} +div { + db.colophon.status.attribute = db.status.attribute + db.colophon.role.attribute = attribute role { text } + db.colophon.attlist = + db.colophon.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.colophon.status.attribute? + db.colophon.info = db._info + db.colophon = + + ## Text at the back of a book describing facts about its production + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:colophon" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element colophon { + db.colophon.attlist, db.colophon.info, db.all.blocks+ + } +} +div { + db.appendix.status.attribute = db.status.attribute + db.appendix.role.attribute = attribute role { text } + db.appendix.attlist = + db.appendix.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.appendix.status.attribute? + db.appendix.info = db._info.title.req + db.appendix = + + ## An appendix in a Book or Article + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:appendix" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element appendix { + db.appendix.attlist, db.appendix.info, db.component.contentmodel + } +} +div { + db.chapter.status.attribute = db.status.attribute + db.chapter.role.attribute = attribute role { text } + db.chapter.attlist = + db.chapter.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.chapter.status.attribute? + db.chapter.info = db._info.title.req + db.chapter = + + ## A chapter, as of a book + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:chapter" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element chapter { + db.chapter.attlist, db.chapter.info, db.component.contentmodel + } +} +db.part.components = + (db.navigation.components | db.components) + | (db.refentry | db.reference) +div { + db.part.status.attribute = db.status.attribute + db.part.role.attribute = attribute role { text } + db.part.attlist = + db.part.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.part.status.attribute? + db.part.info = db._info.title.req + db.part = + + ## A division in a book + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:part" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element part { + db.part.attlist, db.part.info, db.partintro?, db.part.components+ + } +} +div { + db.preface.status.attribute = db.status.attribute + db.preface.role.attribute = attribute role { text } + db.preface.attlist = + db.preface.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.preface.status.attribute? + db.preface.info = db._info.title.req + db.preface = + + ## Introductory matter preceding the first chapter of a book + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:preface" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element preface { + db.preface.attlist, db.preface.info, db.component.contentmodel + } +} +div { + db.partintro.status.attribute = db.status.attribute + db.partintro.role.attribute = attribute role { text } + db.partintro.attlist = + db.partintro.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.partintro.status.attribute? + db.partintro.info = db._info + db.partintro = + + ## An introduction to the contents of a part + element partintro { + db.partintro.attlist, + db.partintro.info, + db.toplevel.blocks.or.sections + } +} +div { + db.section.status.attribute = db.status.attribute + db.section.role.attribute = attribute role { text } + db.section.attlist = + db.section.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.section.status.attribute? + db.section.info = db._info.title.req + db.section = + + ## A recursive section + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:section" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element section { + db.section.attlist, + db.section.info, + db.recursive.blocks.or.sections, + db.navigation.components* + } +} +div { + db.simplesect.status.attribute = db.status.attribute + db.simplesect.role.attribute = attribute role { text } + db.simplesect.attlist = + db.simplesect.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.simplesect.status.attribute? + db.simplesect.info = db._info.title.req + db.simplesect = + + ## A section of a document with no subdivisions + element simplesect { + db.simplesect.attlist, db.simplesect.info, db.all.blocks+ + } +} +db.article.components = db.toplevel.sections +div { + db.article.status.attribute = db.status.attribute + db.article.class.enumeration = + + ## A collection of frequently asked questions. + "faq" + | + ## An article in a journal or other periodical. + "journalarticle" + | + ## A description of a product. + "productsheet" + | + ## A specification. + "specification" + | + ## A technical report. + "techreport" + | + ## A white paper. + "whitepaper" + db.article.class.attribute = + + ## Identifies the nature of the article + attribute class { db.article.class.enumeration } + db.article.role.attribute = attribute role { text } + db.article.attlist = + db.article.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.article.status.attribute? + & db.article.class.attribute? + db.article.info = db._info.title.req + db.article = + + ## An article + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:article" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element article { + db.article.attlist, + db.article.info, + (db.navigation.components + | db.appendix + | db.acknowledgements + | db.colophon)*, + ((db.all.blocks+, db.article.components?) + | db.article.components), + (db.navigation.components + | db.appendix + | db.acknowledgements + | db.colophon)* + } +} +db.sect1.sections = (db.sect2+, db.simplesect*) | db.simplesect+ +div { + db.sect1.status.attribute = db.status.attribute + db.sect1.role.attribute = attribute role { text } + db.sect1.attlist = + db.sect1.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.sect1.status.attribute? + db.sect1.info = db._info.title.req + db.sect1 = + + ## A top-level section of document + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:sect1" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element sect1 { + db.sect1.attlist, + db.sect1.info, + ((db.all.blocks+, db.sect1.sections?) | db.sect1.sections), + db.navigation.components* + } +} +db.sect2.sections = (db.sect3+, db.simplesect*) | db.simplesect+ +div { + db.sect2.status.attribute = db.status.attribute + db.sect2.role.attribute = attribute role { text } + db.sect2.attlist = + db.sect2.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.sect2.status.attribute? + db.sect2.info = db._info.title.req + db.sect2 = + + ## A subsection within a Sect1 + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:sect2" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element sect2 { + db.sect2.attlist, + db.sect2.info, + ((db.all.blocks+, db.sect2.sections?) | db.sect2.sections), + db.navigation.components* + } +} +db.sect3.sections = (db.sect4+, db.simplesect*) | db.simplesect+ +div { + db.sect3.status.attribute = db.status.attribute + db.sect3.role.attribute = attribute role { text } + db.sect3.attlist = + db.sect3.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.sect3.status.attribute? + db.sect3.info = db._info.title.req + db.sect3 = + + ## A subsection within a Sect2 + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:sect3" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element sect3 { + db.sect3.attlist, + db.sect3.info, + ((db.all.blocks+, db.sect3.sections?) | db.sect3.sections), + db.navigation.components* + } +} +db.sect4.sections = (db.sect5+, db.simplesect*) | db.simplesect+ +div { + db.sect4.status.attribute = db.status.attribute + db.sect4.role.attribute = attribute role { text } + db.sect4.attlist = + db.sect4.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.sect4.status.attribute? + db.sect4.info = db._info.title.req + db.sect4 = + + ## A subsection within a Sect3 + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:sect4" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element sect4 { + db.sect4.attlist, + db.sect4.info, + ((db.all.blocks+, db.sect4.sections?) | db.sect4.sections), + db.navigation.components* + } +} +db.sect5.sections = db.simplesect+ +div { + db.sect5.status.attribute = db.status.attribute + db.sect5.role.attribute = attribute role { text } + db.sect5.attlist = + db.sect5.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.sect5.status.attribute? + db.sect5.info = db._info.title.req + db.sect5 = + + ## A subsection within a Sect4 + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:sect5" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element sect5 { + db.sect5.attlist, + db.sect5.info, + ((db.all.blocks+, db.sect5.sections?) | db.sect5.sections), + db.navigation.components* + } +} +db.toplevel.refsection = db.refsection+ | db.refsect1+ +db.secondlevel.refsection = db.refsection+ | db.refsect2+ +db.reference.components = db.refentry +div { + db.reference.role.attribute = attribute role { text } + db.reference.attlist = + db.reference.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.status.attribute? + & db.label.attribute? + db.reference.info = db._info.title.req + db.reference = + + ## A collection of reference entries + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:reference" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element reference { + db.reference.attlist, + db.reference.info, + db.partintro?, + db.reference.components+ + } +} +div { + db.refentry.role.attribute = attribute role { text } + db.refentry.attlist = + db.refentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.status.attribute? + & db.label.attribute? + db.refentry.info = db._info.title.forbidden + db.refentry = + + ## A reference page (originally a UNIX man-style reference page) + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:refentry" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element refentry { + db.refentry.attlist, + db.indexterm*, + db.refentry.info, + db.refmeta?, + db.refnamediv+, + db.refsynopsisdiv?, + db.toplevel.refsection + } +} +div { + db.refmeta.role.attribute = attribute role { text } + db.refmeta.attlist = + db.refmeta.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refmeta = + + ## Meta-information for a reference entry + element refmeta { + db.refmeta.attlist, + db.indexterm*, + db.refentrytitle, + db.manvolnum?, + db.refmiscinfo*, + db.indexterm* + } +} +db.refmiscinfo.class.enumeration = + + ## The name of the software product or component to which this topic applies + "source" + | + ## The version of the software product or component to which this topic applies + "version" + | + ## The section title of the reference page (e.g., User Commands) + "manual" + | + ## The section title of the reference page (believed synonymous with "manual" but in wide use) + "sectdesc" + | + ## The name of the software product or component to which this topic applies (e.g., SunOS x.y; believed synonymous with "source" but in wide use) + "software" +db.refmiscinfo.class-enum.attribute = + + ## Identifies the kind of miscellaneous information + attribute class { db.refmiscinfo.class.enumeration }? +db.refmiscinfo.class-other.attribute = + + ## Identifies the nature of non-standard miscellaneous information + attribute otherclass { text } +db.refmiscinfo.class-other.attributes = + + ## Identifies the kind of miscellaneious information + attribute class { + + ## Indicates that the information is some 'other' kind. + "other" + } + & db.refmiscinfo.class-other.attribute +db.refmiscinfo.class.attribute = + db.refmiscinfo.class-enum.attribute + | db.refmiscinfo.class-other.attributes +div { + db.refmiscinfo.role.attribute = attribute role { text } + db.refmiscinfo.attlist = + db.refmiscinfo.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.refmiscinfo.class.attribute? + db.refmiscinfo = + + ## Meta-information for a reference entry other than the title and volume number + element refmiscinfo { db.refmiscinfo.attlist, db._text } +} +div { + db.refnamediv.role.attribute = attribute role { text } + db.refnamediv.attlist = + db.refnamediv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refnamediv = + + ## The name, purpose, and classification of a reference page + element refnamediv { + db.refnamediv.attlist, + db.refdescriptor?, + db.refname+, + db.refpurpose, + db.refclass* + } +} +div { + db.refdescriptor.role.attribute = attribute role { text } + db.refdescriptor.attlist = + db.refdescriptor.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refdescriptor = + + ## A description of the topic of a reference page + element refdescriptor { db.refdescriptor.attlist, db.all.inlines* } +} +div { + db.refname.role.attribute = attribute role { text } + db.refname.attlist = + db.refname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refname = + + ## The name of (one of) the subject(s) of a reference page + element refname { db.refname.attlist, db.all.inlines* } +} +div { + db.refpurpose.role.attribute = attribute role { text } + db.refpurpose.attlist = + db.refpurpose.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refpurpose = + + ## A short (one sentence) synopsis of the topic of a reference page + element refpurpose { db.refpurpose.attlist, db.all.inlines* } +} +div { + db.refclass.role.attribute = attribute role { text } + db.refclass.attlist = + db.refclass.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refclass = + + ## The scope or other indication of applicability of a reference entry + element refclass { db.refclass.attlist, (text | db.application)* } +} +div { + db.refsynopsisdiv.role.attribute = attribute role { text } + db.refsynopsisdiv.attlist = + db.refsynopsisdiv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refsynopsisdiv.info = db._info + db.refsynopsisdiv = + + ## A syntactic synopsis of the subject of the reference page + element refsynopsisdiv { + db.refsynopsisdiv.attlist, + db.refsynopsisdiv.info, + ((db.all.blocks+, db.secondlevel.refsection?) + | db.secondlevel.refsection) + } +} +div { + db.refsection.role.attribute = attribute role { text } + db.refsection.attlist = + db.refsection.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.status.attribute? + & db.label.attribute? + db.refsection.info = db._info.title.req + db.refsection = + + ## A recursive section in a refentry + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:refsection" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element refsection { + db.refsection.attlist, + db.refsection.info, + ((db.all.blocks+, db.refsection*) | db.refsection+) + } +} +db.refsect1.sections = db.refsect2+ +div { + db.refsect1.status.attribute = db.status.attribute + db.refsect1.role.attribute = attribute role { text } + db.refsect1.attlist = + db.refsect1.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.refsect1.status.attribute? + db.refsect1.info = db._info.title.req + db.refsect1 = + + ## A major subsection of a reference entry + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:refsect1" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element refsect1 { + db.refsect1.attlist, + db.refsect1.info, + ((db.all.blocks+, db.refsect1.sections?) | db.refsect1.sections) + } +} +db.refsect2.sections = db.refsect3+ +div { + db.refsect2.status.attribute = db.status.attribute + db.refsect2.role.attribute = attribute role { text } + db.refsect2.attlist = + db.refsect2.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.refsect2.status.attribute? + db.refsect2.info = db._info.title.req + db.refsect2 = + + ## A subsection of a refsect1 + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:refsect2" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element refsect2 { + db.refsect2.attlist, + db.refsect2.info, + ((db.all.blocks+, db.refsect2.sections?) | db.refsect2.sections) + } +} +div { + db.refsect3.status.attribute = db.status.attribute + db.refsect3.role.attribute = attribute role { text } + db.refsect3.attlist = + db.refsect3.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.refsect3.status.attribute? + db.refsect3.info = db._info.title.req + db.refsect3 = + + ## A subsection of a refsect2 + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:refsect3" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element refsect3 { + db.refsect3.attlist, db.refsect3.info, db.all.blocks+ + } +} +db.glossary.inlines = db.firstterm | db.glossterm +db.baseform.attribute = + + ## Specifies the base form of the term, the one that appears in the glossary. This allows adjectival, plural, and other variations of the term to appear in the element. The element content is the default base form. + attribute baseform { text }? +div { + db.glosslist.role.attribute = attribute role { text } + db.glosslist.attlist = + db.glosslist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.glosslist.info = db._info.title.only + db.glosslist = + + ## A wrapper for a list of glossary entries + element glosslist { + db.glosslist.attlist, + db.glosslist.info?, + db.all.blocks*, + db.glossentry+ + } +} +div { + db.glossentry.role.attribute = attribute role { text } + db.glossentry.sortas.attribute = + + ## Specifies the string by which the element's content is to be sorted; if unspecified, the content is used + attribute sortas { text } + db.glossentry.attlist = + db.glossentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.glossentry.sortas.attribute? + db.glossentry = + + ## An entry in a Glossary or GlossList + element glossentry { + db.glossentry.attlist, + db.glossterm, + db.acronym?, + db.abbrev?, + db.indexterm*, + (db.glosssee | db.glossdef+) + } +} +div { + db.glossdef.role.attribute = attribute role { text } + db.glossdef.subject.attribute = + + ## Specifies a list of keywords for the definition + attribute subject { text } + db.glossdef.attlist = + db.glossdef.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.glossdef.subject.attribute? + db.glossdef = + + ## A definition in a GlossEntry + element glossdef { + db.glossdef.attlist, db.all.blocks+, db.glossseealso* + } +} +div { + db.glosssee.role.attribute = attribute role { text } + db.glosssee.otherterm.attribute = + + ## Identifies the other term + attribute otherterm { xsd:IDREF } + db.glosssee.attlist = + db.glosssee.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.glosssee.otherterm.attribute? + db.glosssee = + + ## A cross-reference from one glossentry + ## to another + [ + s:pattern [ + name = "Glosssary 'see' type constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:glosssee[@otherterm]" + "\x{a}" ~ + " " + s:assert [ + test = + "local-name(//*[@xml:id=current()/@otherterm]) = 'glossentry' and namespace-uri(//*[@xml:id=current()/@otherterm]) = 'http://docbook.org/ns/docbook'" + "@otherterm on glosssee must point to a glossentry." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element glosssee { db.glosssee.attlist, db.all.inlines* } +} +div { + db.glossseealso.role.attribute = attribute role { text } + db.glossseealso.otherterm.attribute = + + ## Identifies the other term + attribute otherterm { xsd:IDREF } + db.glossseealso.attlist = + db.glossseealso.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.glossseealso.otherterm.attribute? + db.glossseealso = + + ## A cross-reference from one GlossEntry to another + [ + s:pattern [ + name = "Glossary 'seealso' type constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:glossseealso[@otherterm]" + "\x{a}" ~ + " " + s:assert [ + test = + "local-name(//*[@xml:id=current()/@otherterm]) = 'glossentry' and namespace-uri(//*[@xml:id=current()/@otherterm]) = 'http://docbook.org/ns/docbook'" + "@otherterm on glossseealso must point to a glossentry." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element glossseealso { db.glossseealso.attlist, db.all.inlines* } +} +div { + db.firstterm.role.attribute = attribute role { text } + db.firstterm.attlist = + db.firstterm.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.baseform.attribute + db.firstterm = + + ## The first occurrence of a term + [ + s:pattern [ + name = "Glossary 'firstterm' type constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:firstterm[@linkend]" + "\x{a}" ~ + " " + s:assert [ + test = + "local-name(//*[@xml:id=current()/@linkend]) = 'glossentry' and namespace-uri(//*[@xml:id=current()/@linkend]) = 'http://docbook.org/ns/docbook'" + "@linkend on firstterm must point to a glossentry." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element firstterm { db.firstterm.attlist, db.all.inlines* } +} +div { + db.glossterm.role.attribute = attribute role { text } + db.glossterm.attlist = + db.glossterm.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.baseform.attribute + db.glossterm = + + ## A glossary term + [ + s:pattern [ + name = "Glossary 'glossterm' type constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:glossterm[@linkend]" + "\x{a}" ~ + " " + s:assert [ + test = + "local-name(//*[@xml:id=current()/@linkend]) = 'glossentry' and namespace-uri(//*[@xml:id=current()/@linkend]) = 'http://docbook.org/ns/docbook'" + "@linkend on glossterm must point to a glossentry." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element glossterm { db.glossterm.attlist, db.all.inlines* } +} +div { + db.glossary.status.attribute = db.status.attribute + db.glossary.role.attribute = attribute role { text } + db.glossary.attlist = + db.glossary.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.glossary.status.attribute? + db.glossary.info = db._info + db.glossary = + + ## A glossary + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:glossary" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element glossary { + db.glossary.attlist, + db.glossary.info, + db.all.blocks*, + (db.glossdiv* | db.glossentry*), + db.bibliography? + } +} +div { + db.glossdiv.status.attribute = db.status.attribute + db.glossdiv.role.attribute = attribute role { text } + db.glossdiv.attlist = + db.glossdiv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.glossdiv.status.attribute? + db.glossdiv.info = db._info.title.req + db.glossdiv = + + ## A division in a Glossary + element glossdiv { + db.glossdiv.attlist, + db.glossdiv.info, + db.all.blocks*, + db.glossentry+ + } +} +div { + db.termdef.role.attribute = attribute role { text } + db.termdef.attlist = + db.termdef.role.attribute? + & db.glossentry.sortas.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.baseform.attribute + db.termdef = + + ## An inline definition of a term + [ + s:pattern [ + name = "Glossary term definition constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:termdef" + "\x{a}" ~ + " " + s:assert [ + test = "count(db:firstterm) = 1" + "A termdef must contain exactly one firstterm" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element termdef { db.termdef.attlist, db.all.inlines* } +} +db.relation.attribute = + + ## Identifies the relationship between the bibliographic elemnts + attribute relation { text } +div { + db.biblioentry.role.attribute = attribute role { text } + db.biblioentry.attlist = + db.biblioentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.biblioentry = + + ## An entry in a Bibliography + element biblioentry { + db.biblioentry.attlist, db.bibliographic.elements+ + } +} +div { + db.bibliomixed.role.attribute = attribute role { text } + db.bibliomixed.attlist = + db.bibliomixed.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.bibliomixed = + + ## An entry in a Bibliography + element bibliomixed { + db.bibliomixed.attlist, (text | db.bibliographic.elements)* + } +} +div { + db.biblioset.relation.attribute = db.relation.attribute + db.biblioset.role.attribute = attribute role { text } + db.biblioset.attlist = + db.biblioset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.biblioset.relation.attribute? + db.biblioset = + + ## A raw container for related bibliographic information + element biblioset { + db.biblioset.attlist, db.bibliographic.elements+ + } +} +div { + db.bibliomset.relation.attribute = db.relation.attribute + db.bibliomset.role.attribute = attribute role { text } + db.bibliomset.attlist = + db.bibliomset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.bibliomset.relation.attribute? + db.bibliomset = + + ## A cooked container for related bibliographic information + element bibliomset { + db.bibliomset.attlist, (db._text | db.bibliographic.elements)* + } +} +div { + db.bibliomisc.role.attribute = attribute role { text } + db.bibliomisc.attlist = + db.bibliomisc.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.bibliomisc = + + ## Untyped bibliographic information + element bibliomisc { db.bibliomisc.attlist, db._text } +} +div { + db.bibliography.status.attrib = db.status.attribute + db.bibliography.role.attribute = attribute role { text } + db.bibliography.attlist = + db.bibliography.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.bibliography.status.attrib? + db.bibliography.info = db._info + db.bibliography = + + ## A bibliography + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:bibliography" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element bibliography { + db.bibliography.attlist, + db.bibliography.info, + db.all.blocks*, + (db.bibliodiv+ | (db.biblioentry | db.bibliomixed)+) + } +} +div { + db.bibliodiv.status.attrib = db.status.attribute + db.bibliodiv.role.attribute = attribute role { text } + db.bibliodiv.attlist = + db.bibliodiv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.bibliodiv.status.attrib? + db.bibliodiv.info = db._info.title.req + db.bibliodiv = + + ## A section of a Bibliography + element bibliodiv { + db.bibliodiv.attlist, + db.bibliodiv.info, + db.all.blocks*, + (db.biblioentry | db.bibliomixed)+ + } +} +div { + db.bibliolist.role.attribute = attribute role { text } + db.bibliolist.attlist = + db.bibliolist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.bibliolist.info = db._info.title.only + db.bibliolist = + + ## A wrapper for a list of bibliography entries + element bibliolist { + db.bibliolist.attlist, + db.bibliolist.info?, + db.all.blocks*, + (db.biblioentry | db.bibliomixed)+ + } +} +div { + db.biblioref.role.attribute = attribute role { text } + db.biblioref.xrefstyle.attribute = db.xrefstyle.attribute + db.biblioref.endterm.attribute = db.endterm.attribute + db.biblioref.units.attribute = + + ## The units (for example, pages) used to identify the beginning and ending of a reference. + attribute units { xsd:token } + db.biblioref.begin.attribute = + + ## Identifies the beginning of a reference; the location within the work that is being referenced. + attribute begin { xsd:token } + db.biblioref.end.attribute = + + ## Identifies the end of a reference. + attribute end { xsd:token } + db.biblioref.attlist = + db.biblioref.role.attribute? + & db.common.attributes + & db.common.req.linking.attributes + & db.biblioref.xrefstyle.attribute? + & db.biblioref.endterm.attribute? + & db.biblioref.units.attribute? + & db.biblioref.begin.attribute? + & db.biblioref.end.attribute? + db.biblioref = + + ## A cross-reference to a bibliographic entry + element biblioref { db.biblioref.attlist, empty } +} +db.significance.enumeration = + + ## Normal + "normal" + | + ## Preferred + "preferred" +db.significance.attribute = + + ## Specifies the significance of the term + attribute significance { db.significance.enumeration } +db.zone.attribute = + + ## Specifies the IDs of the elements to which this term applies + attribute zone { xsd:IDREFS } +db.indexterm.pagenum.attribute = + + ## Indicates the page on which this index term occurs in some version of the printed document + attribute pagenum { text } +db.scope.enumeration = + + ## All indexes + "all" + | + ## The global index (as for a combined index of a set of box) + "global" + | + ## The local index (the index for this document only) + "local" +db.scope.attribute = + + ## Specifies the scope of the index term + attribute scope { db.scope.enumeration } +db.sortas.attribute = + + ## Specifies the string by which the term is to be sorted; if unspecified, the term content is used + attribute sortas { text } +db.index.type.attribute = + + ## Specifies the target index for this term + attribute type { text } +div { + db.itermset.role.attribute = attribute role { text } + db.itermset.attlist = + db.itermset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.itermset = + + ## A set of index terms in the meta-information of a document + element itermset { db.itermset.attlist, db.indexterm.singular+ } +} +db.indexterm.contentmodel = + db.primary?, + ((db.secondary, + ((db.tertiary, (db.see | db.seealso+)?) + | db.see + | db.seealso+)?) + | db.see + | db.seealso+)? +div { + db.indexterm.singular.role.attribute = attribute role { text } + db.indexterm.singular.class.attribute = + + ## Identifies the class of index term + attribute class { + + ## A singular index term + "singular" + } + db.indexterm.singular.attlist = + db.indexterm.singular.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.significance.attribute? + & db.zone.attribute? + & db.indexterm.pagenum.attribute? + & db.scope.attribute? + & db.index.type.attribute? + & db.indexterm.singular.class.attribute? + db.indexterm.singular = + + ## A wrapper for an indexed term + element indexterm { + db.indexterm.singular.attlist, db.indexterm.contentmodel + } +} +div { + db.indexterm.startofrange.role.attribute = attribute role { text } + db.indexterm.startofrange.class.attribute = + + ## Identifies the class of index term + attribute class { + + ## The start of a range + "startofrange" + } + db.indexterm.startofrange.attlist = + db.indexterm.startofrange.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.significance.attribute? + & db.zone.attribute? + & db.indexterm.pagenum.attribute? + & db.scope.attribute? + & db.index.type.attribute? + & db.indexterm.startofrange.class.attribute + db.indexterm.startofrange = + + ## A wrapper for an indexed term that covers a range + element indexterm { + db.indexterm.startofrange.attlist, db.indexterm.contentmodel + } +} +div { + db.indexterm.endofrange.role.attribute = attribute role { text } + db.indexterm.endofrange.class.attribute = + + ## Identifies the class of index term + attribute class { + + ## The end of a range + "endofrange" + } + db.indexterm.endofrange.startref.attribute = + + ## Points to the start of the range + attribute startref { xsd:IDREF } + db.indexterm.endofrange.attlist = + db.indexterm.endofrange.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.indexterm.endofrange.class.attribute + & db.indexterm.endofrange.startref.attribute + db.indexterm.endofrange = + + ## Identifies the end of a range associated with an indexed term + element indexterm { db.indexterm.endofrange.attlist, empty } +} +div { + db.indexterm = + db.indexterm.singular + | db.indexterm.startofrange + | db.indexterm.endofrange +} +div { + db.primary.role.attribute = attribute role { text } + db.primary.attlist = + db.primary.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.sortas.attribute? + db.primary = + + ## The primary word or phrase under which an index term should be sorted + element primary { db.primary.attlist, db.all.inlines* } +} +div { + db.secondary.role.attribute = attribute role { text } + db.secondary.attlist = + db.secondary.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.sortas.attribute? + db.secondary = + + ## A secondary word or phrase in an index term + element secondary { db.secondary.attlist, db.all.inlines* } +} +div { + db.tertiary.role.attribute = attribute role { text } + db.tertiary.attlist = + db.tertiary.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.sortas.attribute? + db.tertiary = + + ## A tertiary word or phrase in an index term + element tertiary { db.tertiary.attlist, db.all.inlines* } +} +div { + db.see.role.attribute = attribute role { text } + db.see.attlist = + db.see.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.see = + + ## Part of an index term directing the reader instead to another entry in the index + element see { db.see.attlist, db.all.inlines* } +} +div { + db.seealso.role.attribute = attribute role { text } + db.seealso.attlist = + db.seealso.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.seealso = + + ## Part of an index term directing the reader also to another entry in the index + element seealso { db.seealso.attlist, db.all.inlines* } +} +div { + db.index.status.attribute = db.status.attribute + db.index.role.attribute = attribute role { text } + db.index.attlist = + db.index.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.index.status.attribute? + & db.index.type.attribute? + db.index.info = db._info + # + # Yes, db.indexdiv* and db.indexentry*; that way an is valid. + # Authors can use an empty index to indicate where a generated index should + # appear. + db.index = + + ## An index to a book or part of a book + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:index" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element index { + db.index.attlist, + db.index.info, + db.all.blocks*, + (db.indexdiv* | db.indexentry* | db.segmentedlist) + } +} +div { + db.setindex.status.attribute = db.status.attribute + db.setindex.role.attribute = attribute role { text } + db.setindex.attlist = + db.setindex.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.setindex.status.attribute? + & db.index.type.attribute? + db.setindex.info = db._info + db.setindex = + + ## An index to a set of books + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:setindex" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element setindex { + db.setindex.attlist, + db.setindex.info, + db.all.blocks*, + (db.indexdiv* | db.indexentry*) + } +} +div { + db.indexdiv.status.attribute = db.status.attribute + db.indexdiv.role.attribute = attribute role { text } + db.indexdiv.attlist = + db.indexdiv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.indexdiv.status.attribute? + db.indexdiv.info = db._info.title.req + db.indexdiv = + + ## A division in an index + element indexdiv { + db.indexdiv.attlist, + db.indexdiv.info, + db.all.blocks*, + (db.indexentry+ | db.segmentedlist) + } +} +div { + db.indexentry.role.attribute = attribute role { text } + db.indexentry.attlist = + db.indexentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.indexentry = + + ## An entry in an index + element indexentry { + db.indexentry.attlist, + db.primaryie, + (db.seeie | db.seealsoie)*, + (db.secondaryie, (db.seeie | db.seealsoie | db.tertiaryie)*)* + } +} +div { + db.primaryie.role.attribute = attribute role { text } + db.primaryie.attlist = + db.primaryie.role.attribute? + & db.common.attributes + & db.linkends.attribute? + db.primaryie = + + ## A primary term in an index entry, not in the text + element primaryie { db.primaryie.attlist, db.all.inlines* } +} +div { + db.secondaryie.role.attribute = attribute role { text } + db.secondaryie.attlist = + db.secondaryie.role.attribute? + & db.common.attributes + & db.linkends.attribute? + db.secondaryie = + + ## A secondary term in an index entry, rather than in the text + element secondaryie { db.secondaryie.attlist, db.all.inlines* } +} +div { + db.tertiaryie.role.attribute = attribute role { text } + db.tertiaryie.attlist = + db.tertiaryie.role.attribute? + & db.common.attributes + & db.linkends.attribute? + db.tertiaryie = + + ## A tertiary term in an index entry, rather than in the text + element tertiaryie { db.tertiaryie.attlist, db.all.inlines* } +} +div { + db.seeie.role.attribute = attribute role { text } + db.seeie.attlist = + db.seeie.role.attribute? + & db.common.attributes + & db.linkend.attribute? + db.seeie = + + ## A See + ## entry in an index, rather than in the text + element seeie { db.seeie.attlist, db.all.inlines* } +} +div { + db.seealsoie.role.attribute = attribute role { text } + db.seealsoie.attlist = + db.seealsoie.role.attribute? + & db.common.attributes + & db.linkends.attribute? + db.seealsoie = + + ## A See also + ## entry in an index, rather than in the text + element seealsoie { db.seealsoie.attlist, db.all.inlines* } +} +db.toc.pagenum.attribute = + + ## Indicates the page on which this element occurs in some version of the printed document + attribute pagenum { text } +div { + db.toc.role.attribute = attribute role { text } + db.toc.attlist = + db.toc.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.toc.info = db._info.title.only + db.toc = + + ## A table of contents + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:toc" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element toc { + db.toc.attlist, + db.toc.info, + db.all.blocks*, + (db.tocdiv | db.tocentry)* + } +} +div { + db.tocdiv.role.attribute = attribute role { text } + db.tocdiv.pagenum.attribute = db.toc.pagenum.attribute + db.tocdiv.attlist = + db.tocdiv.role.attribute? + & db.common.attributes + & db.tocdiv.pagenum.attribute? + & db.linkend.attribute? + db.tocdiv.info = db._info + db.tocdiv = + + ## A division in a table of contents + element tocdiv { + db.tocdiv.attlist, + db.tocdiv.info, + db.all.blocks*, + (db.tocdiv | db.tocentry)+ + } +} +div { + db.tocentry.role.attribute = attribute role { text } + db.tocentry.pagenum.attribute = db.toc.pagenum.attribute + db.tocentry.attlist = + db.tocentry.role.attribute? + & db.common.attributes + & db.tocentry.pagenum.attribute? + & db.linkend.attribute? + db.tocentry = + + ## A component title in a table of contents + element tocentry { db.tocentry.attlist, db.all.inlines* } +} +db.task.info = db._info.title.req +div { + db.task.role.attribute = attribute role { text } + db.task.attlist = + db.task.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.task = + + ## A task to be completed + element task { + db.task.attlist, + db.task.info, + db.tasksummary?, + db.taskprerequisites?, + db.procedure, + db.example*, + db.taskrelated? + } +} +div { + db.tasksummary.role.attribute = attribute role { text } + db.tasksummary.attlist = + db.tasksummary.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.tasksummary.info = db._info.title.only + db.tasksummary = + + ## A summary of a task + element tasksummary { + db.tasksummary.attlist, db.tasksummary.info, db.all.blocks+ + } +} +div { + db.taskprerequisites.role.attribute = attribute role { text } + db.taskprerequisites.attlist = + db.taskprerequisites.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.taskprerequisites.info = db._info.title.only + db.taskprerequisites = + + ## The prerequisites for a task + element taskprerequisites { + db.taskprerequisites.attlist, + db.taskprerequisites.info, + db.all.blocks+ + } +} +div { + db.taskrelated.role.attribute = attribute role { text } + db.taskrelated.attlist = + db.taskrelated.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.taskrelated.info = db._info.title.only + db.taskrelated = + + ## Information related to a task + element taskrelated { + db.taskrelated.attlist, db.taskrelated.info, db.all.blocks+ + } +} +db.area.units.enumeration = + + ## Coordinates expressed as a pair of CALS graphic coordinates. + "calspair" + | + ## Coordinates expressed as a line and column. + "linecolumn" + | + ## Coordinates expressed as a pair of lines and columns. + "linecolumnpair" + | + ## Coordinates expressed as a line range. + "linerange" +db.area.units-enum.attribute = + + ## Identifies the units used in the coords attribute The default units vary according to the type of callout specified: calspair + ## for graphics and linecolumn + ## for line-oriented elements. + attribute units { db.area.units.enumeration }? +db.area.units-other.attributes = + + ## Indicates that non-standard units are used for this area + ## . In this case otherunits + ## must be specified. + attribute units { + + ## Coordinates expressed in some non-standard units. + "other" + }?, + + ## Identifies the units used in the coords + ## attribute when the units + ## attribute is other + ## . This attribute is forbidden otherwise. + attribute otherunits { xsd:NMTOKEN } +db.area.units.attribute = + db.area.units-enum.attribute | db.area.units-other.attributes +div { + db.calloutlist.role.attribute = attribute role { text } + db.calloutlist.attlist = + db.calloutlist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.calloutlist.info = db._info.title.only + db.calloutlist = + + ## A list of callout + ## s + element calloutlist { + db.calloutlist.attlist, + db.calloutlist.info, + db.all.blocks*, + db.callout+ + } +} +div { + db.callout.role.attribute = attribute role { text } + db.callout.arearefs.attribute = + + ## Identifies the areas described by this callout. + attribute arearefs { xsd:IDREFS } + db.callout.attlist = + db.callout.role.attribute? + & db.common.attributes + & db.callout.arearefs.attribute + db.callout = + + ## A called out + ## description of a marked Area + element callout { db.callout.attlist, db.all.blocks+ } +} +div { + db.programlistingco.role.attribute = attribute role { text } + db.programlistingco.attlist = + db.programlistingco.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.programlistingco.info = db._info.title.forbidden + db.programlistingco = + + ## A program listing with associated areas used in callouts + element programlistingco { + db.programlistingco.attlist, + db.programlistingco.info, + db.areaspec, + db.programlisting, + db.calloutlist* + } +} +div { + db.areaspec.role.attribute = attribute role { text } + db.areaspec.attlist = + db.areaspec.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.area.units.attribute + db.areaspec = + + ## A collection of regions in a graphic or code example + element areaspec { db.areaspec.attlist, (db.area | db.areaset)+ } +} +div { + db.area.role.attribute = attribute role { text } + db.area.linkends.attribute = + + ## Point to the callout + ## s which refer to this area. (This provides bidirectional linking which may be useful in online presentation.) + attribute linkends { xsd:IDREFS } + db.area.label.attribute = + + ## Specifies an identifying number or string that may be used in presentation. The area label might be drawn on top of the figure, for example, at the position indicated by the coords attribute. + attribute label { text } + db.area.coords.attribute = + + ## Provides the coordinates of the area. The coordinates must be interpreted using the units + ## specified. + attribute coords { text } + db.area.attlist = + db.area.role.attribute? + & db.common.idreq.attributes + & db.area.units.attribute + & (db.area.linkends.attribute | db.href.attributes)? + & db.area.label.attribute? + & db.area.coords.attribute + db.area = + + ## A region defined for a Callout in a graphic or code example + element area { db.area.attlist, db.alt? } +} +div { + # The only difference is that xml:id is optional + db.area.inareaset.attlist = + db.area.role.attribute? + & db.common.attributes + & db.area.units.attribute + & (db.area.linkends.attribute | db.href.attributes)? + & db.area.label.attribute? + & db.area.coords.attribute + db.area.inareaset = + + ## A region defined for a Callout in a graphic or code example + element area { db.area.inareaset.attlist, db.alt? } +} +div { + db.areaset.role.attribute = attribute role { text } + db.areaset.linkends.attribute = db.linkends.attribute + db.areaset.label.attribute = db.label.attribute + db.areaset.attlist = + db.areaset.role.attribute? + & db.common.idreq.attributes + & db.area.units.attribute + & (db.areaset.linkends.attribute | db.href.attributes)? + & db.areaset.label.attribute? + db.areaset = + + ## A set of related areas in a graphic or code example + element areaset { db.areaset.attlist, db.area.inareaset+ } +} +div { + db.screenco.role.attribute = attribute role { text } + db.screenco.attlist = + db.screenco.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.screenco.info = db._info.title.forbidden + db.screenco = + + ## A screen with associated areas used in callouts + element screenco { + db.screenco.attlist, + db.screenco.info, + db.areaspec, + db.screen, + db.calloutlist* + } +} +div { + db.imageobjectco.role.attribute = attribute role { text } + db.imageobjectco.attlist = + db.imageobjectco.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.imageobjectco.info = db._info.title.forbidden + db.imageobjectco = + + ## A wrapper for an image object with callouts + element imageobjectco { + db.imageobjectco.attlist, + db.imageobjectco.info, + db.areaspec, + db.imageobject+, + db.calloutlist* + } +} +div { + db.co.role.attribute = attribute role { text } + db.co.linkends.attribute = db.linkends.attribute + db.co.label.attribute = db.label.attribute + db.co.attlist = + db.co.role.attribute? + & db.common.idreq.attributes + & db.co.linkends.attribute? + & db.co.label.attribute? + db.co = + + ## The location of a callout embedded in text + element co { db.co.attlist, empty } +} +div { + db.coref.role.attribute = attribute role { text } + db.coref.label.attribute = db.label.attribute + db.coref.attlist = + db.coref.role.attribute? + & db.common.attributes + & db.linkend.attribute + & db.coref.label.attribute? + db.coref = + + ## A cross reference to a co + element coref { db.coref.attlist, empty } +} +div { + db.productionset.role.attribute = attribute role { text } + db.productionset.attlist = + db.productionset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.productionset.info = db._info.title.only + db.productionset = + + ## A set of EBNF productions + element productionset { + db.productionset.attlist, + db.productionset.info, + (db.production | db.productionrecap)+ + } +} +div { + db.production.role.attribute = attribute role { text } + db.production.attlist = + db.production.role.attribute? + & db.common.idreq.attributes + & db.common.linking.attributes + db.production = + + ## A production in a set of EBNF productions + element production { + db.production.attlist, db.lhs, db.rhs, db.constraint* + } +} +div { + db.lhs.role.attribute = attribute role { text } + db.lhs.attlist = + db.lhs.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.lhs = + + ## The left-hand side of an EBNF production + element lhs { db.lhs.attlist, text } +} +div { + db.rhs.role.attribute = attribute role { text } + db.rhs.attlist = + db.rhs.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.rhs = + + ## The right-hand side of an EBNF production + element rhs { + db.rhs.attlist, + (text | db.nonterminal | db.lineannotation | db.sbr)* + } +} +div { + db.nonterminal.role.attribute = attribute role { text } + db.nonterminal.def.attribute = + + ## Specifies a URI that points to a production + ## where the nonterminal + ## is defined + attribute def { xsd:anyURI } + db.nonterminal.attlist = + db.nonterminal.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.nonterminal.def.attribute + db.nonterminal = + + ## A non-terminal in an EBNF production + element nonterminal { db.nonterminal.attlist, text } +} +div { + db.constraint.role.attribute = attribute role { text } + db.constraint.attlist = + db.constraint.role.attribute? + & db.common.attributes + & db.common.req.linking.attributes + db.constraint = + + ## A constraint in an EBNF production + element constraint { db.constraint.attlist, empty } +} +div { + db.productionrecap.role.attribute = attribute role { text } + db.productionrecap.attlist = + db.productionrecap.role.attribute? + & db.common.attributes + & db.common.req.linking.attributes + db.productionrecap = + + ## A cross-reference to an EBNF production + element productionrecap { db.productionrecap.attlist, empty } +} +div { + db.constraintdef.role.attribute = attribute role { text } + db.constraintdef.attlist = + db.constraintdef.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.constraintdef.info = db._info.title.only + db.constraintdef = + + ## The definition of a constraint in an EBNF production + element constraintdef { + db.constraintdef.attlist, db.constraintdef.info, db.all.blocks+ + } +} +db.char.attribute = + + ## Specifies the alignment character when align + ## is set to char + ## . + attribute char { text } +db.charoff.attribute = + + ## Specifies the percentage of the column's total width that should appear to the left of the first occurance of the character identified in char + ## when align + ## is set to char + ## . + attribute charoff { + xsd:decimal { minExclusive = "0" maxExclusive = "100" } + } +db.frame.attribute = + + ## Specifies how the table is to be framed. Note that there is no way to obtain a border on only the starting edge (left, in left-to-right writing systems) of the table. + attribute frame { + + ## Frame all four sides of the table. In some environments with limited control over table border formatting, such as HTML, this may imply additional borders. + "all" + | + ## Frame only the bottom of the table. + "bottom" + | + ## Place no border on the table. In some environments with limited control over table border formatting, such as HTML, this may disable other borders as well. + "none" + | + ## Frame the left and right sides of the table. + "sides" + | + ## Frame the top of the table. + "top" + | + ## Frame the top and bottom of the table. + "topbot" + } +db.colsep.attribute = + + ## Specifies the presence or absence of the column separator + attribute colsep { + + ## No column separator rule. + "0" + | + ## Provide a column separator rule on the right + "1" + } +db.rowsep.attribute = + + ## Specifies the presence or absence of the row separator + attribute rowsep { + + ## No row separator rule. + "0" + | + ## Provide a row separator rule below + "1" + } +db.orient.attribute = + + ## Specifies the orientation of the table + attribute orient { + + ## 90 degrees counter-clockwise from the rest of the text flow. + "land" + | + ## The same orientation as the rest of the text flow. + "port" + } +db.tabstyle.attribute = + + ## Specifies the table style + attribute tabstyle { text } +db.rowheader.attribute = + + ## Indicates whether or not the entries in the first column should be considered row headers + attribute rowheader { + + ## Indicates that entries in the first column of the table are functionally row headers (analogous to the way that a thead provides column headers). + "firstcol" + | + ## Indicates that entries in the first column have no special significance with respect to column headers. + "norowheader" + } +db.align.attribute = + + ## Specifies the horizontal alignment of text in an entry. + attribute align { + + ## Centered. + "center" + | + ## Aligned on a particular character. + "char" + | + ## Left and right justified. + "justify" + | + ## Left justified. + "left" + | + ## Right justified. + "right" + } +db.valign.attribute = + + ## Specifies the vertical alignment of text in an entry. + attribute valign { + + ## Aligned on the bottom of the entry. + "bottom" + | + ## Aligned in the middle. + "middle" + | + ## Aligned at the top of the entry. + "top" + } +db.specify-col-by-colname.attributes = + + ## Specifies a column specification by name. + attribute colname { text } +db.specify-col-by-namest.attributes = + + ## Specifies a starting column by name. + attribute namest { text } +db.specify-span-by-spanspec.attributes = + + ## Specifies a span by name. + attribute spanname { text } +db.specify-span-directly.attributes = + + ## Specifies a starting column by name. + attribute namest { text } + & + ## Specifies an ending column by name. + attribute nameend { text } +db.column-spec.attributes = + db.specify-col-by-colname.attributes + | db.specify-col-by-namest.attributes + | db.specify-span-by-spanspec.attributes + | db.specify-span-directly.attributes +db.colname.attribute = + + ## Provides a name for a column specification. + attribute colname { text } +db.spanname.attribute = + + ## Provides a name for a span specification. + attribute spanname { text } +div { + db.tgroup.role.attribute = attribute role { text } + db.tgroup.tgroupstyle.attribute = + + ## Additional style information for downstream processing; typically the name of a style. + attribute tgroupstyle { text } + db.tgroup.cols.attribute = + + ## The number of columns in the table. Must be an integer greater than zero. + attribute cols { xsd:positiveInteger } + db.tgroup.attlist = + db.tgroup.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.char.attribute? + & db.charoff.attribute? + & db.tgroup.tgroupstyle.attribute? + & db.tgroup.cols.attribute + & db.colsep.attribute? + & db.rowsep.attribute? + & db.align.attribute? + db.tgroup = + + ## A wrapper for the main content of a table, or part of a table + element tgroup { + db.tgroup.attlist, + db.colspec*, + db.spanspec*, + db.cals.thead?, + db.cals.tfoot?, + db.cals.tbody + } +} +div { + db.colspec.role.attribute = attribute role { text } + db.colspec.colnum.attribute = + + ## The number of the column to which this specification applies. Must be greater than any preceding column number. Defaults to one more than the number of the preceding column, if there is one, or one. + attribute colnum { xsd:positiveInteger } + db.colspec.colwidth.attribute = + + ## Specifies the width of the column. + attribute colwidth { text } + db.colspec.attlist = + db.colspec.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.colspec.colnum.attribute? + & db.char.attribute? + & db.colsep.attribute? + & db.colspec.colwidth.attribute? + & db.charoff.attribute? + & db.colname.attribute? + & db.rowsep.attribute? + & db.align.attribute? + db.colspec = + + ## Specifications for a column in a table + element colspec { db.colspec.attlist, empty } +} +div { + db.spanspec.role.attribute = attribute role { text } + db.spanspec.namest.attribute = + + ## Specifies a starting column by name. + attribute namest { text } + db.spanspec.nameend.attribute = + + ## Specifies an ending column by name. + attribute nameend { text } + db.spanspec.attlist = + db.spanspec.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.spanname.attribute + & db.spanspec.namest.attribute + & db.spanspec.nameend.attribute + & db.char.attribute? + & db.colsep.attribute? + & db.charoff.attribute? + & db.rowsep.attribute? + & db.align.attribute? + db.spanspec = + + ## Formatting information for a spanned column in a table + element spanspec { db.spanspec.attlist, empty } +} +div { + db.cals.thead.role.attribute = attribute role { text } + db.cals.thead.attlist = + db.cals.thead.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.valign.attribute? + db.cals.thead = + + ## A table header consisting of one or more rows + element thead { db.cals.thead.attlist, db.colspec*, db.row+ } +} +div { + db.cals.tfoot.role.attribute = attribute role { text } + db.cals.tfoot.attlist = + db.cals.tfoot.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.valign.attribute? + db.cals.tfoot = + + ## A table footer consisting of one or more rows + element tfoot { db.cals.tfoot.attlist, db.colspec*, db.row+ } +} +div { + db.cals.tbody.role.attribute = attribute role { text } + db.cals.tbody.attlist = + db.cals.tbody.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.valign.attribute? + db.cals.tbody = + + ## A wrapper for the rows of a table or informal table + element tbody { db.cals.tbody.attlist, db.row+ } +} +div { + db.row.role.attribute = attribute role { text } + db.row.attlist = + db.row.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.rowsep.attribute? + & db.valign.attribute? + db.row = + + ## A row in a table + element row { db.row.attlist, (db.entry | db.entrytbl)+ } +} +div { + db.entry.role.attribute = attribute role { text } + db.entry.morerows.attribute = + + ## Specifies the number of additional rows which this entry occupies. Defaults to zero. + attribute morerows { xsd:integer } + db.entry.rotate.attribute = + + ## Specifies the rotation of this entry. A value of 1 (true) rotates the cell 90 degrees counter-clockwise. A value of 0 (false) leaves the cell unrotated. + attribute rotate { + + ## Do not rotate the cell. + "0" + | + ## Rotate the cell 90 degrees counter-clockwise. + "1" + } + db.entry.attlist = + db.entry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.valign.attribute? + & db.char.attribute? + & db.colsep.attribute? + & db.charoff.attribute? + & db.entry.morerows.attribute? + & db.column-spec.attributes? + & db.rowsep.attribute? + & db.entry.rotate.attribute? + & db.align.attribute? + db.entry = + + ## A cell in a table + element entry { + db.entry.attlist, (db.all.inlines* | db.all.blocks*) + } +} +div { + db.entrytbl.role.attribute = attribute role { text } + db.entrytbl.tgroupstyle.attribute = + + ## Additional style information for downstream processing; typically the name of a style. + attribute tgroupstyle { text } + db.entrytbl.cols.attribute = + + ## The number of columns in the entry table. Must be an integer greater than zero. + attribute cols { xsd:positiveInteger } + db.entrytbl.attlist = + db.entrytbl.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.char.attribute? + & db.charoff.attribute? + & db.column-spec.attributes? + & db.entrytbl.tgroupstyle.attribute? + & db.entrytbl.cols.attribute? + & db.colsep.attribute? + & db.rowsep.attribute? + & db.align.attribute? + db.entrytbl = + + ## A subtable appearing in place of an Entry in a table + element entrytbl { + db.entrytbl.attlist, + db.colspec*, + db.spanspec*, + db.cals.entrytbl.thead?, + db.cals.entrytbl.tbody + } +} +div { + db.cals.entrytbl.thead.role.attribute = attribute role { text } + db.cals.entrytbl.thead.attlist = + db.cals.entrytbl.thead.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.valign.attribute? + db.cals.entrytbl.thead = + + ## A table header consisting of one or more rows + element thead { + db.cals.entrytbl.thead.attlist, db.colspec*, db.entrytbl.row+ + } +} +div { + db.cals.entrytbl.tbody.role.attribute = attribute role { text } + db.cals.entrytbl.tbody.attlist = + db.cals.entrytbl.tbody.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.valign.attribute? + db.cals.entrytbl.tbody = + + ## A wrapper for the rows of a table or informal table + element tbody { db.cals.entrytbl.tbody.attlist, db.entrytbl.row+ } +} +div { + db.entrytbl.row.role.attribute = attribute role { text } + db.entrytbl.row.attlist = + db.entrytbl.row.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.rowsep.attribute? + & db.valign.attribute? + db.entrytbl.row = + + ## A row in a table + element row { db.entrytbl.row.attlist, db.entry+ } +} +div { + db.cals.table.role.attribute = attribute role { text } + db.cals.table.label.attribute = db.label.attribute + db.cals.table.attlist = + db.cals.table.role.attribute? + & db.cals.table.label.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.tabstyle.attribute? + & db.floatstyle.attribute? + & db.orient.attribute? + & db.colsep.attribute? + & db.rowsep.attribute? + & db.frame.attribute? + & db.pgwide.attribute? + & + ## Indicates if the short or long title should be used in a List of Tables + attribute shortentry { + + ## Indicates that the full title should be used. + "0" + | + ## Indicates that the short short title (titleabbrev) should be used. + "1" + }? + & + ## Indicates if the table should appear in a List of Tables + attribute tocentry { + + ## Indicates that the table should not occur in the List of Tables. + "0" + | + ## Indicates that the table should appear in the List of Tables. + "1" + }? + & db.rowheader.attribute? + db.cals.table.info = db._info.title.onlyreq + db.cals.table = + + ## A formal table in a document + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:informaltable)" + "informaltable must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element table { + db.cals.table.attlist, + db.cals.table.info, + (db.alt? & db.indexing.inlines* & db.textobject*), + (db.mediaobject+ | db.tgroup+), + db.caption? + } +} +div { + db.cals.informaltable.role.attribute = attribute role { text } + db.cals.informaltable.attlist = + db.cals.informaltable.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.tabstyle.attribute? + & db.floatstyle.attribute? + & db.orient.attribute? + & db.colsep.attribute? + & db.rowsep.attribute? + & db.frame.attribute? + & db.pgwide.attribute? + & db.rowheader.attribute? + db.cals.informaltable.info = db._info.title.forbidden + db.cals.informaltable = + + ## A table without a title + element informaltable { + db.cals.informaltable.attlist, + db.cals.informaltable.info, + (db.alt? & db.indexing.inlines* & db.textobject*), + (db.mediaobject+ | db.tgroup+), + db.caption? + } +} +db.html.coreattrs = + + ## This attribute assigns a class name or set of class names to an element. Any number of elements may be assigned the same class name or names. Multiple class names must be separated by white space characters. + attribute class { text }? + & + ## This attribute specifies style information for the current element. + attribute style { text }? + & + ## This attribute offers advisory information about the element for which it is set. + attribute title { text }? +db.html.i18n = + + ## This attribute specifies the base language of an element's attribute values and text content. The default value of this attribute is unknown. + attribute lang { text }? +db.html.events = + + ## Occurs when the pointing device button is clicked over an element. + attribute onclick { text }? + & + ## Occurs when the pointing device button is double clicked over an element. + attribute ondblclick { text }? + & + ## Occurs when the pointing device button is pressed over an element. + attribute onmousedown { text }? + & + ## Occurs when the pointing device button is released over an element. + attribute onmouseup { text }? + & + ## Occurs when the pointing device is moved onto an element. + attribute onmouseover { text }? + & + ## Occurs when the pointing device is moved while it is over an element. + attribute onmousemove { text }? + & + ## Occurs when the pointing device is moved away from an element. + attribute onmouseout { text }? + & + ## Occurs when a key is pressed and released over an element. + attribute onkeypress { text }? + & + ## Occurs when a key is pressed down over an element. + attribute onkeydown { text }? + & + ## Occurs when a key is released over an element. + attribute onkeyup { text }? +db.html.attrs = + db.common.attributes + & db.html.coreattrs + & db.html.i18n + & db.html.events +db.html.cellhalign = + + ## Specifies the alignment of data and the justification of text in a cell. + attribute align { + + ## Left-flush data/Left-justify text. This is the default value for table data. + "left" + | + ## Center data/Center-justify text. This is the default value for table headers. + "center" + | + ## Right-flush data/Right-justify text. + "right" + | + ## Double-justify text. + "justify" + | + ## Align text around a specific character. If a user agent doesn't support character alignment, behavior in the presence of this value is unspecified. + "char" + }? + & + ## This attribute specifies a single character within a text fragment to act as an axis for alignment. The default value for this attribute is the decimal point character for the current language as set by the lang attribute (e.g., the period in English and the comma in French). User agents are not required to support this attribute. + attribute char { text }? + & + ## When present, this attribute specifies the offset to the first occurrence of the alignment character on each line. If a line doesn't include the alignment character, it should be horizontally shifted to end at the alignment position. When charoff is used to set the offset of an alignment character, the direction of offset is determined by the current text direction (set by the dir attribute). In left-to-right texts (the default), offset is from the left margin. In right-to-left texts, offset is from the right margin. User agents are not required to support this attribute. + attribute charoff { + xsd:integer + | xsd:string { pattern = "[0-9]+%" } + }? +db.html.cellvalign = + + ## Specifies the vertical position of data within a cell. + attribute valign { + + ## Cell data is flush with the top of the cell. + "top" + | + ## Cell data is centered vertically within the cell. This is the default value. + "middle" + | + ## Cell data is flush with the bottom of the cell. + "bottom" + | + ## All cells in the same row as a cell whose valign attribute has this value should have their textual data positioned so that the first text line occurs on a baseline common to all cells in the row. This constraint does not apply to subsequent text lines in these cells. + "baseline" + }? +db.html.table.attributes = + + ## Provides a summary of the table's purpose and structure for user agents rendering to non-visual media such as speech and Braille. + attribute summary { text }? + & + ## Specifies the desired width of the entire table and is intended for visual user agents. When the value is a percentage value, the value is relative to the user agent's available horizontal space. In the absence of any width specification, table width is determined by the user agent. + attribute width { + xsd:integer + | xsd:string { pattern = "[0-9]+%" } + }? + & + ## Specifies the width (in pixels only) of the frame around a table. + attribute border { xsd:nonNegativeInteger }? + & + ## Specifies which sides of the frame surrounding a table will be visible. + attribute frame { + + ## No sides. This is the default value. + "void" + | + ## The top side only. + "above" + | + ## The bottom side only. + "below" + | + ## The top and bottom sides only. + "hsides" + | + ## The left-hand side only. + "lhs" + | + ## The right-hand side only. + "rhs" + | + ## The right and left sides only. + "vsides" + | + ## All four sides. + "box" + | + ## All four sides. + "border" + }? + & + ## Specifies which rules will appear between cells within a table. The rendering of rules is user agent dependent. + attribute rules { + + ## No rules. This is the default value. + "none" + | + ## Rules will appear between row groups (see thead, tfoot, and tbody) and column groups (see colgroup and col) only. + "groups" + | + ## Rules will appear between rows only. + "rows" + | + ## Rules will appear between columns only. + "cols" + | + ## Rules will appear between all rows and columns. + "all" + }? + & + ## Specifies how much space the user agent should leave between the left side of the table and the left-hand side of the leftmost column, the top of the table and the top side of the topmost row, and so on for the right and bottom of the table. The attribute also specifies the amount of space to leave between cells. + attribute cellspacing { + xsd:integer + | xsd:string { pattern = "[0-9]+%" } + }? + & + ## Specifies the amount of space between the border of the cell and its contents. If the value of this attribute is a pixel length, all four margins should be this distance from the contents. If the value of the attribute is a percentage length, the top and bottom margins should be equally separated from the content based on a percentage of the available vertical space, and the left and right margins should be equally separated from the content based on a percentage of the available horizontal space. + attribute cellpadding { + xsd:integer + | xsd:string { pattern = "[0-9]+%" } + }? +db.html.tablecell.attributes = + + ## Provides an abbreviated form of the cell's content and may be rendered by user agents when appropriate in place of the cell's content. Abbreviated names should be short since user agents may render them repeatedly. For instance, speech synthesizers may render the abbreviated headers relating to a particular cell before rendering that cell's content. + attribute abbr { text }? + & + ## This attribute may be used to place a cell into conceptual categories that can be considered to form axes in an n-dimensional space. User agents may give users access to these categories (e.g., the user may query the user agent for all cells that belong to certain categories, the user agent may present a table in the form of a table of contents, etc.). Please consult an HTML reference for more details. + attribute axis { text }? + & + ## Specifies the list of header cells that provide header information for the current data cell. The value of this attribute is a space-separated list of cell names; those cells must be named by setting their id attribute. Authors generally use the headers attribute to help non-visual user agents render header information about data cells (e.g., header information is spoken prior to the cell data), but the attribute may also be used in conjunction with style sheets. + attribute headers { text }? + & + ## Specifies the set of data cells for which the current header cell provides header information. This attribute may be used in place of the headers attribute, particularly for simple tables. + attribute scope { + + ## The current cell provides header information for the rest of the row that contains it + "row" + | + ## The current cell provides header information for the rest of the column that contains it. + "col" + | + ## The header cell provides header information for the rest of the row group that contains it. + "rowgroup" + | + ## The header cell provides header information for the rest of the column group that contains it. + "colgroup" + }? + & + ## Specifies the number of rows spanned by the current cell. The default value of this attribute is one (1 + ## ). The value zero (0 + ## ) means that the cell spans all rows from the current row to the last row of the table section (thead + ## , tbody + ## , or tfoot + ## ) in which the cell is defined. + attribute rowspan { xsd:nonNegativeInteger }? + & + ## Specifies the number of columns spanned by the current cell. The default value of this attribute is one (1 + ## ). The value zero (0 + ## ) means that the cell spans all columns from the current column to the last column of the column group (colgroup + ## ) in which the cell is defined. + attribute colspan { xsd:nonNegativeInteger }? +db.html.table.info = db._info.title.forbidden +db.html.table.model = + db.html.table.info?, + db.html.caption, + (db.html.col* | db.html.colgroup*), + db.html.thead?, + db.html.tfoot?, + (db.html.tbody+ | db.html.tr+) +db.html.informaltable.info = db._info.title.forbidden +db.html.informaltable.model = + db.html.informaltable.info?, + (db.html.col* | db.html.colgroup*), + db.html.thead?, + db.html.tfoot?, + (db.html.tbody+ | db.html.tr+) +div { + db.html.table.role.attribute = attribute role { text } + db.html.table.label.attribute = db.label.attribute + db.html.table.attlist = + db.html.attrs + & db.html.table.attributes + & db.html.table.role.attribute? + & db.html.table.label.attribute? + & db.orient.attribute? + & db.pgwide.attribute? + & db.tabstyle.attribute? + & db.floatstyle.attribute? + db.html.table = + + ## A formal (captioned) HTML table in a document + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:informaltable)" + "informaltable must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element table { db.html.table.attlist, db.html.table.model } +} +div { + db.html.informaltable.attlist = + db.html.attrs & db.html.table.attributes + db.html.informaltable = + + ## An HTML table without a title + element informaltable { + db.html.informaltable.attlist, db.html.informaltable.model + } +} +div { + db.html.caption.attlist = db.html.attrs + db.html.caption = + + ## An HTML table caption + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:table)" + "table must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:sidebar)" + "sidebar must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:task)" + "task must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element caption { db.html.caption.attlist, db.all.inlines* } +} +div { + db.html.col.attlist = + db.html.attrs + & + ## This attribute, whose value must be an integer > 0, specifies the number of columns spanned + ## by the col + ## element; the col + ## element shares its attributes with all the columns it spans. The default value for this attribute is 1 (i.e., a single column). If the span attribute is set to N > 1, the current col + ## element shares its attributes with the next N-1 columns. + attribute span { xsd:nonNegativeInteger }? + & + ## Specifies a default width for each column spanned by the current col + ## element. It has the same meaning as the width + ## attribute for the colgroup + ## element and overrides it. + attribute width { text }? + & db.html.cellhalign + & db.html.cellvalign + db.html.col = + + ## Specifications for a column in an HTML table + element col { db.html.col.attlist, empty } +} +div { + db.html.colgroup.attlist = + db.html.attrs + & + ## This attribute, which must be an integer > 0, specifies the number of columns in a column group. In the absence of a span attribute, each colgroup + ## defines a column group containing one column. If the span attribute is set to N > 0, the current colgroup + ## element defines a column group containing N columns. User agents must ignore this attribute if the colgroup + ## element contains one or more col + ## elements. + attribute span { xsd:nonNegativeInteger }? + & + ## This attribute specifies a default width for each column in the current column group. In addition to the standard pixel, percentage, and relative values, this attribute allows the special form 0* + ## (zero asterisk) which means that the width of the each column in the group should be the minimum width necessary to hold the column's contents. This implies that a column's entire contents must be known before its width may be correctly computed. Authors should be aware that specifying 0* + ## will prevent visual user agents from rendering a table incrementally. This attribute is overridden for any column in the column group whose width is specified via a col + ## element. + attribute width { text }? + & db.html.cellhalign + & db.html.cellvalign + db.html.colgroup = + + ## A group of columns in an HTML table + element colgroup { db.html.colgroup.attlist, db.html.col* } +} +div { + db.html.thead.attlist = + db.html.attrs & db.html.cellhalign & db.html.cellvalign + db.html.thead = + + ## A table header consisting of one or more rows in an HTML table + element thead { db.html.thead.attlist, db.html.tr+ } +} +div { + db.html.tfoot.attlist = + db.html.attrs & db.html.cellhalign & db.html.cellvalign + db.html.tfoot = + + ## A table footer consisting of one or more rows in an HTML table + element tfoot { db.html.tfoot.attlist, db.html.tr+ } +} +div { + db.html.tbody.attlist = + db.html.attrs & db.html.cellhalign & db.html.cellvalign + db.html.tbody = + + ## A wrapper for the rows of an HTML table or informal HTML table + element tbody { db.html.tbody.attlist, db.html.tr+ } +} +div { + db.html.tr.attlist = + db.html.attrs & db.html.cellhalign & db.html.cellvalign + db.html.tr = + + ## A row in an HTML table + element tr { db.html.tr.attlist, (db.html.th | db.html.td)+ } +} +div { + db.html.th.attlist = + db.html.attrs + & db.html.tablecell.attributes + & db.html.cellhalign + & db.html.cellvalign + db.html.th = + + ## A table header entry in an HTML table + element th { + db.html.th.attlist, (db.all.inlines* | db.all.blocks*) + } +} +div { + db.html.td.attlist = + db.html.attrs + & db.html.tablecell.attributes + & db.html.cellhalign + & db.html.cellvalign + db.html.td = + + ## A table entry in an HTML table + element td { + db.html.td.attlist, (db.all.inlines* | db.all.blocks*) + } +} +div { + db.msgset.role.attribute = attribute role { text } + db.msgset.attlist = + db.msgset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgset.info = db._info.title.only + db.msgset = + + ## A detailed set of messages, usually error messages + element msgset { + db.msgset.attlist, + db.msgset.info, + (db.msgentry+ | db.simplemsgentry+) + } +} +div { + db.msgentry.role.attribute = attribute role { text } + db.msgentry.attlist = + db.msgentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgentry = + + ## A wrapper for an entry in a message set + element msgentry { + db.msgentry.attlist, db.msg+, db.msginfo?, db.msgexplan* + } +} +div { + db.simplemsgentry.role.attribute = attribute role { text } + db.simplemsgentry.msgaud.attribute = + + ## The audience to which the message relevant + attribute msgaud { text } + db.simplemsgentry.msgorig.attribute = + + ## The origin of the message + attribute msgorig { text } + db.simplemsgentry.msglevel.attribute = + + ## The level of importance or severity of a message + attribute msglevel { text } + db.simplemsgentry.attlist = + db.simplemsgentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.simplemsgentry.msgaud.attribute? + & db.simplemsgentry.msgorig.attribute? + & db.simplemsgentry.msglevel.attribute? + db.simplemsgentry = + + ## A wrapper for a simpler entry in a message set + element simplemsgentry { + db.simplemsgentry.attlist, db.msgtext, db.msgexplan+ + } +} +div { + db.msg.role.attribute = attribute role { text } + db.msg.attlist = + db.msg.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msg.info = db._info.title.only + db.msg = + + ## A message in a message set + element msg { + db.msg.attlist, db.msg.info, db.msgmain, (db.msgsub | db.msgrel)* + } +} +div { + db.msgmain.role.attribute = attribute role { text } + db.msgmain.attlist = + db.msgmain.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgmain.info = db._info.title.only + db.msgmain = + + ## The primary component of a message in a message set + element msgmain { db.msgmain.attlist, db.msgmain.info, db.msgtext } +} +div { + db.msgsub.role.attribute = attribute role { text } + db.msgsub.attlist = + db.msgsub.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgsub.info = db._info.title.only + db.msgsub = + + ## A subcomponent of a message in a message set + element msgsub { db.msgsub.attlist, db.msgsub.info, db.msgtext } +} +div { + db.msgrel.role.attribute = attribute role { text } + db.msgrel.attlist = + db.msgrel.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgrel.info = db._info.title.only + db.msgrel = + + ## A related component of a message in a message set + element msgrel { db.msgrel.attlist, db.msgrel.info, db.msgtext } +} +div { + db.msgtext.role.attribute = attribute role { text } + db.msgtext.attlist = + db.msgtext.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgtext = + + ## The actual text of a message component in a message set + element msgtext { db.msgtext.attlist, db.all.blocks+ } +} +div { + db.msginfo.role.attribute = attribute role { text } + db.msginfo.attlist = + db.msginfo.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msginfo = + + ## Information about a message in a message set + element msginfo { + db.msginfo.attlist, (db.msglevel | db.msgorig | db.msgaud)* + } +} +div { + db.msglevel.role.attribute = attribute role { text } + db.msglevel.attlist = + db.msglevel.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msglevel = + + ## The level of importance or severity of a message in a message set + element msglevel { db.msglevel.attlist, db._text } +} +div { + db.msgorig.role.attribute = attribute role { text } + db.msgorig.attlist = + db.msgorig.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgorig = + + ## The origin of a message in a message set + element msgorig { db.msgorig.attlist, db._text } +} +div { + db.msgaud.role.attribute = attribute role { text } + db.msgaud.attlist = + db.msgaud.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgaud = + + ## The audience to which a message in a message set is relevant + element msgaud { db.msgaud.attlist, db._text } +} +div { + db.msgexplan.role.attribute = attribute role { text } + db.msgexplan.attlist = + db.msgexplan.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgexplan.info = db._info.title.only + db.msgexplan = + + ## Explanatory material relating to a message in a message set + element msgexplan { + db.msgexplan.attlist, db.msgexplan.info, db.all.blocks+ + } +} +div { + db.qandaset.role.attribute = attribute role { text } + db.qandaset.defaultlabel.enumeration = + + ## No labels + "none" + | + ## Numeric labels + "number" + | + ## "Q:" and "A:" labels + "qanda" + db.qandaset.defaultlabel.attribute = + + ## Specifies the default labelling + attribute defaultlabel { db.qandaset.defaultlabel.enumeration } + db.qandaset.attlist = + db.qandaset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.qandaset.defaultlabel.attribute? + db.qandaset.info = db._info.title.only + db.qandaset = + + ## A question-and-answer set + element qandaset { + db.qandaset.attlist, + db.qandaset.info, + db.all.blocks*, + (db.qandadiv+ | db.qandaentry+) + } +} +div { + db.qandadiv.role.attribute = attribute role { text } + db.qandadiv.attlist = + db.qandadiv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.qandadiv.info = db._info.title.only + db.qandadiv = + + ## A titled division in a QandASet + element qandadiv { + db.qandadiv.attlist, + db.qandadiv.info, + db.all.blocks*, + (db.qandadiv+ | db.qandaentry+) + } +} +div { + db.qandaentry.role.attribute = attribute role { text } + db.qandaentry.attlist = + db.qandaentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.qandaentry.info = db._info.title.only + db.qandaentry = + + ## A question/answer set within a QandASet + element qandaentry { + db.qandaentry.attlist, db.qandaentry.info, db.question, db.answer* + } +} +div { + db.question.role.attribute = attribute role { text } + db.question.attlist = + db.question.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.question = + + ## A question in a QandASet + element question { db.question.attlist, db.label?, db.all.blocks+ } +} +div { + db.answer.role.attribute = attribute role { text } + db.answer.attlist = + db.answer.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.answer = + + ## An answer to a question posed in a QandASet + element answer { db.answer.attlist, db.label?, db.all.blocks+ } +} +div { + db.label.role.attribute = attribute role { text } + db.label.attlist = + db.label.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.label = + + ## A label on a Question or Answer + element label { db.label.attlist, db._text } +} +db.math.inlines = db.inlineequation +db.equation.content = (db.mediaobject+ | db.mathphrase+) | db._any.mml+ +db.inlineequation.content = db.inlinemediaobject+ | db.mathphrase+ +div { + db.equation.role.attribute = attribute role { text } + db.equation.label.attribute = db.label.attribute + db.equation.attlist = + db.equation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.equation.label.attribute? + & db.pgwide.attribute? + & db.floatstyle.attribute? + db.equation.info = db._info.title.only + db.equation = + + ## A displayed mathematical equation + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:table)" + "table must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element equation { + db.equation.attlist, + db.equation.info, + db.alt?, + db.equation.content, + db.caption? + } +} +div { + db.informalequation.role.attribute = attribute role { text } + db.informalequation.attlist = + db.informalequation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.informalequation.info = db._info.title.forbidden + db.informalequation = + + ## A displayed mathematical equation without a title + element informalequation { + db.informalequation.attlist, + db.informalequation.info, + db.alt?, + db.equation.content, + db.caption? + } +} +div { + db.inlineequation.role.attribute = attribute role { text } + db.inlineequation.attlist = + db.inlineequation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.inlineequation = + + ## A mathematical equation or expression occurring inline + element inlineequation { + db.inlineequation.attlist, db.alt?, db.inlineequation.content + } +} +div { + db.mathphrase.role.attribute = attribute role { text } + db.mathphrase.attlist = + db.mathphrase.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.mathphrase = + + ## A mathematical phrase, an expression that can be represented with ordinary text and a small amount of markup + element mathphrase { + db.mathphrase.attlist, + (db._text | db.ubiq.inlines | db._emphasis)* + } +} +div { + db.imagedata.mathml.role.attribute = attribute role { text } + db.imagedata.mathml.attlist = + db.imagedata.mathml.role.attribute? + & db.common.attributes + & + ## Specifies that the format of the data is MathML + attribute format { + + ## Specifies MathML. + "mathml" + }? + & db.imagedata.align.attribute? + & db.imagedata.valign.attribute? + & db.imagedata.width.attribute? + & db.imagedata.contentwidth.attribute? + & db.imagedata.scalefit.attribute? + & db.imagedata.scale.attribute? + & db.imagedata.depth.attribute? + & db.imagedata.contentdepth.attribute? + db.imagedata.mathml.info = db._info.title.forbidden + db.imagedata.mathml = + + ## A MathML expression in a media object + element imagedata { + db.imagedata.mathml.attlist, + db.imagedata.mathml.info, + db._any.mml+ + } +} +div { + db._any.mml = + + ## Any element from the MathML namespace + element mml:* { (db._any.attribute | text | db._any)* } +} +div { + db.imagedata.svg.role.attribute = attribute role { text } + db.imagedata.svg.attlist = + db.imagedata.svg.role.attribute? + & db.common.attributes + & + ## Specifies that the format of the data is SVG + attribute format { + + ## Specifies SVG. + "svg" + }? + & db.imagedata.align.attribute? + & db.imagedata.valign.attribute? + & db.imagedata.width.attribute? + & db.imagedata.contentwidth.attribute? + & db.imagedata.scalefit.attribute? + & db.imagedata.scale.attribute? + & db.imagedata.depth.attribute? + & db.imagedata.contentdepth.attribute? + db.imagedata.svg.info = db._info.title.forbidden + db.imagedata.svg = + + ## An SVG drawing in a media object + element imagedata { + db.imagedata.svg.attlist, db.imagedata.svg.info, db._any.svg+ + } +} +div { + db._any.svg = + + ## Any element from the SVG namespace + element svg:* { (db._any.attribute | text | db._any)* } +} diff --git a/plugins/relaxng/testData/highlighting/rnc/fo/basic_properties.rnc b/plugins/relaxng/testData/highlighting/rnc/fo/basic_properties.rnc new file mode 100644 index 000000000000..ed2ce425bda6 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/fo/basic_properties.rnc @@ -0,0 +1,648 @@ +# ========================================================= +# +# (c) 2004, RenderX +# +# Author: Alexander Peshkov +# +# Permission is granted to use this document, copy and +# modify free of charge, provided that every derived work +# bear a reference to the present document. +# +# This document contains a computer program written in +# XSL Transformations Language. It is published with no +# warranty of any kind about its usability, as a mere +# example of XSL technology. RenderX shall not be +# considered liable for any damage or loss of data caused +# by use of this program. +# +# ========================================================= + +namespace local = "" +default namespace fo = "http://www.w3.org/1999/XSL/Format" +namespace rx = "http://www.renderx.com/XSL/Extensions" + +include "datatype.rnc" + +# =============================================================== +# Common properties content models used by several attributes +# =============================================================== +border-style.attr-content = + "none" + | "hidden" + | "dotted" + | "dashed" + | "solid" + | "double" + | "groove" + | "ridge" + | "inset" + | "outset" + | "inherit" + +orientation.attr-content = + "0" + | "90" + | "180" + | "270" + | "-90" + | "-180" + | "-270" + | "0deg" + | "90deg" + | "180deg" + | "270deg" + | "-90deg" + | "-180deg" + | "-270deg" + | "inherit" + +keep.attr-content = "auto" | "always" | integer.datatype + +# =============================================================== +# Definitions of all the attributes (properties) used in XSL FO +# includeing those from RX extensions +# (definitions of attributes bearing 'rx' namespace named as rx-..., +# but sorted according to the actual attribute name) +# =============================================================== +absolute-position.attr = attribute absolute-position { + "absolute" | "fixed" + } +#MEMO: We forced to separate this property from actual 'absolute-position' +container-position.attr = attribute absolute-position { + "auto" | "inherit" | expr.datatype + } + +active-state.attr = attribute active-state { + "link" | "visited" | "active" | "hover" | "focus" | expr.datatype + } +alignment-adjust.attr = attribute alignment-adjust { text | expr.datatype } +alignment-baseline.attr = attribute alignment-baseline { + "auto" + | "baseline" + | "before-edge" + | "text-before-edge" + | "middle" + | "central" + | "after-edge" + | "text-after-edge" + | "top" + | "text-top" + | "bottom" + | "text-bottom" + | "ideographic" + | "alphabetic" + | "hanging" + | "mathematical" + | "inherit" + | expr.datatype + } +auto-restore.attr = attribute auto-restore { "true" | "false" | expr.datatype } +azimuth.attr = attribute azimuth { text | expr.datatype } +background.attr = attribute background { text | expr.datatype } +background-attachment.attr = attribute background-attachment { "scroll" | "fixed" | "inherit" | expr.datatype } +background-color.attr = attribute background-color { text | expr.datatype } +background-image.attr = attribute background-image { text | expr.datatype } +background-position.attr = attribute background-position { text | expr.datatype } +background-position-horizontal.attr = attribute background-position-horizontal { text | expr.datatype } +background-position-vertical.attr = attribute background-position-vertical { text | expr.datatype } +background-repeat.attr = attribute background-repeat { + "repeat" | "repeat-x" | "repeat-y" | "no-repeat" | "inherit" | expr.datatype + } +#RenderX extension attributes +rx-background-content-type.attr = attribute rx:background-content-type { text | expr.datatype } +rx-background-content-height.attr = attribute rx:background-content-height { text | expr.datatype } +rx-background-content-width.attr = attribute rx:background-content-width { text | expr.datatype } +rx-background-scaling.attr = attribute rx:background-scaling { "uniform" | "non-uniform" | expr.datatype } + +baseline-shift.attr = attribute baseline-shift { text | expr.datatype } +blank-or-not-blank.attr = attribute blank-or-not-blank { + "blank" | "not-blank" | "any" | "inherit" | expr.datatype + } +block-progression-dimension.attr = attribute block-progression-dimension { text | expr.datatype } +block-progression-dimension.maximum.attr = attribute block-progression-dimension.maximum { text | expr.datatype } +block-progression-dimension.minimum.attr = attribute block-progression-dimension.minimum { text | expr.datatype } +block-progression-dimension.optimum.attr = attribute block-progression-dimension.optimum { text | expr.datatype } +border.attr = attribute border { text | expr.datatype } +border-after-color.attr = attribute border-after-color { text | expr.datatype } +border-after-precedence.attr = attribute border-after-precedence { text | expr.datatype } +border-after-style.attr = attribute border-after-style { border-style.attr-content | expr.datatype } +border-after-width.attr = attribute border-after-width { text | expr.datatype } +border-after-width.conditionality.attr = attribute border-after-width.conditionality { "discard" | "retain" | expr.datatype } +border-after-width.length.attr = attribute border-after-width.length { text | expr.datatype } +border-before-color.attr = attribute border-before-color { text | expr.datatype } +border-before-precedence.attr = attribute border-before-precedence { text | expr.datatype } +border-before-style.attr = attribute border-before-style { border-style.attr-content | expr.datatype } +border-before-width.attr = attribute border-before-width { text | expr.datatype } +border-before-width.conditionality.attr = attribute border-before-width.conditionality { + "discard" | "retain" | expr.datatype + } +border-before-width.length.attr = attribute border-before-width.length { text | expr.datatype } +border-bottom.attr = attribute border-bottom { text | expr.datatype } +border-bottom-color.attr = attribute border-bottom-color { text | expr.datatype } +border-bottom-style.attr = attribute border-bottom-style { border-style.attr-content | expr.datatype } +border-bottom-width.attr = attribute border-bottom-width { text | expr.datatype } +border-bottom-width.conditionality.attr = attribute border-bottom-width.conditionality { + "discard" | "retain" | expr.datatype + } +border-bottom-width.length.attr = attribute border-bottom-width.length { text | expr.datatype } +border-collapse.attr = attribute border-collapse { + "collapse" | "collapse-with-precedence" | "separate" | "inherit" | expr.datatype + } +border-color.attr = attribute border-color { text | expr.datatype } +border-end-color.attr = attribute border-end-color { text | expr.datatype } +border-end-precedence.attr = attribute border-end-precedence { text | expr.datatype } +border-end-style.attr = attribute border-end-style { border-style.attr-content | expr.datatype } +border-end-width.attr = attribute border-end-width { text | expr.datatype } +border-end-width.conditionality.attr = attribute border-end-width.conditionality { "discard" | "retain" | expr.datatype } +border-end-width.length.attr = attribute border-end-width.length { text | expr.datatype } +border-left.attr = attribute border-left { text | expr.datatype } +border-left-color.attr = attribute border-left-color { text | expr.datatype } +border-left-style.attr = attribute border-left-style { border-style.attr-content | expr.datatype } +border-left-width.attr = attribute border-left-width { text | expr.datatype } +border-left-width.conditionality.attr = attribute border-left-width.conditionality { "discard" | "retain" | expr.datatype } +border-left-width.length.attr = attribute border-left-width.length { text | expr.datatype } +border-right.attr = attribute border-right { text | expr.datatype } +border-right-color.attr = attribute border-right-color { text | expr.datatype } +border-right-style.attr = attribute border-right-style { border-style.attr-content | expr.datatype } +border-right-width.attr = attribute border-right-width { text | expr.datatype } +border-right-width.conditionality.attr = attribute border-right-width.conditionality { "discard" | "retain" | expr.datatype } +border-right-width.length.attr = attribute border-right-width.length { text | expr.datatype } +border-separation.attr = attribute border-separation { text | expr.datatype } +border-separation.block-progression-direction.attr = attribute border-separation.block-progression-direction { text | expr.datatype } +border-separation.inline-progression-direction.attr = attribute border-separation.inline-progression-direction { text | expr.datatype } +border-spacing.attr = attribute border-spacing { text | expr.datatype } +border-start-color.attr = attribute border-start-color { text | expr.datatype } +border-start-precedence.attr = attribute border-start-precedence { text | expr.datatype } +border-start-style.attr = attribute border-start-style { border-style.attr-content | expr.datatype } +border-start-width.attr = attribute border-start-width { text | expr.datatype } +border-start-width.conditionality.attr = attribute border-start-width.conditionality { "discard" | "retain" | expr.datatype } +border-start-width.length.attr = attribute border-start-width.length { text | expr.datatype } +border-style.attr = attribute border-style { text | expr.datatype } +border-top.attr = attribute border-top { text | expr.datatype } +border-top-color.attr = attribute border-top-color { text | expr.datatype } +border-top-style.attr = attribute border-top-style { border-style.attr-content | expr.datatype } +border-top-width.attr = attribute border-top-width { text | expr.datatype } +border-top-width.conditionality.attr = attribute border-top-width.conditionality { "discard" | "retain" | expr.datatype } +border-top-width.length.attr = attribute border-top-width.length { text | expr.datatype } +border-width.attr = attribute border-width { text | expr.datatype } +bottom.attr = attribute bottom { text | expr.datatype } +break-after.attr = attribute break-after { + "auto" | "column" | "page" | "even-page" | "odd-page" | "inherit" | expr.datatype + } +break-before.attr = attribute break-before { + "auto" | "column" | "page" | "even-page" | "odd-page" | "inherit" | expr.datatype + } +caption-side.attr = attribute caption-side { + "before" + | "after" + | "start" + | "end" + | "top" + | "bottom" + | "left" + | "right" + | "inherit" + | expr.datatype + } +case-name.attr = attribute case-name { text | expr.datatype } +case-title.attr = attribute case-title { text | expr.datatype } +character.attr = attribute character { text } +clear.attr = attribute clear { + "start" | "end" | "left" | "right" | "both" | "none" | "inherit" | expr.datatype + } +clip.attr = attribute clip { shape.datatype | "auto" | "inherit" | expr.datatype } +collapse-subtree.attr = attribute collapse-subtree { "true" | "false" | expr.datatype } +color.attr = attribute color { text | expr.datatype } +color-profile-name.attr = attribute color-profile-name { text } +column-count.attr = attribute column-count { text | expr.datatype } +column-gap.attr = attribute column-gap { text | expr.datatype } +column-number.attr = attribute column-number { text | expr.datatype } +column-width.attr = attribute column-width { text | expr.datatype } +content-height.attr = attribute content-height { text | expr.datatype } +content-type.attr = attribute content-type { text | expr.datatype } +content-width.attr = attribute content-width { text | expr.datatype } +country.attr = attribute country { text | expr.datatype } +cue.attr = attribute cue { text | expr.datatype } +cue-after.attr = attribute cue-after { text | expr.datatype } +cue-before.attr = attribute cue-before { text | expr.datatype } +destination-placement-offset.attr = attribute destination-placement-offset { text | expr.datatype } +direction.attr = attribute direction { "ltr" | "rtl" | "inherit" | expr.datatype } +display-align.attr = attribute display-align { + "auto" | "before" | "center" | "after" | "inherit" | expr.datatype + } +dominant-baseline.attr = attribute dominant-baseline { + "auto" + | "use-script" + | "no-change" + | "reset-size" + | "ideographic" + | "alphabetic" + | "hanging" + | "mathematical" + | "central" + | "middle" + | "text-after-edge" + | "text-before-edge" + | "inherit" + | expr.datatype + } +elevation.attr = attribute elevation { text | expr.datatype } +empty-cells.attr = attribute empty-cells { "show" | "hide" | "inherit" | expr.datatype } +end-indent.attr = attribute end-indent { text | expr.datatype } +ends-row.attr = attribute ends-row { "true" | "false" | expr.datatype } +extent.attr = attribute extent { text | expr.datatype } +external-destination.attr = attribute external-destination { text | expr.datatype } +#MEMO: We have separated this property into the two (for side and before floats) +#MEMO: Float values "inside" and "outside" are RenderX extensions. +before-float.attr = attribute float { + "before" + } +side-float.attr = attribute float { + "start" | "end" | "left" | "right" | "none" | "inside" | "outside" | "inherit" | expr.datatype + } + flow-name.attr = attribute flow-name { text } +font.attr = attribute font { text | expr.datatype } +font-family.attr = attribute font-family { text | expr.datatype } +font-selection-strategy.attr = attribute font-selection-strategy { + "auto" | "character-by-character" | "inherit" | expr.datatype + } +font-size.attr = attribute font-size { text | expr.datatype } +font-size-adjust.attr = attribute font-size-adjust { text | expr.datatype } +font-stretch.attr = attribute font-stretch { + "normal" + | "wider" + | "narrower" + | "ultra-condensed" + | "extra-condensed" + | "condensed" + | "semi-condensed" + | "semi-expanded" + | "expanded" + | "extra-expanded" + | "ultra-expanded" + | "inherit" + | expr.datatype + } +font-style.attr = attribute font-style { + "normal" | "italic" | "oblique" | "backslant" | "inherit" | expr.datatype + } +font-variant.attr = attribute font-variant { "normal" | "small-caps" | "inherit" | expr.datatype } +font-weight.attr = attribute font-weight { + "normal" + | "bold" + | "bolder" + | "lighter" + | "inherit" + | "100" + | "200" + | "300" + | "400" + | "500" + | "600" + | "700" + | "800" + | "900" + | expr.datatype + } +force-page-count.attr = attribute force-page-count { + "auto" + | "even" + | "odd" + | "end-on-even" + | "end-on-odd" + | "no-force" + | "inherit" + | expr.datatype + } +format.attr = attribute format { text } +glyph-orientation-horizontal.attr = attribute glyph-orientation-horizontal { orientation.attr-content | expr.datatype } +glyph-orientation-vertical.attr = attribute glyph-orientation-vertical { orientation.attr-content | expr.datatype } +grouping-separator.attr = attribute grouping-separator { text } +grouping-size.attr = attribute grouping-size { text | expr.datatype } +height.attr = attribute height { text | expr.datatype } +hyphenate.attr = attribute hyphenate { "false" | "true" | "inherit" | expr.datatype } +hyphenation-character.attr = attribute hyphenation-character { text } +hyphenation-keep.attr = attribute hyphenation-keep { + "auto" | "column" | "page" | "inherit" | expr.datatype + } +hyphenation-ladder-count.attr = attribute hyphenation-ladder-count { text | expr.datatype } +hyphenation-push-character-count.attr = attribute hyphenation-push-character-count { text | expr.datatype } +hyphenation-remain-character-count.attr = attribute hyphenation-remain-character-count { text | expr.datatype } +id.attr = attribute id { text } +indicate-destination.attr = attribute indicate-destination { "true" | "false" | expr.datatype } +initial-page-number.attr = attribute initial-page-number { text | expr.datatype } +inline-progression-dimension.attr = attribute inline-progression-dimension { text | expr.datatype } +inline-progression-dimension.maximum.attr = attribute inline-progression-dimension.maximum { text | expr.datatype } +inline-progression-dimension.minimum.attr = attribute inline-progression-dimension.minimum { text | expr.datatype } +inline-progression-dimension.optimum.attr = attribute inline-progression-dimension.optimum { text | expr.datatype } +internal-destination.attr = attribute internal-destination { text } +intrusion-displace.attr = attribute intrusion-displace { + "auto" | "none" | "line" | "indent" | "block" | "inherit" | expr.datatype + } +keep-together.attr = attribute keep-together { keep.attr-content | expr.datatype } +keep-together.within-column.attr = attribute keep-together.within-column { keep.attr-content | expr.datatype } +keep-together.within-line.attr = attribute keep-together.within-line { keep.attr-content | expr.datatype } +keep-together.within-page.attr = attribute keep-together.within-page { keep.attr-content | expr.datatype } +keep-with-next.attr = attribute keep-with-next { keep.attr-content | expr.datatype } +keep-with-next.within-column.attr = attribute keep-with-next.within-column { keep.attr-content | expr.datatype } +keep-with-next.within-line.attr = attribute keep-with-next.within-line { keep.attr-content | expr.datatype } +keep-with-next.within-page.attr = attribute keep-with-next.within-page { keep.attr-content | expr.datatype } +keep-with-previous.attr = attribute keep-with-previous { keep.attr-content | expr.datatype } +keep-with-previous.within-column.attr = attribute keep-with-previous.within-column { keep.attr-content | expr.datatype } +keep-with-previous.within-line.attr = attribute keep-with-previous.within-line { keep.attr-content | expr.datatype } +keep-with-previous.within-page.attr = attribute keep-with-previous.within-page { keep.attr-content | expr.datatype } +#RenderX extension attribute +rx-key.attr = attribute rx:key { text } +language.attr = attribute language { text | expr.datatype } +last-line-end-indent.attr = attribute last-line-end-indent { text | expr.datatype } +leader-alignment.attr = attribute leader-alignment { + "none" | "reference-area" | "page" | "inherit" | expr.datatype + } +leader-length.attr = attribute leader-length { text | expr.datatype } +leader-length.maximum.attr = attribute leader-length.maximum { text | expr.datatype } +leader-length.minimum.attr = attribute leader-length.minimum { text | expr.datatype } +leader-length.optimum.attr = attribute leader-length.optimum { text | expr.datatype } +leader-pattern.attr = attribute leader-pattern { + "space" | "rule" | "dots" | "use-content" | "inherit" | expr.datatype + } +leader-pattern-width.attr = attribute leader-pattern-width { text | expr.datatype } +left.attr = attribute left { text | expr.datatype } +letter-spacing.attr = attribute letter-spacing { text | expr.datatype } +letter-spacing.conditionality.attr = attribute letter-spacing.conditionality { "retain" | "discard" | expr.datatype } +letter-spacing.maximum.attr = attribute letter-spacing.maximum { text | expr.datatype } +letter-spacing.minimum.attr = attribute letter-spacing.minimum { text | expr.datatype } +letter-spacing.optimum.attr = attribute letter-spacing.optimum { text | expr.datatype } +letter-spacing.precedence.attr = attribute letter-spacing.precedence { text | expr.datatype } +letter-value.attr = attribute letter-value { "auto" | "alphabetic" | "traditional" | expr.datatype } +line-height.attr = attribute line-height { text | expr.datatype } +line-height-shift-adjustment.attr = attribute line-height-shift-adjustment { text | expr.datatype } +line-height.conditionality.attr = attribute line-height.conditionality { "retain" | "discard" | expr.datatype } +line-height.maximum.attr = attribute line-height.maximum { text | expr.datatype } +line-height.minimum.attr = attribute line-height.minimum { text | expr.datatype } +line-height.optimum.attr = attribute line-height.optimum { text | expr.datatype } +line-height.precedence.attr = attribute line-height.precedence { text | expr.datatype } +line-stacking-strategy.attr = attribute line-stacking-strategy { + "line-height" | "font-height" | "max-height" | "inherit" | expr.datatype + } +linefeed-treatment.attr = attribute linefeed-treatment { + "ignore" + | "preserve" + | "treat-as-space" + | "treat-as-zero-width-space" + | "inherit" + | expr.datatype + } +link-back.attr = attribute link-back { text | expr.datatype } +list-separator.attr = attribute list-separator { text } +margin.attr = attribute margin { text | expr.datatype } +margin-bottom.attr = attribute margin-bottom { text | expr.datatype } +margin-left.attr = attribute margin-left { text | expr.datatype } +margin-right.attr = attribute margin-right { text | expr.datatype } +margin-top.attr = attribute margin-top { text | expr.datatype } +marker-class-name.attr = attribute marker-class-name { text } +master-name.attr = attribute master-name { text } +master-reference.attr = attribute master-reference { text } +max-height.attr = attribute max-height { text | expr.datatype } +max-width.attr = attribute max-width { text | expr.datatype } +maximum-repeats.attr = attribute maximum-repeats { text | expr.datatype } +media-usage.attr = attribute media-usage { + "auto" | "paginate" | "bounded-in-one-dimension" | "unbounded" | expr.datatype + } +merge-subsequent-page-numbers.attr = attribute merge-subsequent-page-numbers { text | expr.datatype } +min-height.attr = attribute min-height { text | expr.datatype } +min-width.attr = attribute min-width { text | expr.datatype } +#NOTE: It's RenderX extension attribute (belongs to rx:meta-field). It enumerates values currently available in XEP +name.attr = attribute name { + "author" | "title" | "subject" | "keywords" | expr.datatype + } +number-columns-repeated.attr = attribute number-columns-repeated { text | expr.datatype } +number-columns-spanned.attr = attribute number-columns-spanned { text | expr.datatype } +number-rows-spanned.attr = attribute number-rows-spanned { text | expr.datatype } +odd-or-even.attr = attribute odd-or-even { "odd" | "even" | "any" | "inherit" | expr.datatype } +rx-table-omit-initial-header.attr = attribute rx:table-omit-initial-header { "true" | "false" | expr.datatype } +orphans.attr = attribute orphans { text | expr.datatype } +overflow.attr = attribute overflow { + "visible" + | "hidden" + | "scroll" + | "auto" + | "error-if-overflow" + | "inherit" | expr.datatype + } +padding.attr = attribute padding { text | expr.datatype } +padding-after.attr = attribute padding-after { text | expr.datatype } +padding-after.conditionality.attr = attribute padding-after.conditionality { "discard" | "retain" | expr.datatype } +padding-after.length.attr = attribute padding-after.length { text | expr.datatype } +padding-before.attr = attribute padding-before { text | expr.datatype } +padding-before.conditionality.attr = attribute padding-before.conditionality { "discard" | "retain" | expr.datatype } +padding-before.length.attr = attribute padding-before.length { text | expr.datatype } +padding-bottom.attr = attribute padding-bottom { text | expr.datatype } +padding-bottom.conditionality.attr = attribute padding-bottom.conditionality { "discard" | "retain" | expr.datatype } +padding-bottom.length.attr = attribute padding-bottom.length { text | expr.datatype } +padding-end.attr = attribute padding-end { text | expr.datatype } +padding-end.conditionality.attr = attribute padding-end.conditionality { "discard" | "retain" | expr.datatype } +padding-end.length.attr = attribute padding-end.length { text | expr.datatype } +padding-left.attr = attribute padding-left { text | expr.datatype } +padding-left.conditionality.attr = attribute padding-left.conditionality { "discard" | "retain" | expr.datatype } +padding-left.length.attr = attribute padding-left.length { text | expr.datatype } +padding-right.attr = attribute padding-right { text | expr.datatype } +padding-right.conditionality.attr = attribute padding-right.conditionality { "discard" | "retain" | expr.datatype } +padding-right.length.attr = attribute padding-right.length { text | expr.datatype } +padding-start.attr = attribute padding-start { text | expr.datatype } +padding-start.conditionality.attr = attribute padding-start.conditionality { "discard" | "retain" | expr.datatype } +padding-start.length.attr = attribute padding-start.length { text | expr.datatype } +padding-top.attr = attribute padding-top { text | expr.datatype } +padding-top.conditionality.attr = attribute padding-top.conditionality { "discard" | "retain" | expr.datatype } +padding-top.length.attr = attribute padding-top.length { text | expr.datatype } +page-break-after.attr = attribute page-break-after { + "auto" | "always" | "avoid" | "left" | "right" | "inherit" | expr.datatype + } +page-break-before.attr = attribute page-break-before { + "auto" | "always" | "avoid" | "left" | "right" | "inherit" | expr.datatype + } +page-break-inside.attr = attribute page-break-inside { "avoid" | "auto" | "inherit" | expr.datatype } +page-height.attr = attribute page-height { text | expr.datatype } +page-position.attr = attribute page-position { + "first" | "last" | "rest" | "any" | "inherit" | expr.datatype + } +page-width.attr = attribute page-width { text | expr.datatype } +pause.attr = attribute pause { text | expr.datatype } +pause-after.attr = attribute pause-after { text | expr.datatype } +pause-before.attr = attribute pause-before { text | expr.datatype } +pitch.attr = attribute pitch { text | expr.datatype } +pitch-range.attr = attribute pitch-range { text | expr.datatype } +play-during.attr = attribute play-during { text | expr.datatype } +#MEMO: We forced to devide this shorthand since we have separate absolute-container element +absolute-position-shorthand.attr = attribute position { + "absolute" | "fixed" + } +relative-position-shorthand.attr = attribute position { + "static" | "relative" | "inherit" | expr.datatype + } +precedence.attr = attribute precedence { "true" | "false" | "inherit" | expr.datatype } +provisional-distance-between-starts.attr = attribute provisional-distance-between-starts { text | expr.datatype } +provisional-label-separation.attr = attribute provisional-label-separation { text | expr.datatype } +range-separator.attr = attribute range-separator { text } +ref-id.attr = attribute ref-id { text } +ref-key.attr = attribute ref-key { text } +reference-orientation.attr = attribute reference-orientation { orientation.attr-content | expr.datatype } +region-name.attr = attribute region-name { text } +relative-align.attr = attribute relative-align { "before" | "baseline" | "inherit" | expr.datatype } +relative-position.attr = attribute relative-position { + "auto" | "static" | "relative" | "inherit" | expr.datatype + } +rendering-intent.attr = attribute rendering-intent { + "auto" | "perceptual" | "relative-colorimetric" | "saturation" | "absolute-colorimetric" | "inherit" | expr.datatype + }? +retrieve-boundary.attr = attribute retrieve-boundary { "page" | "page-sequence" | "document" | expr.datatype } +retrieve-class-name.attr = attribute retrieve-class-name { text } +retrieve-position.attr = attribute retrieve-position { + "first-starting-within-page" + | "first-including-carryover" + | "last-starting-within-page" + | "last-ending-within-page" + | expr.datatype + } +richness.attr = attribute richness { text | expr.datatype } +right.attr = attribute right { text | expr.datatype } +role.attr = attribute role { text } +rule-style.attr = attribute rule-style { + "none" + | "dotted" + | "dashed" + | "solid" + | "double" + | "groove" + | "ridge" + | "inherit" + | expr.datatype + } +rule-thickness.attr = attribute rule-thickness { text | expr.datatype } +scaling.attr = attribute scaling { "uniform" | "non-uniform" | "inherit" | expr.datatype } +scaling-method.attr = attribute scaling-method { + "auto" | "integer-pixels" | "resample-any-method" | "inherit" | expr.datatype + } +score-spaces.attr = attribute score-spaces { "true" | "false" | "inherit" | expr.datatype } +script.attr = attribute script { text | expr.datatype } +show-destination.attr = attribute show-destination { "replace" | "new" | expr.datatype } +size.attr = attribute size { text | expr.datatype } +source-document.attr = attribute source-document { text } +space-after.attr = attribute space-after { text | expr.datatype } +space-after.conditionality.attr = attribute space-after.conditionality { "retain" | "discard" | expr.datatype } +space-after.maximum.attr = attribute space-after.maximum { text | expr.datatype } +space-after.minimum.attr = attribute space-after.minimum { text | expr.datatype } +space-after.optimum.attr = attribute space-after.optimum { text | expr.datatype } +space-after.precedence.attr = attribute space-after.precedence { text | expr.datatype } +space-before.attr = attribute space-before { text | expr.datatype } +space-before.conditionality.attr = attribute space-before.conditionality { "retain" | "discard" | expr.datatype } +space-before.maximum.attr = attribute space-before.maximum { text | expr.datatype } +space-before.minimum.attr = attribute space-before.minimum { text | expr.datatype } +space-before.optimum.attr = attribute space-before.optimum { text | expr.datatype } +space-before.precedence.attr = attribute space-before.precedence { text | expr.datatype } +space-end.attr = attribute space-end { text | expr.datatype } +space-end.conditionality.attr = attribute space-end.conditionality { "retain" | "discard" | expr.datatype } +space-end.maximum.attr = attribute space-end.maximum { text | expr.datatype } +space-end.minimum.attr = attribute space-end.minimum { text | expr.datatype } +space-end.optimum.attr = attribute space-end.optimum { text | expr.datatype } +space-end.precedence.attr = attribute space-end.precedence { text | expr.datatype } +space-start.attr = attribute space-start { text | expr.datatype } +space-start.conditionality.attr = attribute space-start.conditionality { "retain" | "discard" | expr.datatype } +space-start.maximum.attr = attribute space-start.maximum { text | expr.datatype } +space-start.minimum.attr = attribute space-start.minimum { text | expr.datatype } +space-start.optimum.attr = attribute space-start.optimum { text | expr.datatype } +space-start.precedence.attr = attribute space-start.precedence { text | expr.datatype } +span.attr = attribute span { "none" | "all" | "inherit" | expr.datatype } +speak.attr = attribute speak { "normal" | "none" | "spell-out" | "inherit" | expr.datatype } +speak-header.attr = attribute speak-header { "once" | "always" | "inherit" | expr.datatype } +speak-numeral.attr = attribute speak-numeral { "digits" | "continuous" | "inherit" | expr.datatype } +speak-punctuation.attr = attribute speak-punctuation { "code" | "none" | "inherit" | expr.datatype } +speech-rate.attr = attribute speech-rate { text | expr.datatype } +src.attr = attribute src { text | expr.datatype } +start-indent.attr = attribute start-indent { text | expr.datatype } +starting-state.attr = attribute starting-state { text | expr.datatype } +starts-row.attr = attribute starts-row { "true" | "false" | expr.datatype } +stress.attr = attribute stress { text | expr.datatype } +suppress-at-line-break.attr = attribute suppress-at-line-break { + "auto" | "suppress" | "retain" | "inherit" | expr.datatype + } +switch-to.attr = attribute switch-to { text | expr.datatype } +table-layout.attr = attribute table-layout { "auto" | "fixed" | "inherit" | expr.datatype } +table-omit-footer-at-break.attr = attribute table-omit-footer-at-break { "true" | "false" | "inherit" | expr.datatype } +table-omit-header-at-break.attr = attribute table-omit-header-at-break { + "true" | "false" | "inherit" | expr.datatype + } +target-presentation-context.attr = attribute target-presentation-context { text } +target-processing-context.attr = attribute target-processing-context { text } +target-stylesheet.attr = attribute target-stylesheet { text } +#MEMO: values are temporarily excluded from text-align and text-align-last +text-align.attr = attribute text-align { + "start" + | "center" + | "end" + | "justify" + | "inside" + | "outside" + | "left" + | "right" + | "inherit" + | expr.datatype + } +text-align-last.attr = attribute text-align-last { + "relative" + | "start" + | "center" + | "end" + | "justify" + | "inside" + | "outside" + | "left" + | "right" + | "inherit" + | expr.datatype + } +text-altitude.attr = attribute text-altitude { text | expr.datatype } +text-decoration.attr = attribute text-decoration { xsd:NMTOKENS | expr.datatype } +text-depth.attr = attribute text-depth { text | expr.datatype } +text-indent.attr = attribute text-indent { text | expr.datatype } +text-shadow.attr = attribute text-shadow { text | expr.datatype } +text-transform.attr = attribute text-transform { + "capitalize" | "uppercase" | "lowercase" | "none" | "inherit" | expr.datatype + } +top.attr = attribute top { text | expr.datatype } +treat-as-word-space.attr = attribute treat-as-word-space { + "auto" | "true" | "false" | "inherit" | expr.datatype + } +unicode-bidi.attr = attribute unicode-bidi { + "normal" | "embed" | "bidi-override" | "inherit" | expr.datatype + } +value.attr = attribute value { text } +vertical-align.attr = attribute vertical-align { text | expr.datatype } +visibility.attr = attribute visibility { + "visible" | "hidden" | "collapse" | "inherit" | expr.datatype + } +voice-family.attr = attribute voice-family { text | expr.datatype } +volume.attr = attribute volume { text | expr.datatype } +white-space.attr = attribute white-space { "normal" | "pre" | "nowrap" | "inherit" | expr.datatype } +white-space-collapse.attr = attribute white-space-collapse { "false" | "true" | "inherit" | expr.datatype } +white-space-treatment.attr = attribute white-space-treatment { + "ignore" + | "preserve" + | "ignore-if-before-linefeed" + | "ignore-if-after-linefeed" + | "ignore-if-surrounding-linefeed" + | "inherit" + | expr.datatype + } +widows.attr = attribute widows { text | expr.datatype } +width.attr = attribute width { text | expr.datatype } +word-spacing.attr = attribute word-spacing { text | expr.datatype } +word-spacing.conditionality.attr = attribute word-spacing.conditionality { "retain" | "discard" | expr.datatype } +word-spacing.maximum.attr = attribute word-spacing.maximum { text | expr.datatype } +word-spacing.minimum.attr = attribute word-spacing.minimum { text | expr.datatype } +word-spacing.optimum.attr = attribute word-spacing.optimum { text | expr.datatype } +word-spacing.precedence.attr = attribute word-spacing.precedence { text | expr.datatype } +wrap-option.attr = attribute wrap-option { "no-wrap" | "wrap" | "inherit" | expr.datatype } +writing-mode.attr = attribute writing-mode { + "lr-tb" | "rl-tb" | "tb-rl" | "lr" | "rl" | "tb" | "inherit" | expr.datatype + } +z-index.attr = attribute z-index { text | expr.datatype } diff --git a/plugins/relaxng/testData/highlighting/rnc/fo/datatype.rnc b/plugins/relaxng/testData/highlighting/rnc/fo/datatype.rnc new file mode 100644 index 000000000000..a2a954f2c818 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/fo/datatype.rnc @@ -0,0 +1,54 @@ +# ========================================================= +# +# (c) 2004, RenderX +# +# Author: Alexander Peshkov +# +# Permission is granted to use this document, copy and +# modify free of charge, provided that every derived work +# bear a reference to the present document. +# +# This document contains a computer program written in +# XSL Transformations Language. It is published with no +# warranty of any kind about its usability, as a mere +# example of XSL technology. RenderX shall not be +# considered liable for any damage or loss of data caused +# by use of this program. +# +# ========================================================= + +namespace local = "" +default namespace fo = "http://www.w3.org/1999/XSL/Format" +namespace rx = "http://www.renderx.com/XSL/Extensions" + +# *************************************************************** +# Common XSL FO datatypes definitions +# *************************************************************** +integer.datatype = xsd:integer +number.datatype = xsd:decimal +length.datatype = xsd:string { pattern = "[\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em)" } +angle.datatype = xsd:string { pattern = "[\-+]?(\d*\.?\d+)(deg|grad|rad)" } +percentage.datatype = xsd:string { pattern = "[\-+]?(\d*\.?\d+)%" } +character.datatype = xsd:string { pattern = ".|\r|\n" } +string.datatype = string +name.datatype = xsd:NCName +family-name.datatype = xsd:normalizedString +#MEMO: Should I add some constraints to the family-name.datatype? +color.datatype= xsd:token +#MEMO: Should I add some constraints to the color.datatype? +country.datatype = xsd:string { pattern = "\w{2,3}" } +language.datatype = xsd:string { pattern = "\w{2,3}" } +script.datatype = xsd:string { pattern = "\w" } +#MEMO: Should I add detailed constraints to the country/language/script.datatype? +uri-specification.datatype = xsd:string +#MEMO: Should I add some constraints to the uri-specification.datatype? +time.datatype = xsd:string { pattern = "[\-+]?(\d*\.?\d+)(m?s)" } +frequency.datatype = xsd:string { pattern = "[\-+]?(\d*\.?\d+)(k?Hz)" } +# NOTE: datatype added in XSL FO 1.0 Errata +shape.datatype = xsd:normalizedString { pattern = "(([\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em))|auto) (([\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em))|auto) (([\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em))|auto) (([\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em))|auto)" } + +# *************************************************************** +# Special datatype - expressions +# *************************************************************** +#MEMO: simple example of constraint for functions +expr.datatype = xsd:normalizedString { pattern = ".*\(.*\).*" } diff --git a/plugins/relaxng/testData/highlighting/rnc/fo/elements.rnc b/plugins/relaxng/testData/highlighting/rnc/fo/elements.rnc new file mode 100644 index 000000000000..327b49970afe --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/fo/elements.rnc @@ -0,0 +1,554 @@ +# ========================================================= +# +# (c) 2004, RenderX +# +# Author: Alexander Peshkov +# +# Permission is granted to use this document, copy and +# modify free of charge, provided that every derived work +# bear a reference to the present document. +# +# This document contains a computer program written in +# XSL Transformations Language. It is published with no +# warranty of any kind about its usability, as a mere +# example of XSL technology. RenderX shall not be +# considered liable for any damage or loss of data caused +# by use of this program. +# +# ========================================================= + +namespace local = "" +default namespace fo = "http://www.w3.org/1999/XSL/Format" +namespace rx = "http://www.renderx.com/XSL/Extensions" + +include "properties.rnc" + +# **************************************************************************************** +# Common content models used by content-bearing elements +# **************************************************************************************** +very-basic-inlines = + character + | external-graphic + | instream-foreign-object + | inline-container + | leader + | page-number + | page-number-citation + | multi-toggle #MEMO: To be strict, we have to control that this element is a descendant of an fo:multi-case. + | page-index + | begin-index-range + | end-index-range + +#NOTE: An absolute-container can be treated both as block and as outline. +basic-blocks = + block | block-container | table-and-caption | table | list-block + +#NOTE: Unlike other out-of-lines fo:footnote can be used only in the context where inlines are permitted +out-of-lines-block = before-float | side-float | absolute-container +out-of-lines = footnote | out-of-lines-block + +# As a compromise for intricated inline content model prescribed by XSL FO spec +# we define two types of inline content: +# first as restrictive as required by spec for descendants of an fo:leader or of an fo:inline +# child of an fo:footnote (and for some other cases where we believe it is reasonable), +# it permits inline level elements only, except for descendants of fo:inline-container; +# second as loose as prescribed by spec for the general cases +basic-inlines-inline = very-basic-inlines | basic-link-inline | inline-inline | bidi-override-inline +basic-inlines = very-basic-inlines | basic-link | inline | bidi-override + +# We have three content models for wrappers: +# first one allows inline content only (based on basic-inlines-inline described above); +# second one requires block-level elements to be at the top of it; +# third one is for mixed content (general case); +wrappers-inline = + multi-switch-inline | multi-properties-inline | wrapper-inline | retrieve-marker +wrappers-block = + multi-switch-block | multi-properties-block | wrapper-block | retrieve-marker +wrappers = + multi-switch | multi-properties | wrapper | retrieve-marker + +# We have two extended content models for inlines: +# first one is stricter, with inline elements only (exception for fo:inline-container descendants) +# and with no outlines (actually they are bared in main.rnc anyway); +# second one is loose, with all possible inlines and outlines. +# In general those content models corresponds very well with two possible contexts: +# block context and inline context +inlines-inline = text | basic-inlines-inline | wrappers-inline +inlines = text | basic-inlines | out-of-lines | wrappers + +# Content model for blocks including block-level outlines +blocks = basic-blocks | wrappers-block | out-of-lines-block +# Mixed content model - broadest one +mix = inlines | basic-blocks + +# **************************************************************************************** +# Element structure for content-bearing elements +# **************************************************************************************** +# =============================================================== +# Block is the base element for all content areas. +# =============================================================== +block = + element fo:block { + block.attlist, block.content + } +block.content = marker*, ( initial-property-set | mix )* + +# =============================================================== +# Block container +# =============================================================== +#MEMO: We are forced to create separate element 'absolute-container' in order +# to satisfy XSL FO spec requirements. Note that this is the *only* place where +# properties really interfer with element-level structure (well, actually fo:float is the second place). +# A separate fo:absolute-container is clearly necessary. +# Absolutely possitioned block-container cannot contain markers and and outlines. +# It's behaviour is quite similar to the outline elements such as float. +# 'Folint' do not control absolutely positioned container restriction +# (due to expressions that can result in absolute position) +# 'Folint' also permits empty block-containers, that is against the spec. +# Spec defines fo:block-container content as (%block;)+ + +absolute-container = notAllowed +absolute-container-real = + element fo:block-container { absolute-container.attlist, absolute-container.content } +absolute-container.content = blocks+ + +block-container = + element fo:block-container { block-container.attlist, block-container.content } +block-container.content = marker*, blocks+ + +# **************************************************************************************** +# Inline elements +# **************************************************************************************** +# =============================================================== +# Unicode bidi-override +# =============================================================== +#MEMO: According to spec this element CAN have block level children except for the cases listed below: +# XSL> An fo:bidi-override that is a descendant of an fo:leader or of an fo:inline child +# XSL> of an fo:footnote may not have block-level children, unless it has a nearer ancestor +# XSL> that is an fo:inline-container. +# NOTE: This is contradictory to the description of fo:leader element (6.6.9. fo:leader) that +# prohibits (some) block-level elements/outlines to be fo:leader descendants +# no matter if they wrapped in any fo:inline-containers and fo:bidi-override. +# We have two models: +# first (restrictive) used by descendants of an fo:title, fo:leader or of an fo:inline child of an fo:footnote; +# second (loose) as prescribed by spec for the general cases +# 'Folint' believes that no block level elements should be allowed in this element in either way. +bidi-override-inline = + element fo:bidi-override { bidi-override.attlist, bidi-override-inline.content } +bidi-override-inline.content = marker*, inlines-inline* + +bidi-override = + element fo:bidi-override { bidi-override.attlist, bidi-override.content } +bidi-override.content = marker*, mix* + +# =============================================================== +# Single character +# =============================================================== +character = element fo:character { character.attlist, empty } + +# =============================================================== +# Initial property set specifies properties for one or more lines +# =============================================================== +initial-property-set = + element fo:initial-property-set { + initial-property-set.attlist, empty + } + +# =============================================================== +# External graphic +# =============================================================== +external-graphic = + element fo:external-graphic { external-graphic.attlist, empty } + +# =============================================================== +# In-stream graphic +# =============================================================== +instream-foreign-object = + element fo:instream-foreign-object { + instream-foreign-object.attlist, any + } + +# =============================================================== +# Inline +# =============================================================== +#MEMO: This element used by content model that consists of inlines only +# with exception for descendants of inline-container +inline-inline = element fo:inline { inline.attlist, inline-inline.content } +inline-inline.content = marker*, inlines-inline* + +inline = element fo:inline { inline.attlist, inline.content } +inline.content = marker*, mix* + +# XSL> An fo:inline that is a child of an fo:footnote may not have block-level children. +# XSL> An fo:inline that is a descendant of an fo:leader or of the fo:inline child of +# XSL> an fo:footnote may not have block-level children, unless it has a nearer +# XSL> ancestor that is an fo:inline-container. +#NOTE: This definition is contradictory to the one of the fo:leader since latter prohibits +# fo:inline-container as a descendant. But it's the definition of fo:leader that should be fixed +# since content model described above is the only sane content model in the inline context. +# It should be the same for fo:bidi-override. However definition must be adjasted +# in order to mention fo:title since this element is a typical inline. +# +# 'Folint' believes that block elements are allowed here and thoroughly tests for +# all those tricky exceptions. This behavior seems to be quite inconsisten with the +# one regarding fo:bidi-override treatment. + +# =============================================================== +# Inline container +# =============================================================== +inline-container = + element fo:inline-container { inline-container.attlist, inline-container.content } +inline-container.content = marker*, blocks* + +# =============================================================== +# Leader +# =============================================================== +leader = element fo:leader { leader.attlist, leader.content } +leader.content = inlines-inline* +#MEMO: Following two lines used together with tricky redefinition in main.rnc +# in order to prevent fo:leader nesting. +#leader.content = notAllowed +#leader.content-real = inlines-inline* + +#MEMO: We use inline content model here which is consistent with +# such elements as fo:inline child of fo:footnote. It allows blocks/outlines, but only as a +# descendant of inline-container. XSL FO spec is quite uneven at this point (and should be fixed). +# According to spec, this element can contain inline level elements and text, but +# XSL> The content must not contain an fo:leader, fo:inline-container, fo:block-container, +# XSL> fo:float, fo:footnote, or fo:marker either as a direct child or as a descendant. +# NOTE: XSL FO spec DO NOT prohibit blocks or tables as descendants of fo:leader! +# NOTE: fo:leader constraints are contradictory to those of fo:inline since section "6.6.7. fo:inline" +# states implicitly that there could be an fo:inline-container that is a descendent of fo:leader. +# +# 'Folint' respects these constraints partially: it prohibits fo:block-container as a descendant, +# but permits fo:marker, fo:leader, fo:inline-container, fo:float, fo:footnote. +# It also prohibits use of fo:block as descendant. + +# =============================================================== +# Page Number +# =============================================================== +page-number = element fo:page-number { page-number.attlist, empty } + +# =============================================================== +# Page number citation +# =============================================================== +page-number-citation = + element fo:page-number-citation { + page-number-citation.attlist, empty + } + +# =============================================================== +# Atomic elements for index ranges markup +# =============================================================== +begin-index-range = + element rx:begin-index-range { begin-index-range.attlist, empty } + +end-index-range = + element rx:end-index-range { end-index-range.attlist, empty } + +# =============================================================== +# Page number list - index entry +# =============================================================== +page-index = element rx:page-index { page-index.attlist, page-index.content } +#MEMO: Currently page-index must contain at least one rx:index-item element, +# empty content is allowed for backward compatibility. +page-index.content = index-item* + +index-item = element rx:index-item { index-item.attlist, empty } + +# **************************************************************************************** +# Formatting objects for tables. +# **************************************************************************************** + +# =============================================================== +# Table & Caption is a wrapper to all the stuff pertinent to a +# given table. It generates a block consisting of two subblocks: +# one for the caption, another one for the table itself. The +# placement of these two blocks is controlled by the +# 'caption-side' property: if caption-side="before"|"after" (or +# their absolute orientation equivalents), the two blocks are +# drawn one after another; if it is "start"|"end", then the +# caption is displayed on the correspondent side of the table. +# In this case, the relative alignment of the two blocks is given +# by the 'relative-align'/'display-align' property. +# +# =============================================================== +table-and-caption = + element fo:table-and-caption { + table-and-caption.attlist, + table-and-caption.content + } +table-and-caption.content = marker*, table-caption?, table + +# =============================================================== +# Table caption is an area container. +# =============================================================== +table-caption = + element fo:table-caption { table-caption.attlist, table-caption.content } +table-caption.content = marker*, blocks+ + +# =============================================================== +# fo:table is the basic element for all tables. All the contents +# placed inside it is distributed over a single rectangular grid +# of rows and columns. +# =============================================================== +table = + element fo:table { + table.attlist, + table.content + } +table.content = + marker*, + table-column*, + table-header?, + table-footer?, + table-body+ + +# =============================================================== +# Table column specifies common properties to ascribe to all +# cells in a column *or a group of columns*. Note that, if both +# 'number-columns-repeated' and 'number-columns-spanned' exceed +# 1, the column counter is increased by 'number-columns-spanned'. +# it means that you only set properties for columns: +# 'column-number' +# 'column-number' + 'number-columns-spanned' +# 'column-number' + 2 * 'number-columns-spanned' +# and so on, leaving default properties for intermediate columns. +# =============================================================== +table-column = element fo:table-column { table-column.attlist, empty } + +# =============================================================== +# Table header, table footer, and table body are wrappers for +# groups of rows. They contain either one or more fo:table-rows, +# or one or more fo:table-cells; in the latter case, row breaks +# are specified in the cells by 'starts-row'/'ends-row'. +# All these elements are identical both in the content structure +# and in the attributes. +# =============================================================== +row-group = marker*, (table-row+ | table-cell+) +table-header = + element fo:table-header { table-header.attlist, table-header.content } +table-header.content = row-group + +table-footer = + element fo:table-footer { table-footer.attlist, table-footer.content } +table-footer.content = row-group + +table-body = element fo:table-body { table-body.attlist, table-body.content } +table-body.content = row-group + +# =============================================================== +# Table row. +# =============================================================== +table-row = element fo:table-row { table-row.attlist, table-row.content } +table-row.content = table-cell+ +#MEMO: We are more strict here, so this note is about 'Folint': +# 'Folint' permits empty fo:table-row, that is against the spec. +# XSL FO spec defines fo:table-row content as (table-cell+) + +# =============================================================== +# Table cell. +# =============================================================== +table-cell = element fo:table-cell { table-cell.attlist, table-cell.content } +table-cell.content = marker*, blocks+ +#MEMO: We are more strict here, so this note is about 'Folint': +# 'Folint' permits empty table-cells that is against the spec. Spec defines fo:table-cell +# content as (%block;)+ +# Note that 'Folint' is quite consistent regarding this matter - it simillary allows empty +# block-containers and table-rows + +# **************************************************************************************** +# Formatting objects for lists. +# **************************************************************************************** +# =============================================================== +# List block is a block, with some extra features to control the +# disposition of list items. +# =============================================================== +list-block = element fo:list-block { list-block.attlist, list-block.content } +list-block.content = marker*, list-item+ + +# =============================================================== +# List item is a coupling of item label and item body. +# =============================================================== +list-item = + element fo:list-item { + list-item.attlist, + list-item.content + } +list-item.content = marker*, list-item-label, list-item-body + +# =============================================================== +# List item label and list item body +# =============================================================== +list-item-label = + element fo:list-item-label { list-item-label.attlist, list-item-label.content } +list-item-label.content = marker*, blocks+ + +list-item-body = + element fo:list-item-body { list-item-body.attlist, list-item-body.content } +list-item-body.content = marker*, blocks+ +#MEMO: We are more strict here, so this note is about 'Folint': +# 'Folint' permits empty fo:list-item-label/body, that is clearly the spec. +# Spec defines fo:list-item-label/body content as (%block;)+ + +#**************************************************************************************** +# Out-of-lines. +#**************************************************************************************** +# =============================================================== +# Floats and footnotes resemble containers. Accordingly, we treat +# them as block sequences. +# =============================================================== +#MEMO: We do not allows absolutely positioned container as an outline descendant. +# 'Folint' is loose here - it do not check this condition. +#MEMO: We are forced to create two types of floats: side-floats and before-floats +# because they have different restrictions (side-floats can appear in static content, +# before-floats can't bear 'clear' property) +# NOTE: 'Folint' does not allows any floats inside absolutely positioned containers too. +side-float = notAllowed +side-float-real = element fo:float { side-float.attlist, float.content } +before-float = notAllowed +before-float-real = element fo:float { before-float.attlist, float.content } +float.content = blocks+ + +# XSL> It is an error if the fo:footnote occurs as a descendant of a flow that is not assigned +# XSL> to a region-body, or of an fo:block-container that generates absolutely positioned areas. +footnote = notAllowed +footnote-real = + element fo:footnote { footnote.attlist, footnote.content } +# XSL> An fo:inline that is a child of an fo:footnote may not have block-level children. +# XSL> An fo:inline that is a descendant of an fo:leader or of the fo:inline child of +# XSL> an fo:footnote may not have block-level children, unless it has a nearer +# XSL> ancestor that is an fo:inline-container. +# We do check here that first inline have no block-level children/descendants unlless +# they are wrapped into an inline-container. +# 'Folint' does the same. +footnote.content = inline-inline, footnote-body + +footnote-body = + element fo:footnote-body { footnote-body.attlist, footnote-body.content } +footnote-body.content = blocks+ + +# =============================================================== +# Simple link. From the formatting point of view, it's nothing +# but a regular inline sequence. +# =============================================================== +# This elment is for separate 'inline' content model +basic-link-inline = element fo:basic-link { basic-link.attlist, basic-link-inline.content } +basic-link-inline.content = marker*, inlines-inline* + +basic-link = element fo:basic-link { basic-link.attlist, basic-link.content } +basic-link.content = marker*, mix* + +# **************************************************************************************** +# Wrappers and Markers. +# **************************************************************************************** +# =============================================================== +# Wrapper. This may be useful but it seriously complicates validation of +# content models for blocks and inlines. +# =============================================================== +#There are 3 different kind of wrappers for different contexts +wrapper-inline = element fo:wrapper { wrapper.attlist, wrapper-inline.content } +wrapper-inline.content = marker*, inlines-inline* + +wrapper-block = element fo:wrapper { wrapper.attlist, wrapper-block.content } +wrapper-block.content = marker*, blocks* + +wrapper = element fo:wrapper { wrapper.attlist, wrapper.content } +wrapper.content = marker*, mix* + +# =============================================================== +# Marker. +# =============================================================== +marker = notAllowed +marker-real = element fo:marker { marker.attlist, marker.content } +marker.content = mix* + +# =============================================================== +# Marker retrieval. +# We are more strict here making retrieve-class-name attribute a mandatory, +# but marker with no retrieve-class-name is meaningless. +# =============================================================== +retrieve-marker = notAllowed +retrieve-marker-real = element fo:retrieve-marker { retrieve-marker.attlist, empty } + +# **************************************************************************************** +# Multistate stuff. +# All those elements are practically unused and XSL content model invloved is +# intricated. Therefor validation is not absolutely strict here. +# **************************************************************************************** +# =============================================================== +# Switch. This is a pure logical operator; no formatting may be +# conveyed through it. +# =============================================================== +#Thera are 3 different kind of multi-switch (because there are 3 kinds of multi-case) +multi-switch-inline = + element fo:multi-switch { multi-switch.attlist, multi-switch-inline.content } +multi-switch-inline.content = multi-case-inline+ + +multi-switch-block = + element fo:multi-switch { multi-switch.attlist, multi-switch-block.content } +multi-switch-block.content = multi-case-block+ + +multi-switch = + element fo:multi-switch { multi-switch.attlist, multi-switch.content } +multi-switch.content = multi-case+ + +# =============================================================== +# Single case. Block-level formatting may be conveyed. +# =============================================================== +#Thera are 3 different kind of multi-case (similar to fo:wrapper) +multi-case-inline = element fo:multi-case { multi-case.attlist, multi-case-inline.content } +multi-case-inline.content = inlines-inline* + +multi-case-block = element fo:multi-case { multi-case.attlist, multi-case-block.content } +multi-case-block.content = blocks* + +multi-case = element fo:multi-case { multi-case.attlist, multi-case.content } +multi-case.content = mix* + +# =============================================================== +# Toggle. This is a typical inline. +# =============================================================== +#MEMO: This element is only permitted as a descendant of an fo:multi-case. +multi-toggle = + element fo:multi-toggle { multi-toggle.attlist, multi-toggle.content } +multi-toggle.content = mix* + +# =============================================================== +# Multi-properties. +# =============================================================== +#Thera are 3 different kind of multi-properties (similar to fo:wrapper) +multi-properties-inline = + element fo:multi-properties { + multi-properties.attlist, multi-properties-inline.content + } +multi-properties-inline.content = multi-property-set+, wrapper-inline + +multi-properties-block = + element fo:multi-properties { + multi-properties.attlist, multi-properties-block.content + } +multi-properties-block.content = multi-property-set+, wrapper-block + +multi-properties = + element fo:multi-properties { + multi-properties.attlist, multi-properties.content + } +multi-properties.content = multi-property-set+, wrapper + +# =============================================================== +# Multi property set. +# =============================================================== +multi-property-set = + element fo:multi-property-set { multi-property-set.attlist, empty } + +# =============================================================== +# "Match anything" definition, used by fo:instream-foreign-object +# =============================================================== +#MEMO: Should we exclude elements which belongs to fo: namespace? +any = + (element * { + attribute * { text }*, + any + } + | text)* diff --git a/plugins/relaxng/testData/highlighting/rnc/fo/fo-test.xml b/plugins/relaxng/testData/highlighting/rnc/fo/fo-test.xml new file mode 100644 index 000000000000..1158c1f6d59e --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/fo/fo-test.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + Report + + + + + + + eCS Nachrichtenauswertung + + + + diff --git a/plugins/relaxng/testData/highlighting/rnc/fo/main.rnc b/plugins/relaxng/testData/highlighting/rnc/fo/main.rnc new file mode 100644 index 000000000000..2232854032a1 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/fo/main.rnc @@ -0,0 +1,239 @@ +# ========================================================= +# +# (c) 2004, RenderX +# +# Author: Alexander Peshkov +# +# Permission is granted to use this document, copy and +# modify free of charge, provided that every derived work +# bear a reference to the present document. +# +# This document contains a computer program written in +# XSL Transformations Language. It is published with no +# warranty of any kind about its usability, as a mere +# example of XSL technology. RenderX shall not be +# considered liable for any damage or loss of data caused +# by use of this program. +# +# ========================================================= + +namespace local = "" +default namespace fo = "http://www.w3.org/1999/XSL/Format" +namespace rx = "http://www.renderx.com/XSL/Extensions" + +include "elements.rnc" + +start = root + +# **************************************************************************************** +# Element structure for top-level elements +# **************************************************************************************** +# =============================================================== +# Root element. Contains everything, generates nothing. It has an +# id, a FO namespace prefix declaration, and other namespace +# declarations if used. +# =============================================================== +root = element fo:root { root.attlist, root.content } +root.content = + meta-info?, + layout-master-set, + declarations?, + outline?, + page-sequence+ + +# =============================================================== +# Document meta information - RenderX extension +# =============================================================== +meta-info = element rx:meta-info { meta-info.attlist, meta-info.content } +meta-info.content = meta-field+ + +meta-field = element rx:meta-field { meta-field.attlist, empty } + +# =============================================================== +# Color profile declarations +# =============================================================== +declarations = element fo:declarations { declarations.attlist, declarations.content } +declarations.content = color-profile+ + +color-profile = element fo:color-profile { color-profile.attlist, empty } + +# =============================================================== +# Bookmarks - RenderX extension +# =============================================================== +outline = element rx:outline { outline.attlist, outline.content } +outline.content = bookmark+ + +bookmark = element rx:bookmark { bookmark.attlist, bookmark.content } +bookmark.content = bookmark-label, bookmark* + +bookmark-label = element rx:bookmark-label { bookmark-label.attlist, bookmark-label.content } +bookmark-label.content = text + +# =============================================================== +# Layout-master-set. Contains a set of page-masters. +# Content model made more strict than in the spec, to enforce +# that a page-sequence-master be always accompanied by at least +# one simple-page-master. +# =============================================================== +layout-master-set = element fo:layout-master-set { layout-master-set.attlist, layout-master-set.content } +layout-master-set.content = page-sequence-master* & simple-page-master+ + +# =============================================================== +# Page sequence master +# =============================================================== +page-sequence-master = + element fo:page-sequence-master { + page-sequence-master.attlist, page-sequence-master.content + } +page-sequence-master.content = + (single-page-master-reference + | repeatable-page-master-reference + | repeatable-page-master-alternatives)+ + +# =============================================================== +# Sequence specifiers are predefined sequences of page masters +# that are used by page sequence master to construct a desired +# page collection. +# =============================================================== +single-page-master-reference = + element fo:single-page-master-reference { + single-page-master-reference.attlist, empty + } + +repeatable-page-master-reference = + element fo:repeatable-page-master-reference { + repeatable-page-master-reference.attlist, empty + } + +repeatable-page-master-alternatives = + element fo:repeatable-page-master-alternatives { + repeatable-page-master-alternatives.attlist, repeatable-page-master-alternatives.content + } +repeatable-page-master-alternatives.content = conditional-page-master-reference+ + +conditional-page-master-reference = + element fo:conditional-page-master-reference { + conditional-page-master-reference.attlist, empty + } + +# =============================================================== +# Simple page master defines a page layout. It does not +# explicitly generate any content. +# =============================================================== +simple-page-master = + element fo:simple-page-master { + simple-page-master.attlist, + simple-page-master.content + } +simple-page-master.content = + region-body, + region-before?, + region-after?, + region-start?, + region-end? + +# =============================================================== +# Regions. The page instance is divided into subareas, whose +# properties are described by the five region-* elements. These +# elements by themselves do not generate any content. +# =============================================================== + +# =============================================================== +# Body region: middle of the page. +# =============================================================== +region-body = element fo:region-body { region-body.attlist, empty } + +# =============================================================== +# Side regions: page edges. +# =============================================================== + +region-before = element fo:region-before { region-before.attlist, empty } +region-after = element fo:region-after { region-after.attlist, empty } +region-start = element fo:region-start { region-start.attlist, empty } +region-end = element fo:region-end { region-end.attlist, empty } + +# =============================================================== +# Page sequence defines the order of choosing page masters to +# accomodate all the contents generated by its fo:flow and +# fo:static-content children, and the way of numbering them. +# =============================================================== +page-sequence = element fo:page-sequence { page-sequence.attlist, page-sequence.content } +page-sequence.content = title?, static-content*, flow + +# =============================================================== +# Title. May not contain out-of-lines. +# =============================================================== +#MEMO: Spec states: +# XSL> Additionally, an fo:title is not permitted to have as a descendant an fo:block-container +# XSL> that generates an absolutely positioned area. +# We prohibit block-level descendants except for those descendats of fo:inline-container. +# This content model shared by fo:leader and fo:inline child of an fo:footnote. +title = element fo:title { title.attlist, title.content } +title.content = inlines-inline* + +# =============================================================== +# Flows. They are just sequences of blocks. 'flow-name' feature +# defines linkage of the flow to a region in the page master. +# =============================================================== +# =============================================================== +# An extension element, rx:flow-section, has been added in order +# to overcome limitations on multicolumn layout imposed by XSL FO +# =============================================================== +#NOTE: We use tricks with nested grammar in order control marker/retrieve-marker +#and outlines appearance inside fo:static-content and fo:flow +#MEMO: We forcedly prohibit side-floats as descendants of ablsoutely positioned +# block-containers. This problem appears due to the 'half-outline' behavior of +# an absolute-container - it cannot contain outlines except for side-float and it cannot +# be nested into any other outlines. +#NOTE: 'Folint' prohibits use of side-floats in static-content that is against the spec. +static-content = element fo:static-content { static-content.attlist, static-content.content } +static-content.content = grammar { + start = blocks+ + include "elements.rnc" { + retrieve-marker = retrieve-marker-real + absolute-container = absolute-container-real + absolute-container.content = parent absolute-container.content + side-float = side-float-real + float.content = parent float.content + leader.content = parent leader.content + } +} + +flow = element fo:flow { flow.attlist, flow.content } +flow.content = grammar { + start =marker*, (blocks | flow-section)+ + include "elements.rnc" { + absolute-container = absolute-container-real + #MEMO: We have two options here: + # * use parent content model which is too strict (side-floats descendants not allowed); + # * use current content model which is too loose (all outline descendants are allowed). + # We prefer stricter mode. + absolute-container.content = parent absolute-container.content + marker = marker-real + marker.content = parent marker.content + side-float = side-float-real + before-float = before-float-real + float.content = parent float.content + footnote = footnote-real + footnote.content = parent footnote.content + #NOTE: fo:leader can't have outlines and marker descendants + leader.content = parent leader.content + } + # Extension element. Acts like a top-level block with multiple columns. + flow-section = element rx:flow-section { flow-section.attlist, flow-section.content } + flow-section.content = blocks+ +} + +#MEMO: Spec prohibits use of fo:leader as a descendant of itself. +# We find this constraint somewhat abusive so we do not enforce it. +# 'Folint' also does not controll this constraint +# However following trick can be used to prevent fo:leader to appear as it's own child. +# (to make it work we have to set leader.content to be notAllowed and move +# actual content into leader.content-real in elements.rnc) +#leader.content |= grammar { +# start = leader.content-real +# include "elements.rnc" { +# leader = notAllowed +# } +#} + diff --git a/plugins/relaxng/testData/highlighting/rnc/fo/mybook.fo b/plugins/relaxng/testData/highlighting/rnc/fo/mybook.fo new file mode 100644 index 000000000000..6d40b186d2eb --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/fo/mybook.fo @@ -0,0 +1,2627 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem Ipsum + + + Table of Contents + + + Chapter 1. Lorem Ipsum + + Consectetuer adipiscing elit + + Morbi a eros + + Nullam dapibus + + + + Vestibulum ante + + + + Donec eleifend + + + Pellentesque augue + + + + Chapter 2. Duis egestas condimentum + + Maecenas at enim + + Curabitur nulla orci + + Maecenas bibendum + + + + faucibus orci + + + + Maecenas scelerisque + + + Dignissim urna + + + + Index + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem Ipsum + + + Nulla scelerisque, nulla turpis + + + + Petri Mäkijärvi, European Synchrotron Radiation Facility + Dr. I. M. Noman, Acme Industries, Inc. + Maxwell Smart, C.O.N.T.R.O.L. + + + + + + + Lorem Ipsum: Nulla scelerisque, nulla turpis + + + by Petri Mäkijärvi, Dr. I. M. Noman, and Maxwell Smart + + $Revision: 1.1 $ + + Published $Date: 2007/09/12 17:12:04 $ + + Copyright + © + 2007 European Synchrotron Radiation Facility + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem Ipsum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem Ipsum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Table of Contents + + + + + + 1. Lorem Ipsum + + + + + + + + + + + + Consectetuer adipiscing elit + + + + + + + + + + + + Morbi a eros + + + + + + + + + + + Vestibulum ante + + + + + + + + + + + + Donec eleifend + + + + + + + + + + + Pellentesque augue + + + + + + + + + + + + 2. Duis egestas condimentum + + + + + + + + + + + + Maecenas at enim + + + + + + + + + + + + Curabitur nulla orci + + + + + + + + + + + faucibus orci + + + + + + + + + + + + Maecenas scelerisque + + + + + + + + + + + Dignissim urna + + + + + + + + + + + + Index + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem Ipsum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem Ipsum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of Figures + + + + + + 1.1. Morbi maecanas sem dui + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Chapter 1. Lorem + Ipsum + + + + + Petri Mäkijärvi + Dr. I. M. Noman + + + $Revision: 1.1 $ + + Published $Date: 2007/09/12 17:12:04 $ + + + + + + + + + + + Consectetuer adipiscing elit + Consectetuer adipiscing elit + + + + + + Lorem ipsum dolor + sit amet, consectetuer adipiscing elit.Curabitur + urna. Maecenas eu nisi faucibus risus ornare + fringilla. Nam laoreet accumsan metus. Maecenas ac nunc non enim consequat + ultrices. Duis egestas condimentum velit. Nulla scelerisque. Nulla turpis. + Nam ante tortor, convallis sit amet, commodo at, dignissim at, dolor. + Proin sodales. Maecenas at enim. Aliquam nunc. Curabitur ullamcorper + molestie neque. Aliquam erat volutpat. Sed non dui et tellus ultrices + porttitor. + + Curabitur rutrum + lobortis orci. Vivamus a urna. Nulla feugiat + euismod massa. In odio quam, posuere at, mattis at, pretium quis, nisi. + Sed eget nibh. Vestibulum ante enim, mattis at, mollis eu, ullamcorper sit + amet, augue. Mauris quam massa, vestibulum rhoncus, bibendum eget, + adipiscing at, enim. Sed pharetra. Praesent ac nibh id massa bibendum + elementum. Sed urna nibh, pharetra in, dapibus at, tristique at, velit. + Maecenas lectus. Pellentesque aliquet pharetra lacus. Aliquam et tellus. + Aenean gravida tristique ipsum. Duis suscipit euismod dolor. Etiam + facilisis mi nec risus. Nam non purus sed nibh cursus luctus. Morbi nunc + sem, hendrerit eu, mattis sit amet, pulvinar nec, nulla. Duis lobortis + metus ut orci. Curabitur facilisis. + + + + + + + + Morbi a eros + + + + + + Cum sociis + natoque penatibus et magnis dis parturient montes, + nascetur ridiculus mus + + + 1 + + + + 1Aenean in odio et dui vestibulum eleifend. Donec aliquet + magna. + + + + . Curabitur nulla orci, porta eget, tincidunt dapibus, + tincidunt sed, ligula. Nunc vel sapien. In nec diam fermentum purus + tincidunt ullamcorper: + + Donec facilisis + aliquet libero. Maecenas sem dui, scelerisque + vitae, convallis at, gravida eu, purus. Proin quis nisl. Mauris ac purus + eu dolor fringilla tempus. Aliquam elementum. In a neque. Praesent + ipsum. Maecenas elementum magna sit amet eros. Praesent non + sapien. + + + + Figure 1.1. Morbi maecanas sem dui + + + + + + + + + + + + + + + Nullam dapibus + + + + + + Mauris et + erat egestas libero volutpat vestibulum. Curabitur + viverra iaculis quam. Nulla egestas dui eget odio. Nam dictum elit in + massa. Phasellus nec elit. Maecenas bibendum. Lorem ipsum dolor sit + amet, consectetuer adipiscing elit. Nullam dapibus, erat suscipit + iaculis porta, turpis arcu laoreet elit, sed ultrices ligula risus eu + velit. Phasellus risus lorem, vulputate vitae, ultricies id, elementum + ut, quam. Donec augue dui, vestibulum vitae, vehicula venenatis, + hendrerit venenatis, mi. Sed at libero eu tortor consequat aliquam. + Donec odio lectus, scelerisque eget, auctor id, tincidunt ac, libero. + Duis interdum hendrerit arcu. Pellentesque habitant morbi tristique + senectus et netus et malesuada fames ac turpis egestas. Etiam + tincidunt feugiat purus. Nulla suscipit libero et dui. Vestibulum + dignissim urna a risus. + + + + + + + + + + Vestibulum ante + + + + + + Vestibulum ante + ipsum primis in faucibus orciluctus et ultrice + + posuere cubilia Curae; Cras purus odio, faucibus + et, euismod sollicitudin, vehicula eu, urna. Mauris tempor. Vivamus sit + amet nisi vel dolor ultricies placerat. Nulla adipiscing feugiat erat. + Pellentesque vulputate posuere pede. Ut id sem at neque commodo + ultricies. Suspendisse sed enim. Nulla facilisi. + Proin + ullamcorper vestibulum tellus. Donec varius scelerisque eros. + Pellentesque feugiat velit et neque. Proin urna neque, interdum sed, + auctor sed, vulputate et, nunc. In cursus nisl. Etiam pharetra, nisl + quis sagittis ultricies, sapien tellus tincidunt ante, in congue mauris + enim eu metus. Suspendisse fringilla elementum libero. Cras nonummy sem + mattis tellus. Praesent faucibus sem eu dui. Nam vel lacus vitae diam + sollicitudin tristique. Nulla facilisi. + + Donec egestas + nisl id neque. Nullamleo leo, bibendum sit amet, + pellentesque sit amet, + sagittis eu, nibh. Praesent malesuada dictum nunc. In interdum imperdiet + felis. Cras rutrum leo sit amet odio. Mauris ultrices, augue sit amet + lacinia sollicitudin, lorem leo euismod elit, in pharetra mauris augue + id turpis. Vestibulum dictum sapien et sapien. Donec eleifend felis quis + leo fringilla consequat. Mauris vitae dolor pretium velit tincidunt + vehicula. Suspendisse facilisis rutrum urna. Proin viverra vulputate + magna. Vivamus massa nibh, eleifend condimentum, elementum eget, + lobortis nec, diam. Phasellus sollicitudin. Donec quis orci ornare felis + cursus porta. Nullam purus lectus, fringilla eu, feugiat vel, tristique + eu, est. + + + + + + + + + + Donec eleifend + Donec eleifend + + + + + + Donec eleifend, + justo ac interdum rutrum, massa ligula convallis + tellus, quis elementum elit lectus eu sapien. Ut metus massa, vehicula ut, + semper ut, eleifend eu, quam. Cras quis augue. Maecenas enim ante, cursus + vestibulum, consectetuer et, dictum sit amet, dolor. Phasellus ultrices + est id est. Maecenas scelerisque nisl quis eros. Vivamus rhoncus. + Pellentesque habitant morbi tristique senectus et netus et malesuada fames + ac turpis egestas. Mauris diam turpis, faucibus non, scelerisque sit amet, + porttitor a, enim. Ut bibendum pulvinar neque. + + Pellentesque + lacinia, eros at dapibus rhoncus, lectus magna pharetra + sapien, sed convallis ligula mi a sapien. Donec tempor libero ut nibh. + Quisque et lectus eu arcu iaculis rutrum. Donec et ligula. Integer gravida + aliquam diam. Curabitur in augue non massa convallis accumsan. Mauris nisl + neque, dictum quis, eleifend nec, ornare a, nisl. Praesent id elit. Mauris + et leo at odio placerat iaculis. Morbi faucibus dictum nibh. + + + + + + + + + Pellentesque augue + Pellentesque augue + + + + + + Quisque molestie + dignissim urna. Donec mattis pellentesque augue. + Nullam neque diam, bibendum ut, placerat nec, pharetra ac, eros. Sed + libero risus, nonummy vitae, tincidunt a, blandit ut, tortor. Nulla quis + libero. Vivamus ac ligula. Proin dignissim, orci ut mattis sodales, lectus + ligula convallis libero, sed feugiat libero odio non massa. Sed elementum. + Nullam id enim. Sed non arcu quis leo vulputate adipiscing. Nam et orci. + Integer sed nunc. Maecenas sem turpis, pulvinar ac, volutpat non, + ultricies rhoncus, tellus. Fusce porttitor. Nullam cursus odio vel nisi + elementum elementum. Integer venenatis. Sed hendrerit, tortor a semper + ultrices, lorem sapien lacinia erat, eu suscipit risus nisl id elit. In + hac habitasse platea dictumst. + + Nulla facilisi. + Morbi imperdiet varius ante. Proin enim est, tempus + eget, laoreet eget, aliquet nec, pede. Aliquam justo risus, luctus vel, + consectetuer in, sollicitudin in, lectus. Donec eu diam et dolor dapibus + sagittis. Aliquam aliquam, neque eget imperdiet lobortis, turpis ligula + elementum pede, eget sodales purus dui nec mi. Integer vel purus. Cras + adipiscing lobortis arcu. Integer commodo. Curabitur pretium, purus a + adipiscing vestibulum, lacus justo faucibus sapien, a sagittis est urna + sit amet est. Nullam diam. Maecenas vulputate, lacus et adipiscing + ultrices, tortor urna euismod arcu, in vestibulum quam nibh nec erat. + Quisque bibendum lorem vitae diam. Nulla lobortis. Nam porttitor, nisl et + convallis mollis, metus nisl euismod nisl, sed adipiscing tortor augue ut + leo. Donec eleifend lorem quis tellus. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Chapter 2. Duis + egestas condimentum + + + + + Petri Mäkijärvi + Maxwell Smart + + + $Revision: 1.1 $ + + Published $Date: 2007/09/12 17:12:04 $ + + + + + + + + + + + Maecenas at enim + Maecenas at enim + + + + + + Aliquam erat + volutpat, consectetuer adipiscing elit.Curabitur + urna. Maecenas eu nisi faucibus risus ornare + fringilla. Nam laoreet accumsan metus. Maecenas ac nunc non enim consequat + ultrices. Duis egestas condimentum velit. Nulla scelerisque. Nulla turpis. + Nam ante tortor, convallis sit amet, commodo at, dignissim at, dolor. + Proin sodales. Maecenas at enim. Aliquam nunc. Curabitur ullamcorper + molestie neque. Aliquam erat volutpat. Sed non dui et tellus ultrices + porttitor. + + Curabitur rutrum + lobortis orci. Vivamus a urna. Nulla feugiat + euismod massa. In odio quam, posuere at, mattis at, pretium quis, nisi. + Sed eget nibh. Vestibulum ante enim, mattis at, mollis eu, ullamcorper sit + amet, augue. Mauris quam massa, vestibulum rhoncus, bibendum eget, + adipiscing at, enim. Sed pharetra. Praesent ac nibh id massa bibendum + elementum. Sed urna nibh, pharetra in, dapibus at, tristique at, velit. + Maecenas lectus. Pellentesque aliquet pharetra lacus. Aliquam et tellus. + Aenean gravida tristique ipsum. Duis suscipit euismod dolor. Etiam + facilisis mi nec risus. Nam non purus sed nibh cursus luctus. Morbi nunc + sem, hendrerit eu, mattis sit amet, pulvinar nec, nulla. Duis lobortis + metus ut orci. Curabitur facilisis. + + + + + + + + Curabitur nulla orci + + + + + + Cum sociis + natoque penatibus et magnis dis parturient montes, + nascetur ridiculus mus + + + 1 + + + + 1Aenean in odio et dui vestibulum eleifend. Donec aliquet + magna. + + + + . Curabitur nulla orci, porta eget, tincidunt dapibus, + tincidunt sed, ligula. Nunc vel sapien. In nec diam fermentum purus + tincidunt ullamcorper: + + Donec facilisis + aliquet libero. Maecenas sem dui, scelerisque + vitae, convallis at, gravida eu, purus. Proin quis nisl. Mauris ac purus + eu dolor fringilla tempus. Aliquam elementum. In a neque. Praesent + ipsum. Maecenas elementum magna sit amet eros. Praesent non + sapien. + + + + + + + + Maecenas bibendum + + + + + + Nulla + facilisi. Morbi imperdiet varius ante. Proin enim est, tempus + eget, laoreet eget, aliquet nec, pede. Aliquam justo risus, luctus vel, + consectetuer in, sollicitudin in, lectus. Donec eu diam et dolor dapibus + sagittis. Aliquam aliquam, neque eget imperdiet lobortis, turpis ligula + elementum pede, eget sodales purus dui nec mi. Integer vel purus. Cras + adipiscing lobortis arcu. Integer commodo. Curabitur pretium, purus a + adipiscing vestibulum, lacus justo faucibus sapien, a sagittis est urna + sit amet est. Nullam diam. Maecenas vulputate, lacus et adipiscing + ultrices, tortor urna euismod arcu, in vestibulum quam nibh nec erat. + Quisque bibendum lorem vitae diam. Nulla lobortis. Nam porttitor, nisl et + convallis mollis, metus nisl euismod nisl, sed adipiscing tortor augue ut + leo. Donec eleifend lorem quis tellus. + + Mauris et + erat egestas libero volutpat vestibulum. Curabitur + viverra iaculis quam. Nulla egestas dui eget odio. Nam dictum elit in + massa. Phasellus nec elit. Maecenas bibendum. Lorem ipsum dolor sit + amet, consectetuer adipiscing elit. Nullam dapibus, erat suscipit + iaculis porta, turpis arcu laoreet elit, sed ultrices ligula risus eu + velit. Phasellus risus lorem, vulputate vitae, ultricies id, elementum + ut, quam. Donec augue dui, vestibulum vitae, vehicula venenatis, + hendrerit venenatis, mi. Sed at libero eu tortor consequat aliquam. + Donec odio lectus, scelerisque eget, auctor id, tincidunt ac, libero. + Duis interdum hendrerit arcu. Pellentesque habitant morbi tristique + senectus et netus et malesuada fames ac turpis egestas. Etiam + tincidunt feugiat purus. Nulla suscipit libero et dui. Vestibulum + dignissim urna a risus. + + + + + + + + + + faucibus orci + + + + + + Vestibulum ante + ipsum primis in faucibus orciluctus et ultrice + + posuere cubilia Curae; Cras purus odio, faucibus + et, euismod sollicitudin, vehicula eu, urna. Mauris tempor. Vivamus sit + amet nisi vel dolor ultricies placerat. Nulla adipiscing feugiat erat. + Pellentesque vulputate posuere pede. Ut id sem at neque commodo + ultricies. Suspendisse sed enim. Nulla facilisi. + Proin + ullamcorper vestibulum tellus. Donec varius scelerisque eros. + Pellentesque feugiat velit et neque. Proin urna neque, interdum sed, + auctor sed, vulputate et, nunc. In cursus nisl. Etiam pharetra, nisl + quis sagittis ultricies, sapien tellus tincidunt ante, in congue mauris + enim eu metus. Suspendisse fringilla elementum libero. Cras nonummy sem + mattis tellus. Praesent faucibus sem eu dui. Nam vel lacus vitae diam + sollicitudin tristique. Nulla facilisi. + + Donec egestas + nisl id neque. Nullamleo leo, bibendum sit amet, + pellentesque sit amet, + sagittis eu, nibh. Praesent malesuada dictum nunc. In interdum imperdiet + felis. Cras rutrum leo sit amet odio. Mauris ultrices, augue sit amet + lacinia sollicitudin, lorem leo euismod elit, in pharetra mauris augue + id turpis. Vestibulum dictum sapien et sapien. Donec eleifend felis quis + leo fringilla consequat. Mauris vitae dolor pretium velit tincidunt + vehicula. Suspendisse facilisis rutrum urna. Proin viverra vulputate + magna. Vivamus massa nibh, eleifend condimentum, elementum eget, + lobortis nec, diam. Phasellus sollicitudin. Donec quis orci ornare felis + cursus porta. Nullam purus lectus, fringilla eu, feugiat vel, tristique + eu, est. + + + + + + + + + + Maecenas scelerisque + Maecenas scelerisque + + + + + + Donec eleifend, + justo ac interdum rutrum, massa ligula convallis + tellus, quis elementum elit lectus eu sapien. Ut metus massa, vehicula ut, + semper ut, eleifend eu, quam. Cras quis augue. Maecenas enim ante, cursus + vestibulum, consectetuer et, dictum sit amet, dolor. Phasellus ultrices + est id est. Maecenas scelerisque nisl quis eros. Vivamus rhoncus. + Pellentesque habitant morbi tristique senectus et netus et malesuada fames + ac turpis egestas. Mauris diam turpis, faucibus non, scelerisque sit amet, + porttitor a, enim. Ut bibendum pulvinar neque. + + Pellentesque + lacinia, eros at dapibus rhoncus, lectus magna pharetra + sapien, sed convallis ligula mi a sapien. Donec tempor libero ut nibh. + Quisque et lectus eu arcu iaculis rutrum. Donec et ligula. Integer gravida + aliquam diam. Curabitur in augue non massa convallis accumsan. Mauris nisl + neque, dictum quis, eleifend nec, ornare a, nisl. Praesent id elit. Mauris + et leo at odio placerat iaculis. Morbi faucibus dictum nibh. + + + + + + + + + Dignissim urna + Dignissim urna + + + + + + Quisque molestie + dignissim urna. Donec mattis pellentesque augue. + Nullam neque diam, bibendum ut, placerat nec, pharetra ac, eros. Sed + libero risus, nonummy vitae, tincidunt a, blandit ut, tortor. Nulla quis + libero. Vivamus ac ligula. Proin dignissim, orci ut mattis sodales, lectus + ligula convallis libero, sed feugiat libero odio non massa. Sed elementum. + Nullam id enim. Sed non arcu quis leo vulputate adipiscing. Nam et orci. + Integer sed nunc. Maecenas sem turpis, pulvinar ac, volutpat non, + ultricies rhoncus, tellus. Fusce porttitor. Nullam cursus odio vel nisi + elementum elementum. Integer venenatis. Sed hendrerit, tortor a semper + ultrices, lorem sapien lacinia erat, eu suscipit risus nisl id elit. In + hac habitasse platea dictumst. + + Nulla facilisi. + Morbi imperdiet varius ante. Proin enim est, tempus + eget, laoreet eget, aliquet nec, pede. Aliquam justo risus, luctus vel, + consectetuer in, sollicitudin in, lectus. Donec eu diam et dolor dapibus + sagittis. Aliquam aliquam, neque eget imperdiet lobortis, turpis ligula + elementum pede, eget sodales purus dui nec mi. Integer vel purus. Cras + adipiscing lobortis arcu. Integer commodo. Curabitur pretium, purus a + adipiscing vestibulum, lacus justo faucibus sapien, a sagittis est urna + sit amet est. Nullam diam. Maecenas vulputate, lacus et adipiscing + ultrices, tortor urna euismod arcu, in vestibulum quam nibh nec erat. + Quisque bibendum lorem vitae diam. Nulla lobortis. Nam porttitor, nisl et + convallis mollis, metus nisl euismod nisl, sed adipiscing tortor augue ut + leo. Donec eleifend lorem quis tellus. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index + + + + + + + + C + + + Curabitur + + urna, + + + + , + + + + + + (see also Consectetuer) + + + + + + L + + + leo leo, + + + + , + + + + + luctus + + ultirce, + + + + - + + + + , + + + + + + + + + U + + + ultricie, + + + + , + + + + + + + + + + diff --git a/plugins/relaxng/testData/highlighting/rnc/fo/properties.rnc b/plugins/relaxng/testData/highlighting/rnc/fo/properties.rnc new file mode 100644 index 000000000000..8aef991d8895 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/fo/properties.rnc @@ -0,0 +1,658 @@ +# ========================================================= +# +# (c) 2004, RenderX +# +# Author: Alexander Peshkov +# +# Permission is granted to use this document, copy and +# modify free of charge, provided that every derived work +# bear a reference to the present document. +# +# This document contains a computer program written in +# XSL Transformations Language. It is published with no +# warranty of any kind about its usability, as a mere +# example of XSL technology. RenderX shall not be +# considered liable for any damage or loss of data caused +# by use of this program. +# +# ========================================================= + +namespace local = "" +default namespace fo = "http://www.w3.org/1999/XSL/Format" +namespace rx = "http://www.renderx.com/XSL/Extensions" + +include "properties_groups.rnc" + +# **************************************************************************************** +# Properties used by top-level elements +# **************************************************************************************** +# =============================================================== +# Root element can bear inheritable properties, passed further to +# fo:flows/fo:static-contents. Inheritable properties from fo:layout-master-set +# are banned in this version of schema. +# =============================================================== +root.attlist = + media-usage.attr?, + inheritable-properties + +# =============================================================== +# Document meta information - RenderX extension +# =============================================================== +meta-info.attlist = empty + +meta-field.attlist = + name.attr, + value.attr + +# =============================================================== +# Color profile declarations +# =============================================================== +declarations.attlist = empty + +color-profile.attlist = + src.attr, + color-profile-name.attr, + rendering-intent.attr? + +# =============================================================== +# Bookmarks - RenderX extension +# =============================================================== +outline.attlist = empty + +bookmark.attlist = + (internal-destination.attr | external-destination.attr), + collapse-subtree.attr? + +bookmark-label.attlist = empty + +# =============================================================== +# Layout-master-set contains a set of page-masters. Neither of +# its descendants generates any area, so no inherited elements +# can be specified on it or on its children. +# =============================================================== +layout-master-set.attlist = empty + +# =============================================================== +# Page sequence master +# =============================================================== +page-sequence-master.attlist = master-name.attr + +# =============================================================== +# Sequence specifiers. +# =============================================================== +single-page-master-reference.attlist = master-reference.attr + +repeatable-page-master-reference.attlist = + master-reference.attr, + maximum-repeats.attr? + +repeatable-page-master-alternatives.attlist = maximum-repeats.attr? + +conditional-page-master-reference.attlist = + master-reference.attr, + page-position.attr?, + odd-or-even.attr?, + blank-or-not-blank.attr? + +# =============================================================== +# Simple page master defines a page layout. It does not +# explicitly generate any content. Most of its properties are +# local except for writing-mode and reference-orientation that +# are inherited by the underlying region-* objects. +# =============================================================== +# NOTE. We could think about a common background/padding/border +# for every page instance generated by the page master. For such +# a scope, we may add borders/padding/background to its features. +# However, in the current version this is ruled out explicitly by the XSL specs. + +simple-page-master.attlist = + margin-properties-CSS, + master-name.attr, + page-height.attr?, + page-width.attr?, + reference-orientation.attr?, + size.attr?, + writing-mode.attr? + +# =============================================================== +# Region elements by themselves do not generate any content. +# Reference-orientation and writing-mode may be inherited from +# the page master; all other features are local. +# =============================================================== + +region-properties = + border-padding-background-properties, + area-properties, + region-name.attr? + +# =============================================================== +# Body region: middle of the page. Unlike side regions, this one +# may have multiple columns. +# =============================================================== +# NOTE: We have restricted margin properties to be margin-only, +# allowing no spaces. This is done because no clear semantics +# can be ascribed to single components of a space vector. + +region-body.attlist = + region-properties, + margin-properties-CSS, + column-count.attr?, + column-gap.attr? + +# =============================================================== +# Side regions: page edges. These regions have extent and +# precedence that is used to arbitrate corner conflicts. Side +# regions are viewed as frames, and may not have margins. +# =============================================================== +# NOTE: Extent made obligatory: its default value of 0.0pt does not +# make much sense. +region-before.attlist = + region-properties, + extent.attr, + precedence.attr? + +region-after.attlist = + region-properties, + extent.attr, + precedence.attr? + +region-start.attlist = + region-properties, + extent.attr + +region-end.attlist = + region-properties, + extent.attr + +# =============================================================== +# Page sequence. +# =============================================================== +page-sequence.attlist = + format.attr?, + letter-value.attr?, + grouping-separator.attr?, + grouping-size.attr?, + id.attr?, + rx-key.attr?, + initial-page-number.attr?, + force-page-count.attr?, + master-reference.attr, + inheritable-properties + +# =============================================================== +# Title +# =============================================================== +#MEMO: Why 'id' attribute is not allowed here? +#MEMO: Does it makes sence to add relative-position here? +# According to Section 7.12.1. "relative-position" it is allowed everywhere except fo:block-container +#Should we allow all inline properties here?? +title.attlist = + accessibility-properties, + aural-properties-unheritable, + border-padding-background-properties, + margin-properties-inline, + inheritable-properties + +# =============================================================== +# Flows. 'flow-name' feature defines linkage of the flow to a region in the page master. +# =============================================================== +flow-properties = + id.attr?, + rx-key.attr?, + flow-name.attr, + inheritable-properties + +flow.attlist = flow-properties +static-content.attlist = flow-properties + +# =============================================================== +# An extension element, rx:flow-section. +# Acts like a top-level block with multiple columns. +# =============================================================== +flow-section.attlist = + column-count.attr?, + column-gap.attr?, + border-padding-background-properties, + margin-properties-block, + inheritable-properties + +# **************************************************************************************** +# Properties used by content-bearing elements +# **************************************************************************************** + +# =============================================================== +# Properties of block formatting objects. +# =============================================================== +# =============================================================== +# Besides properties used to format the block itself, it also conveys +# formatting information to its inline-level children. +# =============================================================== +block.attlist = + block-properties, + character-properties-unheritable, + text-altitude.attr?, + text-depth.attr? + +# =============================================================== +# Block container +# =============================================================== + +#MEMO: We are forced to create separate element 'absolute-container' in order +# to satisfy XSL FO spec requirements. +absolute-container.attlist = + absolute-position-properties, + area-properties-unheritable, + box-size-properties, + common-block-properties, + z-index.attr? + +# 'Usual' container element +#MEMO: XSLFO spec prohibits use of 'relative-position' for fo:block-container, +# but we believe that it should be allowed for non-absolutely positioned containers. +block-container.attlist = + area-properties-unheritable, + box-size-properties, + block-properties, + container-position.attr?, + z-index.attr? + +# =============================================================== +# Properties of inline formatting objects. +# =============================================================== +# =============================================================== +# Unicode bidi-override +# =============================================================== +#MEMO: This element is 'half-inline' accroding to spec, since it's exhibits the same +# bahavior and used in the same context but yet cannot carry some of inline-level +# properties such as margins and border. +# We use the same set of properties as for inline here (except for unicode-bidi and +# width properties) since we believe that this is a typical inline element. +# Moreover fo:bidi-override is redundant from semantic point of view since it do not +# carry any additional information compared to regular fo:inline - just add +# 'unicode-bidi' to fo:inline and you do not need fo:bidi-override anymore. +bidi-override.attlist = + inline-properties, + unicode-bidi.attr? +#MEMO: 'Folint' believes that direction property is required for fo:bidi-override, +# but this is against the spec since this property can be inherited. + +# =============================================================== +# Single character +# =============================================================== +character.attlist = + character.attr, + suppress-at-line-break.attr?, + treat-as-word-space.attr?, + common-inline-properties + +# =============================================================== +# Initial property set specifies properties for one or more lines +# =============================================================== +#MEMO: Spec is contradictory here. It states that use of this object is equivalent to +# the fo:wrapper around the first line. At the same time spec allows on this element +# such properties as 'Common Border, Padding, and Background Properties' +# - fo:wrapper can't have border/padding/etc and can bear inheritable properties only. +# We believe that this element should be treated as inline and thus should have +# appropriate properties set. +initial-property-set.attlist = + common-inline-properties + +# =============================================================== +# External graphic +# =============================================================== +external-graphic.attlist = + graphic-properties, + src.attr? + +# =============================================================== +# In-stream graphic +# =============================================================== +instream-foreign-object.attlist = + graphic-properties + +# =============================================================== +# Inline +# =============================================================== +inline.attlist = + height-properties, + inline-properties + +# =============================================================== +# Inline container +# =============================================================== +# FIXME! We believe that this element should not bear not-inheritable properties, +# which applies to text since it can't have text children. +# Therefor we do not use 'common-inline-properties' set. +inline-container.attlist = + id.attr?, + rx-key.attr?, + accessibility-properties, + aural-properties-unheritable, + area-alignment-properties, + border-padding-background-properties, + keeps-properties-atomic, + margin-properties-inline, + relative-position-properties, + area-properties-unheritable, + box-size-properties, + inheritable-properties + +# =============================================================== +# Leader +# =============================================================== +leader.attlist = + inline-properties + +#MEMO: Note that 'inline-properties' includes block-level inheritable properties. +# But it's OK in our content-model since it allows block-level descendants wrapped +# into fo:inline-container. +# At the same time block-level inheritable properties includes leader properties, +# since they are inheritable... + +# =============================================================== +# Page Number +# =============================================================== +page-number.attlist = + common-inline-properties, + wrap-option.attr? + +# =============================================================== +# Page number citation +# =============================================================== +page-number-citation.attlist = + common-inline-properties, + wrap-option.attr?, + ref-id.attr + +# =============================================================== +# Atomic elements for index ranges markup +# =============================================================== +begin-index-range.attlist = id.attr, rx-key.attr +end-index-range.attlist = ref-id.attr + +# =============================================================== +# Page number list - index entry +# =============================================================== +page-index.attlist = + common-inline-properties, + wrap-option.attr?, + list-separator.attr?, + ref-key.attr? +#MEMO: There is no 'ref-key' attribute on page-index now, but it is allowed for +# backward compatibility. +#MEMO: Actually it makes sense to exclude id/rx:key fom the set of availabe properties +# for 'index-item', however we prefer no to do it just to avoid creation of yet another content +# model (attribute set) for thid inline element. +index-item.attlist = + common-inline-properties, + wrap-option.attr?, + ref-key.attr, + link-back.attr?, + range-separator.attr?, + merge-subsequent-page-numbers.attr? + +# =============================================================== +# Properties of table formatting objects. +# =============================================================== +# =============================================================== +# Table & Caption. +# =============================================================== +table-and-caption.attlist = + common-block-properties, + clear.attr?, + relative-position-properties, + keeps-and-breaks-properties-atomic + +#MEMO: Spec do not allows margins on fo:table-caption that is against common sence +# since this is a typical container. +# We do allow margins (they are included in common-block-properties). +# 'Folint' does the same. +table-caption.attlist = + clear.attr?, + common-block-properties, + relative-position-properties, + box-size-properties + +table.attlist = + clear.attr?, + common-block-properties, + box-size-properties, + keeps-and-breaks-properties-atomic, + table-properties-unheritable + +# =============================================================== +# Table column specifies common properties to ascribe to all +# cells in a column *or a group of columns*. Note that, if both +# 'number-columns-repeated' and 'number-columns-spanned' exceed +# 1, the column counter is increased by 'number-columns-spanned'. +# it means that you only set properties for columns: +# 'column-number' +# 'column-number' + 'number-columns-spanned' +# 'column-number' + 2 * 'number-columns-spanned' +# and so on, leaving default properties for intermediate columns. +# =============================================================== +table-column.attlist = + column-number.attr?, + column-width.attr?, + number-columns-repeated.attr?, + number-columns-spanned.attr?, + background-properties, +#MEMO: Border properties applies to this formatting object only if the value of border-collapse +# for the table is "collapse" or "collapse-with-precedence" + border-properties, + border-precedence-properties, + inheritable-properties + +# =============================================================== +# Table header, table footer, and table body. +# =============================================================== +row-group.attlist = + id.attr?, + rx-key.attr?, + accessibility-properties, + aural-properties-unheritable, + background-properties, +#MEMO: Border properties applies to this formatting object only if the value of border-collapse +# for the table is "collapse" or "collapse-with-precedence" + border-properties, + border-precedence-properties, + relative-position-properties, + inheritable-properties + +table-header.attlist = row-group.attlist +table-footer.attlist = row-group.attlist +#MEMO: Spec do not list "Keep" properties almong applicable to fo:table-body that is a clear +# case of errata. +table-body.attlist = + row-group.attlist, + keeps-and-breaks-properties-atomic + +# =============================================================== +# Table row. +# =============================================================== +#MEMO: Should we create separate collection of properties in 'properties_groups.rnc' +# based on row-group.attlist? +table-row.attlist = + row-group.attlist, + height-properties, + keeps-and-breaks-properties-atomic + +# =============================================================== +# Table cell. +# =============================================================== +#MEMO: Spec do not allows margins on fo:table-cell but 'Folint' does. +# We excluded margins from this element and therefor don't use 'common-block-properties' +#MEMO: Spec do not list "Keep" properties almong applicable to fo:table-cell that is a clear +# case of errata. +table-cell.attlist = + id.attr?, + rx-key.attr?, + column-number.attr?, + accessibility-properties, + aural-properties-unheritable, + border-padding-background-properties, + border-precedence-properties, + box-size-properties, + ends-row.attr?, + keeps-and-breaks-properties-atomic, + number-columns-spanned.attr?, + number-rows-spanned.attr?, + starts-row.attr?, + inheritable-properties + +# =============================================================== +# Properties of list formatting objects. +# =============================================================== +# =============================================================== +# List block. +# =============================================================== +list-block.attlist = + clear.attr?, + common-block-properties, + keeps-and-breaks-properties-atomic, + relative-position-properties + +# =============================================================== +# List item. +# =============================================================== +list-item.attlist = + common-block-properties, + keeps-and-breaks-properties-atomic, + relative-position-properties + +# =============================================================== +# List item label and list item body +# =============================================================== +list-item-label.attlist = + id.attr?, + rx-key.attr?, + accessibility-properties, + inheritable-properties + +list-item-body.attlist = + id.attr?, + rx-key.attr?, + accessibility-properties, + inheritable-properties + +# =============================================================== +# Floats and footnotes. +# =============================================================== +#MEMO: Outlines can't have id and therefor can't have rx:key properties so we are strict here. +# 'Folint' is loose here - it allows use of these properties. +#MEMO: We are forced to create two types of floats: side-floats and before-floats. +side-float.attlist = + side-float.attr?, + clear.attr?, + inheritable-properties +# NOTE: before-float can't bear 'clear' property +before-float.attlist = + before-float.attr?, + inheritable-properties + +footnote.attlist = + accessibility-properties, + inheritable-properties + +footnote-body.attlist = + accessibility-properties, + inheritable-properties + +# =============================================================== +# Simple link. +# =============================================================== +basic-link.attlist = + inline-properties, + external-destination.attr?, + internal-destination.attr?, + indicate-destination.attr?, + show-destination.attr?, + destination-placement-offset.attr?, + target-processing-context.attr?, + target-presentation-context.attr?, + target-stylesheet.attr? + +# =============================================================== +# Wrappers. +# =============================================================== +wrapper.attlist = + id.attr?, + rx-key.attr?, + inheritable-properties + +# =============================================================== +# Marker. This element may embrace any content but cannot pass +# properties to its children; so, it may not have features other +# than marker-class-name. +# =============================================================== +#MEMO: We are more strict here making marker-class-name attribute a mandatory, +# but marker with no marker-class-name is meaningless. +marker.attlist = marker-class-name.attr + +# =============================================================== +# Marker retrieval. +# =============================================================== +# FIXME! We are more strict here making retrieve-class-name attribute a mandatory, +# but marker with no retrieve-class-name is meaningless. +retrieve-marker.attlist = + retrieve-class-name.attr, + retrieve-position.attr?, + retrieve-boundary.attr?, + #MEMO: Is it OK to allow inheritable properties here? There are no explicit arguments + # against it in the spec. + inheritable-properties + +# =============================================================== +# Multistate stuff. +# =============================================================== +# =============================================================== +# Switch. +# =============================================================== +#MEMO: Should we have Aural Properties here as well? +multi-switch.attlist = + id.attr?, + rx-key.attr?, + auto-restore.attr?, + accessibility-properties, + inheritable-properties + +# =============================================================== +# Single case. +# =============================================================== +multi-case.attlist = + id.attr?, + rx-key.attr?, + starting-state.attr?, + case-name.attr?, + case-title.attr?, + accessibility-properties, + inheritable-properties + +# =============================================================== +# Toggle. +# =============================================================== +#MEMO: Should we have here inline-level properties only? +multi-toggle.attlist = + switch-to.attr?, + accessibility-properties, + inheritable-properties + +# =============================================================== +# Multi-properties. +# =============================================================== +#Should we allow here any possible properties applicable to the objects inside of the flow? +multi-properties.attlist = + id.attr?, + rx-key.attr?, + accessibility-properties, + inheritable-properties + +# =============================================================== +# Multi property set. +# =============================================================== +#Should we allow here any possible properties applicable to the objects inside of the flow? +multi-property-set.attlist = + id.attr?, + rx-key.attr?, + active-state.attr, + inheritable-properties diff --git a/plugins/relaxng/testData/highlighting/rnc/fo/properties_groups.rnc b/plugins/relaxng/testData/highlighting/rnc/fo/properties_groups.rnc new file mode 100644 index 000000000000..dab15a764859 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/fo/properties_groups.rnc @@ -0,0 +1,562 @@ +# ========================================================= +# +# (c) 2004, RenderX +# +# Author: Alexander Peshkov +# +# Permission is granted to use this document, copy and +# modify free of charge, provided that every derived work +# bear a reference to the present document. +# +# This document contains a computer program written in +# XSL Transformations Language. It is published with no +# warranty of any kind about its usability, as a mere +# example of XSL technology. RenderX shall not be +# considered liable for any damage or loss of data caused +# by use of this program. +# +# ========================================================= + +namespace local = "" +default namespace fo = "http://www.w3.org/1999/XSL/Format" +namespace rx = "http://www.renderx.com/XSL/Extensions" + +include "basic_properties.rnc" + +# =============================================================== +# Properties grouping. Groups used by different elements classes +# =============================================================== + + +# =============================================================== +# Entity definitions for common groups of properties +# This grouping reflects properties co occurrence, rather than +# property semantics. It does not correspond to grouping in the +# spec. +# =============================================================== + +# Accessibility Properties +accessibility-properties = + source-document.attr?, + role.attr? +#MEMO: XSLFO is selfcontradictory: +# Those properties allowed on all inline elements excep to for fo:character, fo:bidi-override and fo:inline-conteiner +# At the same time spec says about those properties: +# XSL> It is used by all formatting objects that can be contained in fo:flow or fo:static-content (all formatting +# XSL> objects that can be directly created from an XML source element). +# Thus they must be present on fo:character, fo:bidi-override, fo:inline-conteiner as well +# (there are more elements missing these properties) +# Note also, that comment in the round brackets seems to be meaningless. + +# Relative Position Properties +# 'position' shorthand property also makes part of this group +relative-position-properties = + relative-position.attr?, + relative-position-shorthand.attr? + +# Absolute Position Properties +absolute-position-properties = + absolute-position.attr, + absolute-position-shorthand.attr?, + top.attr?, + right.attr?, + bottom.attr?, + left.attr? + +# Aural Properties +# 'cue' and 'pause' shorthand properties are also included +#MEMO: XSLFO is selfcontradictory here in the same way +# it is for Accessibility Properties - Aural properties allowed everywhere +# but yet not specified on some elements, e.g. fo:block-container or fo:inline-container. +# We believe this is an omission and therefor those properties are available everywhere. +aural-properties-inheritable = + azimuth.attr?, + elevation.attr?, + pitch.attr?, + pitch-range.attr?, + play-during.attr?, + richness.attr?, + speak.attr?, + speak-header.attr?, + speak-numeral.attr?, + speak-punctuation.attr?, + speech-rate.attr?, + stress.attr?, + voice-family.attr?, + volume.attr? +aural-properties-unheritable = + cue.attr?, + cue-after.attr?, + cue-before.attr?, + pause.attr?, + pause-after.attr?, + pause-before.attr? +aural-properties = aural-properties-inheritable, aural-properties-unheritable + +# Common Border, Padding, and Background Properties +# Related shorthand properties are also included +border-properties = + border.attr?, + border-after-color.attr?, + border-after-style.attr?, + border-after-width.attr?, + border-after-width.length.attr?, + border-after-width.conditionality.attr?, + border-before-color.attr?, + border-before-style.attr?, + border-before-width.attr?, + border-before-width.length.attr?, + border-before-width.conditionality.attr?, + border-bottom.attr?, + border-bottom-color.attr?, + border-bottom-style.attr?, + border-bottom-width.attr?, + border-bottom-width.length.attr?, + border-bottom-width.conditionality.attr?, + border-color.attr?, + border-end-color.attr?, + border-end-style.attr?, + border-end-width.attr?, + border-end-width.length.attr?, + border-end-width.conditionality.attr?, + border-left.attr?, + border-left-color.attr?, + border-left-style.attr?, + border-left-width.attr?, + border-left-width.length.attr?, + border-left-width.conditionality.attr?, + border-right.attr?, + border-right-color.attr?, + border-right-style.attr?, + border-right-width.attr?, + border-right-width.length.attr?, + border-right-width.conditionality.attr?, + border-start-color.attr?, + border-start-style.attr?, + border-start-width.attr?, + border-start-width.length.attr?, + border-start-width.conditionality.attr?, + border-style.attr?, + border-top.attr?, + border-top-color.attr?, + border-top-style.attr?, + border-top-width.attr?, + border-top-width.length.attr?, + border-top-width.conditionality.attr?, + border-width.attr? + +padding-properties = + padding.attr?, + padding-after.attr?, + padding-after.length.attr?, + padding-after.conditionality.attr?, + padding-before.attr?, + padding-before.length.attr?, + padding-before.conditionality.attr?, + padding-bottom.attr?, + padding-bottom.length.attr?, + padding-bottom.conditionality.attr?, + padding-end.attr?, + padding-end.length.attr?, + padding-end.conditionality.attr?, + padding-left.attr?, + padding-left.length.attr?, + padding-left.conditionality.attr?, + padding-right.attr?, + padding-right.length.attr?, + padding-right.conditionality.attr?, + padding-start.attr?, + padding-start.length.attr?, + padding-start.conditionality.attr?, + padding-top.attr?, + padding-top.length.attr?, + padding-top.conditionality.attr? + +background-properties = + background.attr?, + background-attachment.attr?, + background-color.attr?, + background-image.attr?, + background-position.attr?, + background-position-vertical.attr?, + background-position-horizontal.attr?, + background-repeat.attr?, + rx-background-content-type.attr?, + rx-background-content-height.attr?, + rx-background-content-width.attr?, + rx-background-scaling.attr? + +border-padding-background-properties = + border-properties, + padding-properties, + background-properties + +# Border Precedence Properties for tables +border-precedence-properties = + border-after-precedence.attr?, + border-before-precedence.attr?, + border-end-precedence.attr?, + border-start-precedence.attr? + +# Box Size Properties +height-properties = + height.attr?, + min-height.attr?, + max-height.attr?, + block-progression-dimension.attr?, + block-progression-dimension.minimum.attr?, + block-progression-dimension.optimum.attr?, + block-progression-dimension.maximum.attr? + +width-properties = + width.attr?, + min-width.attr?, + max-width.attr?, + inline-progression-dimension.attr?, + inline-progression-dimension.minimum.attr?, + inline-progression-dimension.optimum.attr?, + inline-progression-dimension.maximum.attr? + +box-size-properties = + height-properties, + width-properties + +# Common Area Properties +area-properties-inheritable = + display-align.attr?, + reference-orientation.attr?, + writing-mode.attr? +area-properties-unheritable = + clip.attr?, + overflow.attr? +area-properties = area-properties-inheritable, area-properties-unheritable + +# Common Font Properties +# 'font' shorthand property is also included +font-properties = + font.attr?, + font-selection-strategy.attr?, + font-family.attr?, + font-size.attr?, + font-size-adjust.attr?, + font-stretch.attr?, + font-style.attr?, + font-variant.attr?, + font-weight.attr? + +# Common Hyphenation Properties - Inline +# 'xml:lang' shorthand property is also included +hyphenation-properties-inline = + country.attr?, + language.attr?, + script.attr?, + attribute xml:lang { text }?, + hyphenate.attr?, + hyphenation-character.attr?, + hyphenation-push-character-count.attr?, + hyphenation-remain-character-count.attr? +# Common Hyphenation Properties - Block +hyphenation-properties-block = + hyphenation-keep.attr?, + hyphenation-ladder-count.attr? +hyphenation-properties = hyphenation-properties-inline, hyphenation-properties-block + +# Common CSS Margin Properties +# 'margin' shorthand property is also included +margin-properties-CSS = + margin.attr?, + margin-bottom.attr?, + margin-left.attr?, + margin-right.attr?, + margin-top.attr? + +# Common Margin Properties - Block +margin-properties-inheritable = + start-indent.attr?, + end-indent.attr? + +margin-properties-block = + margin-properties-CSS, + space-after.attr?, + space-after.minimum.attr?, + space-after.optimum.attr?, + space-after.maximum.attr?, + space-after.precedence.attr?, + space-after.conditionality.attr?, + space-before.attr?, + space-before.minimum.attr?, + space-before.optimum.attr?, + space-before.maximum.attr?, + space-before.precedence.attr?, + space-before.conditionality.attr? + +# Common Margin Properties - Inline +margin-properties-inline = + margin-properties-CSS, + space-start.attr?, + space-start.minimum.attr?, + space-start.optimum.attr?, + space-start.maximum.attr?, + space-start.precedence.attr?, + space-start.conditionality.attr?, + space-end.attr?, + space-end.minimum.attr?, + space-end.optimum.attr?, + space-end.maximum.attr?, + space-end.precedence.attr?, + space-end.conditionality.attr? + +# Area Alignment Properties +# 'vertical-align' shorthand is added +# 'relative-align' - excluded +area-alignment-properties = + alignment-adjust.attr?, + alignment-baseline.attr?, + baseline-shift.attr?, + dominant-baseline.attr?, + vertical-align.attr? + +# Line Height Properties +line-height-properties = + line-height.attr?, + line-height.minimum.attr?, + line-height.optimum.attr?, + line-height.maximum.attr?, + line-height.precedence.attr?, + line-height.conditionality.attr?, + line-height-shift-adjustment.attr? + +# Line Related Properties +line-related-properties = + text-align.attr?, + text-align-last.attr?, + text-indent.attr?, + last-line-end-indent.attr?, + line-stacking-strategy.attr?, + linefeed-treatment.attr?, + white-space.attr?, + white-space-treatment.attr?, + white-space-collapse.attr?, + wrap-option.attr?, + direction.attr? + +# Character Properties +character-properties-inheritable = + letter-spacing.attr?, + letter-spacing.minimum.attr?, + letter-spacing.optimum.attr?, + letter-spacing.maximum.attr?, + letter-spacing.precedence.attr?, + letter-spacing.conditionality.attr?, + word-spacing.attr?, + word-spacing.minimum.attr?, + word-spacing.optimum.attr?, + word-spacing.maximum.attr?, + word-spacing.precedence.attr?, + word-spacing.conditionality.attr?, + glyph-orientation-horizontal.attr?, + glyph-orientation-vertical.attr?, + score-spaces.attr?, + text-transform.attr? +character-properties-unheritable= +#MEMO: There is a problem with these two properties in XSL FO spec. +# They are assumed to be allowed everywhere but somehow on of them +# missing on fo:inline, another on fo:leader and both absent on fo:bidi-override. +# They are not present on fo:block also. +# We suppose that those omissions are erratic. and allow them on all elements that can cotain text. +# It makes sence to allow text-decoration on the graphical inlines also. + text-decoration.attr?, + text-shadow.attr? + #NOTE: Those properties apllies to char elements but they are already included into 'inheritable-properties' set + #font-properties, + #line-height-properties +character-properties = character-properties-inheritable, character-properties-unheritable + +# Common Keeps and Breaks Properties - Atomic objects +# Keeps only +keeps-properties-atomic = + keep-with-next.attr?, + keep-with-next.within-line.attr?, + keep-with-next.within-column.attr?, + keep-with-next.within-page.attr?, + keep-with-previous.attr?, + keep-with-previous.within-line.attr?, + keep-with-previous.within-column.attr?, + keep-with-previous.within-page.attr? + +# Common Keeps and Breaks Properties - Atomic objects +# Keeps and Breaks +# 'page-break-*' shorthand properties are also included +keeps-and-breaks-properties-atomic = + keeps-properties-atomic, + break-after.attr?, + break-before.attr?, + page-break-after.attr?, + page-break-before.attr? + +# Common Keeps and Breaks Properties - Inline +# 'page-break-inside' shorthand property is also included +keeps-and-breaks-properties-inline-inheritable = + keep-together.attr?, + keep-together.within-line.attr?, + keep-together.within-column.attr?, + keep-together.within-page.attr?, + page-break-inside.attr? + +#MEMO: Do we really need separate block and inline groups here + +# Common Keeps and Breaks Properties - Block +keeps-and-breaks-properties-block-inheritable = + orphans.attr?, + widows.attr? + +# Leader and Rule Properties +leader-properties = + leader-alignment.attr?, + leader-pattern.attr?, + leader-pattern-width.attr?, + leader-length.attr?, + leader-length.minimum.attr?, + leader-length.optimum.attr?, + leader-length.maximum.attr?, + rule-style.attr?, + rule-thickness.attr? + +# Table Properties +# 'border-spacing' shorthand property is also included +# 'inherit' property added to table-omit-...er-at-break +table-properties-inheritable = + border-collapse.attr?, + border-spacing.attr?, + border-separation.attr?, + border-separation.inline-progression-direction.attr?, + border-separation.block-progression-direction.attr?, + caption-side.attr?, + empty-cells.attr? +table-properties-unheritable = + table-layout.attr?, + table-omit-header-at-break.attr?, + table-omit-footer-at-break.attr?, + rx-table-omit-initial-header.attr? +table-properties = table-properties-inheritable, table-properties-unheritable + +# List Properties +list-properties = + provisional-distance-between-starts.attr?, + provisional-label-separation.attr? + +# Visibility Properties +# NOTE: 'visibility' is inheritable, but 'z-index' is not. +visibility-properties = visibility.attr?, z-index.attr? + +# =============================================================== +# Set of 'explicitly' inheritable properties. This includes attributes +# marked as inheritable in the spec only! +# We define two sets of inheritable properties: +# 1. Basic properties applicable to inline-level elements with character-only content +# 2. Full set of inheritable properties +# =============================================================== +inheritable-properties-inline = + aural-properties-inheritable, + color.attr?, + character-properties-inheritable, + font-properties, + hyphenation-properties-inline, + line-height-properties, + visibility.attr? + +inheritable-properties-block = + table-properties-inheritable, + area-properties-inheritable, + hyphenation-properties-block, + margin-properties-inheritable, + intrusion-displace.attr?, + # 'intrusion-displace' applies to: fo:block, fo:block-container, fo:table-and-caption, fo:table, fo:table-caption, fo:list-block, fo:list-item. + keeps-and-breaks-properties-inline-inheritable, + keeps-and-breaks-properties-block-inheritable, + leader-properties, + #MEMO: Should we move this one to inheritable-properties-inline? + line-related-properties, + list-properties, + relative-align.attr? #NOTE: Property 'relative-align' applies to fo:list-item and fo:table-cell only. + +inheritable-properties = + inheritable-properties-inline, + inheritable-properties-block + +# =============================================================== +# Common property subsets. +# =============================================================== +# Common block properties (those properties applies to any type of block-container as well +common-block-properties = + id.attr?, + rx-key.attr?, + accessibility-properties, + aural-properties-unheritable, + border-padding-background-properties, + margin-properties-block, + inheritable-properties + +# Properties for fo:block and fo:block-container +block-properties = + common-block-properties, + clear.attr?, + span.attr?, + keeps-and-breaks-properties-atomic, + relative-position-properties + +# Common inline properties +#MEMO: Spec says that text-altitude/text-depth applicable only to +# fo:block, fo:character, fo:leader, fo:page-number, fo:page-number-citation +# We believe this is an omission and they must be allowed on all elements +# that can have text children. +common-inline-properties = + id.attr?, + rx-key.attr?, + accessibility-properties, + aural-properties-unheritable, + area-alignment-properties, + border-padding-background-properties, + character-properties-unheritable, + keeps-properties-atomic, + margin-properties-inline, + relative-position-properties, + text-altitude.attr?, + text-depth.attr?, + inheritable-properties-inline + +# Properties for nonempty inline elements +inline-properties = + common-inline-properties, + inheritable-properties-block + +# Properties for graphical inline elements +# NOTE: src attribute exclueded since it's not applicable to fo:instream-foreign-object +graphic-properties = +#MEMO: We can replace part of the definition here with 'common-inline-properties' set +# - it will be formaly rightfil since the only difference made by text-shadow, text-altitude, +# text-depth and inheritable-properties-inline and both of them are allowed here. +# At the same time those properties do not make any sense being specified on those +# elements since they will be never applied. + id.attr?, + rx-key.attr?, + accessibility-properties, + aural-properties, + area-properties-unheritable, + border-padding-background-properties, + margin-properties-inline, + relative-position-properties, + area-alignment-properties, + box-size-properties, + keeps-properties-atomic, + line-height-properties, + display-align.attr?, + content-type.attr?, + content-height.attr?, + content-width.attr?, + scaling.attr?, + scaling-method.attr?, + text-align.attr?, + text-decoration.attr? + + diff --git a/plugins/relaxng/testData/highlighting/rnc/include.rnc b/plugins/relaxng/testData/highlighting/rnc/include.rnc new file mode 100644 index 000000000000..38574136afab --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/include.rnc @@ -0,0 +1,3 @@ +include "included.rnc" + +start = AddressBook \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/included.rnc b/plugins/relaxng/testData/highlighting/rnc/included.rnc new file mode 100644 index 000000000000..5b8802c191cf --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/included.rnc @@ -0,0 +1,8 @@ +default namespace = "include.rnc" + +grammar { + AddressBook = element addressBook { Card* } + Card = element card { Name, Email } + Name = element name { text } + Email = element email { text } +} \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/missing-attribute.xml b/plugins/relaxng/testData/highlighting/rnc/missing-attribute.xml new file mode 100644 index 000000000000..f7c566c10286 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/missing-attribute.xml @@ -0,0 +1,3 @@ + + <card /> + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/missing-content.rnc b/plugins/relaxng/testData/highlighting/rnc/missing-content.rnc new file mode 100644 index 000000000000..1b1a9c13a51b --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/missing-content.rnc @@ -0,0 +1,4 @@ + +element missing-content { + +} \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/missing-start.rnc b/plugins/relaxng/testData/highlighting/rnc/missing-start.rnc new file mode 100644 index 000000000000..cf39ec889f32 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/missing-start.rnc @@ -0,0 +1 @@ +include "included.rnc" \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/ns-prefix-keyword.rnc b/plugins/relaxng/testData/highlighting/rnc/ns-prefix-keyword.rnc new file mode 100644 index 000000000000..250d62bc0deb --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/ns-prefix-keyword.rnc @@ -0,0 +1,3 @@ +namespace text = "yyy" + +element text:foo { text } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/ns-prefix.rnc b/plugins/relaxng/testData/highlighting/rnc/ns-prefix.rnc new file mode 100644 index 000000000000..d004e5cd25e9 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/ns-prefix.rnc @@ -0,0 +1,3 @@ +namespace xxx = "yyy" + +element xxx:foo { text } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/parent-ref.rnc b/plugins/relaxng/testData/highlighting/rnc/parent-ref.rnc new file mode 100644 index 000000000000..13befb3cfa1b --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/parent-ref.rnc @@ -0,0 +1,9 @@ +grammar { + start = foo + + foo = grammar { + x = element bar { parent bar } + } + + bar = attribute bar.att { text } +} \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/ref-3.rnc b/plugins/relaxng/testData/highlighting/rnc/ref-3.rnc new file mode 100644 index 000000000000..6b8818e238dc --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/ref-3.rnc @@ -0,0 +1,9 @@ +default namespace = "urn:test:simple.rng" + +start = target1 +div { + target1 = element a { empty } +} +div { + target2 = target1 +} diff --git a/plugins/relaxng/testData/highlighting/rnc/rng-schema.rnc b/plugins/relaxng/testData/highlighting/rnc/rng-schema.rnc new file mode 100644 index 000000000000..21daad394281 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/rng-schema.rnc @@ -0,0 +1,63 @@ +# RELAX NG XML syntax specified in compact syntax. + +default namespace rng = "http://relaxng.org/ns/structure/1.0" +namespace local = "" +datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes" + +start = pattern + +pattern = + element element { (nameQName | nameClass), (common & pattern+) } + | element attribute { (nameQName | nameClass), (common & pattern?) } + | element group|interleave|choice|optional + |zeroOrMore|oneOrMore|list|mixed { common & pattern+ } + | element ref|parentRef { nameNCName, common } + | element empty|notAllowed|text { common } + | element data { type, param*, (common & exceptPattern?) } + | element value { commonAttributes, type?, xsd:string } + | element externalRef { href, common } + | element grammar { common & grammarContent* } + +param = element param { commonAttributes, nameNCName, xsd:string } + +exceptPattern = element except { common & pattern+ } + +grammarContent = + definition + | element div { common & grammarContent* } + | element include { href, (common & includeContent*) } + +includeContent = + definition + | element div { common & includeContent* } + +definition = + element start { combine?, (common & pattern+) } + | element define { nameNCName, combine?, (common & pattern+) } + +combine = attribute combine { "choice" | "interleave" } + +nameClass = + element name { commonAttributes, xsd:QName } + | element anyName { common & exceptNameClass? } + | element nsName { common & exceptNameClass? } + | element choice { common & nameClass+ } + +exceptNameClass = element except { common & nameClass+ } + +nameQName = attribute name { xsd:QName } +nameNCName = attribute name { xsd:NCName } +href = attribute href { xsd:anyURI } +type = attribute type { xsd:NCName } + +common = commonAttributes, foreignElement* + +commonAttributes = + attribute ns { xsd:string }?, + attribute datatypeLibrary { xsd:anyURI }?, + foreignAttribute* + +foreignElement = element * - rng:* { (anyAttribute | text | anyElement)* } +foreignAttribute = attribute * - (rng:*|local:*) { text } +anyElement = element * { (anyAttribute | text | anyElement)* } +anyAttribute = attribute * { text } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/suppressed-unused-define.rnc b/plugins/relaxng/testData/highlighting/rnc/suppressed-unused-define.rnc new file mode 100644 index 000000000000..67b25ab5df31 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/suppressed-unused-define.rnc @@ -0,0 +1,5 @@ + +start = element foo { empty } + +#suppress UnusedDefine +foo = element bar { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/undefined-ref-ok.rnc b/plugins/relaxng/testData/highlighting/rnc/undefined-ref-ok.rnc new file mode 100644 index 000000000000..67a372daa1d9 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/undefined-ref-ok.rnc @@ -0,0 +1,4 @@ +# the display of "unresolved pattern" errors from the external parser is +# intentionally disabled - the internal validator is a) just as smart and +# b) knows about backward includes +start = doesntexist \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/undefined-ref.rnc b/plugins/relaxng/testData/highlighting/rnc/undefined-ref.rnc new file mode 100644 index 000000000000..785956e86b8b --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/undefined-ref.rnc @@ -0,0 +1,2 @@ + +start = doesntexist \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/unresolved-datatype-prefix-1.rnc b/plugins/relaxng/testData/highlighting/rnc/unresolved-datatype-prefix-1.rnc new file mode 100644 index 000000000000..05ec22cf4362 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/unresolved-datatype-prefix-1.rnc @@ -0,0 +1 @@ +element foo { xxx:string } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/unresolved-datatype-prefix-2.rnc b/plugins/relaxng/testData/highlighting/rnc/unresolved-datatype-prefix-2.rnc new file mode 100644 index 000000000000..8740f008730b --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/unresolved-datatype-prefix-2.rnc @@ -0,0 +1,3 @@ +namespace xxx = "yyy" + +element foo { xxx:string } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/unresolved-include.rnc b/plugins/relaxng/testData/highlighting/rnc/unresolved-include.rnc new file mode 100644 index 000000000000..0534fa616c95 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/unresolved-include.rnc @@ -0,0 +1,2 @@ + +include "doesntexist.rnc" \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/unresolved-ns-prefix-1.rnc b/plugins/relaxng/testData/highlighting/rnc/unresolved-ns-prefix-1.rnc new file mode 100644 index 000000000000..9ced39cb41c1 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/unresolved-ns-prefix-1.rnc @@ -0,0 +1 @@ +element xxx:foo { text } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/unresolved-ns-prefix-2.rnc b/plugins/relaxng/testData/highlighting/rnc/unresolved-ns-prefix-2.rnc new file mode 100644 index 000000000000..a5f1b63193ff --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/unresolved-ns-prefix-2.rnc @@ -0,0 +1,3 @@ +datatypes xxx = "yyy" + +element xxx:foo { text } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/unresolved-ns-prefix-3.rnc b/plugins/relaxng/testData/highlighting/rnc/unresolved-ns-prefix-3.rnc new file mode 100644 index 000000000000..6d29e36502dc --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/unresolved-ns-prefix-3.rnc @@ -0,0 +1,9 @@ +namespace a = "http://www.example.com/annotation" + +element addressBook { + [ b:documentation [ xml:lang="en" "Information about a single address." ] ] + element card { + element name { text }, + element email { text } + }* +} \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/unused-define.rnc b/plugins/relaxng/testData/highlighting/rnc/unused-define.rnc new file mode 100644 index 000000000000..b10778ce667a --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/unused-define.rnc @@ -0,0 +1,4 @@ + +start = element foo { empty } + +foo = element bar { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/used-define.rnc b/plugins/relaxng/testData/highlighting/rnc/used-define.rnc new file mode 100644 index 000000000000..8c3ccf74918a --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/used-define.rnc @@ -0,0 +1,4 @@ + +start = foo + +foo = element bar { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/valid-rnc-include.xml b/plugins/relaxng/testData/highlighting/rnc/valid-rnc-include.xml new file mode 100644 index 000000000000..de55b736bbb4 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/valid-rnc-include.xml @@ -0,0 +1,6 @@ + + + x + y + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rnc/valid-rnc.xml b/plugins/relaxng/testData/highlighting/rnc/valid-rnc.xml new file mode 100644 index 000000000000..29565d65ee82 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rnc/valid-rnc.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/backward-file1.rng b/plugins/relaxng/testData/highlighting/rng/backward-file1.rng new file mode 100644 index 000000000000..b1ef93f9bd07 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/backward-file1.rng @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/plugins/relaxng/testData/highlighting/rng/backward-include-def.rng b/plugins/relaxng/testData/highlighting/rng/backward-include-def.rng new file mode 100644 index 000000000000..fb64e3a8cb3a --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/backward-include-def.rng @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/backward-include-ref.rng b/plugins/relaxng/testData/highlighting/rng/backward-include-ref.rng new file mode 100644 index 000000000000..d313c8bfe91b --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/backward-include-ref.rng @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/backward-included.rng b/plugins/relaxng/testData/highlighting/rng/backward-included.rng new file mode 100644 index 000000000000..2b6336fa7d36 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/backward-included.rng @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/plugins/relaxng/testData/highlighting/rng/backward-with-include.rng b/plugins/relaxng/testData/highlighting/rng/backward-with-include.rng new file mode 100644 index 000000000000..0c7f55a41926 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/backward-with-include.rng @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/relaxng/testData/highlighting/rng/bad-element.rng b/plugins/relaxng/testData/highlighting/rng/bad-element.rng new file mode 100644 index 000000000000..798c7238bbe7 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/bad-element.rng @@ -0,0 +1,6 @@ + + + <element> + element> + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/bad-include.rng b/plugins/relaxng/testData/highlighting/rng/bad-include.rng new file mode 100644 index 000000000000..db6f4d216568 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/bad-include.rng @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/bad-ns-prefix.rng b/plugins/relaxng/testData/highlighting/rng/bad-ns-prefix.rng new file mode 100644 index 000000000000..dbbf6b6475f9 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/bad-ns-prefix.rng @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/bad-parent-ref-1.rng b/plugins/relaxng/testData/highlighting/rng/bad-parent-ref-1.rng new file mode 100644 index 000000000000..c713ae33bb83 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/bad-parent-ref-1.rng @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/bad-parent-ref-2.rng b/plugins/relaxng/testData/highlighting/rng/bad-parent-ref-2.rng new file mode 100644 index 000000000000..8c81026fa746 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/bad-parent-ref-2.rng @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/bad-ref-2.rng b/plugins/relaxng/testData/highlighting/rng/bad-ref-2.rng new file mode 100644 index 000000000000..f981f3c40d3f --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/bad-ref-2.rng @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/bad-ref-3.rng b/plugins/relaxng/testData/highlighting/rng/bad-ref-3.rng new file mode 100644 index 000000000000..d2732a7294ac --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/bad-ref-3.rng @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/bad-ref.rng b/plugins/relaxng/testData/highlighting/rng/bad-ref.rng new file mode 100644 index 000000000000..aca6df026b4c --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/bad-ref.rng @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/create-definition-1.rng b/plugins/relaxng/testData/highlighting/rng/create-definition-1.rng new file mode 100644 index 000000000000..8d3717cd136e --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/create-definition-1.rng @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/create-definition-1_after.rng b/plugins/relaxng/testData/highlighting/rng/create-definition-1_after.rng new file mode 100644 index 000000000000..07cea72a2fd5 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/create-definition-1_after.rng @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/create-definition-2.rng b/plugins/relaxng/testData/highlighting/rng/create-definition-2.rng new file mode 100644 index 000000000000..ee52a3bad4b3 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/create-definition-2.rng @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/create-definition-2_after.rng b/plugins/relaxng/testData/highlighting/rng/create-definition-2_after.rng new file mode 100644 index 000000000000..07a59d3f2813 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/create-definition-2_after.rng @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/good-external-ref.rng b/plugins/relaxng/testData/highlighting/rng/good-external-ref.rng new file mode 100644 index 000000000000..364ce9102d0b --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/good-external-ref.rng @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/good-include-ref-1.rng b/plugins/relaxng/testData/highlighting/rng/good-include-ref-1.rng new file mode 100644 index 000000000000..637c30c815e9 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/good-include-ref-1.rng @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/good-include.rng b/plugins/relaxng/testData/highlighting/rng/good-include.rng new file mode 100644 index 000000000000..d25b1e5b569a --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/good-include.rng @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/include.rng b/plugins/relaxng/testData/highlighting/rng/include.rng new file mode 100644 index 000000000000..c983a935a827 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/include.rng @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/included-grammar.rng b/plugins/relaxng/testData/highlighting/rng/included-grammar.rng new file mode 100644 index 000000000000..d33487e4f29d --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/included-grammar.rng @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/including-grammar.rng b/plugins/relaxng/testData/highlighting/rng/including-grammar.rng new file mode 100644 index 000000000000..63cae9ca911c --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/including-grammar.rng @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/missing-start-element-and-include.rng b/plugins/relaxng/testData/highlighting/rng/missing-start-element-and-include.rng new file mode 100644 index 000000000000..ee0c49d2cfdb --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/missing-start-element-and-include.rng @@ -0,0 +1,8 @@ +<grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="urn:test:simple.rng"> + + + + + + +grammar> \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/missing-start-element.rng b/plugins/relaxng/testData/highlighting/rng/missing-start-element.rng new file mode 100644 index 000000000000..7347c491f4d6 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/missing-start-element.rng @@ -0,0 +1,6 @@ +<grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="urn:test:simple.rng"> + + + + +grammar> \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/parent-ref-1.rng b/plugins/relaxng/testData/highlighting/rng/parent-ref-1.rng new file mode 100644 index 000000000000..6371d8ae81cf --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/parent-ref-1.rng @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/parent-ref-2.rng b/plugins/relaxng/testData/highlighting/rng/parent-ref-2.rng new file mode 100644 index 000000000000..6de4c7a31b7c --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/parent-ref-2.rng @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/ref-1.rng b/plugins/relaxng/testData/highlighting/rng/ref-1.rng new file mode 100644 index 000000000000..4c5e679e8b8f --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/ref-1.rng @@ -0,0 +1,12 @@ + + + + + + + + +
+ +
+
\ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/ref-2.rng b/plugins/relaxng/testData/highlighting/rng/ref-2.rng new file mode 100644 index 000000000000..f9428abdffe3 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/ref-2.rng @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
\ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/ref-3.rng b/plugins/relaxng/testData/highlighting/rng/ref-3.rng new file mode 100644 index 000000000000..c2ff4cb03311 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/ref-3.rng @@ -0,0 +1,18 @@ + + + + + + +
+ + + +
+ +
+ + + +
+
\ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/resolve-include-ref-1.rng b/plugins/relaxng/testData/highlighting/rng/resolve-include-ref-1.rng new file mode 100644 index 000000000000..d2a175425be9 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/resolve-include-ref-1.rng @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/resolve-include-ref-2.rng b/plugins/relaxng/testData/highlighting/rng/resolve-include-ref-2.rng new file mode 100644 index 000000000000..83c97ff46a5d --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/resolve-include-ref-2.rng @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/simple.rng b/plugins/relaxng/testData/highlighting/rng/simple.rng new file mode 100644 index 000000000000..6b10d6fc2f11 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/simple.rng @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + + + + + + b + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.0 + + + + + + + + a + b + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/unused-define-1.rng b/plugins/relaxng/testData/highlighting/rng/unused-define-1.rng new file mode 100644 index 000000000000..aa2920ce12e6 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/unused-define-1.rng @@ -0,0 +1,3 @@ + + "foo" /> + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/unused-define-2.rng b/plugins/relaxng/testData/highlighting/rng/unused-define-2.rng new file mode 100644 index 000000000000..2cc34516b5e3 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/unused-define-2.rng @@ -0,0 +1,5 @@ + + "foo"> + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/used-define-1.rng b/plugins/relaxng/testData/highlighting/rng/used-define-1.rng new file mode 100644 index 000000000000..668ed0b39c86 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/used-define-1.rng @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/used-define-2.rng b/plugins/relaxng/testData/highlighting/rng/used-define-2.rng new file mode 100644 index 000000000000..d6851f1c3783 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/used-define-2.rng @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/used-define-3-include.rng b/plugins/relaxng/testData/highlighting/rng/used-define-3-include.rng new file mode 100644 index 000000000000..69807d7a8f23 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/used-define-3-include.rng @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/rng/used-define-3.rng b/plugins/relaxng/testData/highlighting/rng/used-define-3.rng new file mode 100644 index 000000000000..6d2e2b61216a --- /dev/null +++ b/plugins/relaxng/testData/highlighting/rng/used-define-3.rng @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/simple-attribute_1.xml b/plugins/relaxng/testData/highlighting/simple-attribute_1.xml new file mode 100644 index 000000000000..5c97b089adb8 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/simple-attribute_1.xml @@ -0,0 +1,2 @@ +y="abc"> + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/simple-attribute_2.xml b/plugins/relaxng/testData/highlighting/simple-attribute_2.xml new file mode 100644 index 000000000000..af6d9cc8e0b7 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/simple-attribute_2.xml @@ -0,0 +1,2 @@ +<simple-attribute xmlns="urn:test:simple.rng"> +simple-attribute> \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/simple-element_1.xml b/plugins/relaxng/testData/highlighting/simple-element_1.xml new file mode 100644 index 000000000000..f7e431cad10c --- /dev/null +++ b/plugins/relaxng/testData/highlighting/simple-element_1.xml @@ -0,0 +1,5 @@ + + + <c /> + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/simple.rng b/plugins/relaxng/testData/highlighting/simple.rng new file mode 100644 index 000000000000..ded1e7e99092 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/simple.rng @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + + + + + + b + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.0 + + + + + + + + a + b + + + + + + + v + v + x y + v + v + v + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/token-datatype.xml b/plugins/relaxng/testData/highlighting/token-datatype.xml new file mode 100644 index 000000000000..d6e508e77ec6 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/token-datatype.xml @@ -0,0 +1,4 @@ +" v " /> \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/value-choice-1.xml b/plugins/relaxng/testData/highlighting/value-choice-1.xml new file mode 100644 index 000000000000..090a85f7ed0b --- /dev/null +++ b/plugins/relaxng/testData/highlighting/value-choice-1.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/value-choice-2.xml b/plugins/relaxng/testData/highlighting/value-choice-2.xml new file mode 100644 index 000000000000..8b026fed37e5 --- /dev/null +++ b/plugins/relaxng/testData/highlighting/value-choice-2.xml @@ -0,0 +1,2 @@ +"c"> + \ No newline at end of file diff --git a/plugins/relaxng/testData/highlighting/xslt.rng b/plugins/relaxng/testData/highlighting/xslt.rng new file mode 100644 index 000000000000..0246a5a7f0ac --- /dev/null +++ b/plugins/relaxng/testData/highlighting/xslt.rng @@ -0,0 +1,895 @@ + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + version + + + + + + + + + + + + + + + + + + + + + + version + + + + + + + + + + + + + + + + + extension-element-prefixes + + + + exclude-result-prefixes + + + + use-attribute-sets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + single + multiple + any + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + alphabetic + traditional + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + number + + + + + + + + + ascending + descending + + + + + + + + upper-first + lower-first + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + + + + + + + + xml + html + text + + + + + + + + + + + + + + + + + + yes + no + + + + + + + yes + no + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + + + + + #default + + + + + + + + #default + + + + + + + + + \*|\i\c*:\* + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + .*:.* + + + + + + ([^\{\}]|\{\{|\}\})*\{([^"'\{\}]|"[^"]*"|'[^']*')+\}([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})* + + + + + + [^\{\}]*(\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})* + + + + + ([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})* + + + diff --git a/plugins/relaxng/testData/log4j.dtd b/plugins/relaxng/testData/log4j.dtd new file mode 100644 index 000000000000..0f0e4f5e231a --- /dev/null +++ b/plugins/relaxng/testData/log4j.dtd @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/escaped-broken-1.rnc b/plugins/relaxng/testData/parsing/escaped-broken-1.rnc new file mode 100644 index 000000000000..c65555916626 --- /dev/null +++ b/plugins/relaxng/testData/parsing/escaped-broken-1.rnc @@ -0,0 +1 @@ +element \x{ { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/escaped-broken-2.rnc b/plugins/relaxng/testData/parsing/escaped-broken-2.rnc new file mode 100644 index 000000000000..1798ba683b19 --- /dev/null +++ b/plugins/relaxng/testData/parsing/escaped-broken-2.rnc @@ -0,0 +1 @@ +element \x{ \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/escaped-broken-3.rnc b/plugins/relaxng/testData/parsing/escaped-broken-3.rnc new file mode 100644 index 000000000000..a27ec4d7245e --- /dev/null +++ b/plugins/relaxng/testData/parsing/escaped-broken-3.rnc @@ -0,0 +1 @@ +element \x{55 \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/escaped-broken-4.rnc b/plugins/relaxng/testData/parsing/escaped-broken-4.rnc new file mode 100644 index 000000000000..e4f0793f70af --- /dev/null +++ b/plugins/relaxng/testData/parsing/escaped-broken-4.rnc @@ -0,0 +1 @@ +element \x{} { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/escaped-broken-5.rnc b/plugins/relaxng/testData/parsing/escaped-broken-5.rnc new file mode 100644 index 000000000000..87f716098bd8 --- /dev/null +++ b/plugins/relaxng/testData/parsing/escaped-broken-5.rnc @@ -0,0 +1 @@ +element \x{abcx} { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/escaped.rnc b/plugins/relaxng/testData/parsing/escaped.rnc new file mode 100644 index 000000000000..6833cb813d9e --- /dev/null +++ b/plugins/relaxng/testData/parsing/escaped.rnc @@ -0,0 +1 @@ +element \x{41}\x{41} { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/annotations/Following.rnc b/plugins/relaxng/testData/parsing/psi/annotations/Following.rnc new file mode 100644 index 000000000000..c896238ebb77 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/annotations/Following.rnc @@ -0,0 +1,3 @@ +element foo { + text >> x[] >> y[] +} \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/annotations/Following.txt b/plugins/relaxng/testData/parsing/psi/annotations/Following.txt new file mode 100644 index 000000000000..e1a53b778625 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/annotations/Following.txt @@ -0,0 +1,31 @@ +RncFileImpl:Following.rnc + DOCUMENT + GRAMMAR_PATTERN + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('foo') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + FORWARD_ANNOTATION + PsiElement(FANNOTATE)('>>') + PsiWhiteSpace(' ') + NAME + PsiElement(IDENTIFIER)('x') + PsiElement([)('[') + PsiElement(])(']') + PsiWhiteSpace(' ') + FORWARD_ANNOTATION + PsiElement(FANNOTATE)('>>') + PsiWhiteSpace(' ') + NAME + PsiElement(IDENTIFIER)('y') + PsiElement([)('[') + PsiElement(])(']') + PsiWhiteSpace('\n') + PsiElement(})('}') \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/annotations/FollowingIncomplete.rnc b/plugins/relaxng/testData/parsing/psi/annotations/FollowingIncomplete.rnc new file mode 100644 index 000000000000..26edf3c1b79b --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/annotations/FollowingIncomplete.rnc @@ -0,0 +1,3 @@ +element foo { + text >> +} \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/annotations/FollowingIncomplete.txt b/plugins/relaxng/testData/parsing/psi/annotations/FollowingIncomplete.txt new file mode 100644 index 000000000000..9650ed81e895 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/annotations/FollowingIncomplete.txt @@ -0,0 +1,18 @@ +RncFileImpl:FollowingIncomplete.rnc + DOCUMENT + GRAMMAR_PATTERN + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('foo') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + FORWARD_ANNOTATION + PsiElement(FANNOTATE)('>>') + PsiWhiteSpace('\n') + PsiElement(})('}') \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/annotations/GrammarLevel.rnc b/plugins/relaxng/testData/parsing/psi/annotations/GrammarLevel.rnc new file mode 100644 index 000000000000..7256ffdfc769 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/annotations/GrammarLevel.rnc @@ -0,0 +1,7 @@ +namespace x = "http://www.example.com" + +start = foo + +x:entity [ name="picture" systemId="picture.jpeg" notation="jpeg" ] + +foo = element foo { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/annotations/GrammarLevel.txt b/plugins/relaxng/testData/parsing/psi/annotations/GrammarLevel.txt new file mode 100644 index 000000000000..72d91f25a16c --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/annotations/GrammarLevel.txt @@ -0,0 +1,57 @@ +RncFileImpl:GrammarLevel.rnc + DOCUMENT + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('x') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.example.com"') + PsiWhiteSpace('\n\n') + GRAMMAR_PATTERN + START + PsiElement(KEYWORD_START)('start') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('foo') + PsiWhiteSpace('\n\n') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('x:entity') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('name') + PsiElement(=)('=') + PsiElement(LITERAL)('"picture"') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('systemId') + PsiElement(=)('=') + PsiElement(LITERAL)('"picture.jpeg"') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('notation') + PsiElement(=)('=') + PsiElement(LITERAL)('"jpeg"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('foo') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('foo') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/annotations/Nested.rnc b/plugins/relaxng/testData/parsing/psi/annotations/Nested.rnc new file mode 100644 index 000000000000..9e9ebd986835 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/annotations/Nested.rnc @@ -0,0 +1,11 @@ +s:pattern [ + name = "Element exclusion" + + s:rule [ + context = "db:warning" + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of warning" + ] + ] +] diff --git a/plugins/relaxng/testData/parsing/psi/annotations/Nested.txt b/plugins/relaxng/testData/parsing/psi/annotations/Nested.txt new file mode 100644 index 000000000000..61d7124b9e41 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/annotations/Nested.txt @@ -0,0 +1,47 @@ +RncFileImpl:Nested.rnc + DOCUMENT + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:warning"') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of warning"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n') + PsiElement(])(']') + GRAMMAR_PATTERN + \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/annotations/Simple1.rnc b/plugins/relaxng/testData/parsing/psi/annotations/Simple1.rnc new file mode 100644 index 000000000000..bfe4b5695822 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/annotations/Simple1.rnc @@ -0,0 +1,12 @@ +namespace doc = "http://www.example.com/documentation" + +[doc:href="address.html#addressBook"] +element addressBook { + [doc:href="address.html#card"] + element card { + [doc:href="address.html#name"] + element name { text }, + [doc:href="address.html#email"] + element email { text } + }* +} \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/annotations/Simple1.txt b/plugins/relaxng/testData/parsing/psi/annotations/Simple1.txt new file mode 100644 index 000000000000..2470e86a88fa --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/annotations/Simple1.txt @@ -0,0 +1,89 @@ +RncFileImpl:Simple1.rnc + DOCUMENT + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('doc') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.example.com/documentation"') + PsiWhiteSpace('\n\n') + ANNOTATION + PsiElement([)('[') + PsiElement(PREFIXED_NAME)('doc:href') + PsiElement(=)('=') + PsiElement(LITERAL)('"address.html#addressBook"') + PsiElement(])(']') + PsiWhiteSpace('\n') + GRAMMAR_PATTERN + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('addressBook') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + PATTERN + ANNOTATION + PsiElement([)('[') + PsiElement(PREFIXED_NAME)('doc:href') + PsiElement(=)('=') + PsiElement(LITERAL)('"address.html#card"') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('card') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + PATTERN + ANNOTATION + PsiElement([)('[') + PsiElement(PREFIXED_NAME)('doc:href') + PsiElement(=)('=') + PsiElement(LITERAL)('"address.html#name"') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiElement(PREFIXED_NAME)('doc:href') + PsiElement(=)('=') + PsiElement(LITERAL)('"address.html#email"') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('email') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(*)('*') + PsiWhiteSpace('\n') + PsiElement(})('}') \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/annotations/Simple2.rnc b/plugins/relaxng/testData/parsing/psi/annotations/Simple2.rnc new file mode 100644 index 000000000000..180459513442 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/annotations/Simple2.rnc @@ -0,0 +1,9 @@ +namespace a = "http://www.example.com/annotation" + +element addressBook { + [ a:documentation [ xml:lang="en" "Information about a single address." ] ] + element card { + element name { text }, + element email { text } + }* +} \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/annotations/Simple2.txt b/plugins/relaxng/testData/parsing/psi/annotations/Simple2.txt new file mode 100644 index 000000000000..f62905ee602f --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/annotations/Simple2.txt @@ -0,0 +1,80 @@ +RncFileImpl:Simple2.rnc + DOCUMENT + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.example.com/annotation"') + PsiWhiteSpace('\n\n') + GRAMMAR_PATTERN + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('addressBook') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace(' ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('a:documentation') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(PREFIXED_NAME)('xml:lang') + PsiElement(=)('=') + PsiElement(LITERAL)('"en"') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Information about a single address."') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('card') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('email') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(*)('*') + PsiWhiteSpace('\n') + PsiElement(})('}') \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/complex/Datatype.rnc b/plugins/relaxng/testData/parsing/psi/complex/Datatype.rnc new file mode 100644 index 000000000000..7eae7a696554 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/Datatype.rnc @@ -0,0 +1,58 @@ +# ========================================================= +# +# (c) 2004, RenderX +# +# Author: Alexander Peshkov +# +# Permission is granted to use this document, copy and +# modify free of charge, provided that every derived work +# bear a reference to the present document. +# +# This document contains a computer program written in +# XSL Transformations Language. It is published with no +# warranty of any kind about its usability, as a mere +# example of XSL technology. RenderX shall not be +# considered liable for any damage or loss of data caused +# by use of this program. +# +# ========================================================= + +namespace local = "" +default namespace fo = "http://www.w3.org/1999/XSL/Format" +namespace rx = "http://www.renderx.com/XSL/Extensions" + +# *************************************************************** +# Common XSL FO datatypes definitions +# *************************************************************** +integer.datatype = xsd:integer +number.datatype = xsd:decimal +length.datatype = xsd:string { pattern = "[\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em)" } +angle.datatype = xsd:string { pattern = "[\-+]?(\d*\.?\d+)(deg|grad|rad)" } +percentage.datatype = xsd:string { pattern = "[\-+]?(\d*\.?\d+)%" } +character.datatype = xsd:string { pattern = ".|\r|\n" } +string.datatype = string +name.datatype = xsd:NCName +family-name.datatype = xsd:normalizedString +#MEMO: Should I add some constraints to the family-name.datatype? +color.datatype= xsd:token +#MEMO: Should I add some constraints to the color.datatype? +country.datatype = xsd:string { pattern = "\w{2,3}" } +language.datatype = xsd:string { pattern = "\w{2,3}" } +script.datatype = xsd:string { pattern = "\w" } +#MEMO: Should I add detailed constraints to the country/language/script.datatype? +uri-specification.datatype = xsd:string +#MEMO: Should I add some constraints to the uri-specification.datatype? +time.datatype = xsd:string { pattern = "[\-+]?(\d*\.?\d+)(m?s)" } +frequency.datatype = xsd:string { pattern = "[\-+]?(\d*\.?\d+)(k?Hz)" } +# NOTE: datatype added in XSL FO 1.0 Errata +shape.datatype = xsd:normalizedString { pattern = "(([\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em))|auto) (([\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em))|auto) (([\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em))|auto) (([\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em))|auto)" } + +# *************************************************************** +# Special datatype - expressions +# *************************************************************** +#MEMO: simple example of constraint for functions +expr.datatype = xsd:normalizedString { pattern = ".*\(.*\).*" } + +x = abc:x { + +} diff --git a/plugins/relaxng/testData/parsing/psi/complex/Datatype.txt b/plugins/relaxng/testData/parsing/psi/complex/Datatype.txt new file mode 100644 index 000000000000..c7669a702b26 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/Datatype.txt @@ -0,0 +1,363 @@ +RncFileImpl:Datatype.rnc + PsiComment(SINGLE_LINE_COMMENT)('# =========================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# (c) 2004, RenderX ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Author: Alexander Peshkov ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Permission is granted to use this document, copy and ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# modify free of charge, provided that every derived work ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# bear a reference to the present document. ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# This document contains a computer program written in ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL Transformations Language. It is published with no ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# warranty of any kind about its usability, as a mere ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# example of XSL technology. RenderX shall not be ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# considered liable for any damage or loss of data caused ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# by use of this program. ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# =========================================================') + PsiWhiteSpace('\n\n') + DOCUMENT + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('local') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('""') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_DEFAULT)('default') + PsiWhiteSpace(' ') + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('fo') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/1999/XSL/Format"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('rx') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.renderx.com/XSL/Extensions"') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ***************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Common XSL FO datatypes definitions') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ***************************************************************') + PsiWhiteSpace('\n') + GRAMMAR_PATTERN + DEFINE + PsiElement(IDENTIFIER)('integer.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:integer') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('number.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:decimal') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('length.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"[\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em)"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('angle.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"[\-+]?(\d*\.?\d+)(deg|grad|rad)"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('percentage.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"[\-+]?(\d*\.?\d+)%"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('character.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('".|\r|\n"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('string.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + PsiElement(KEYWORD_STRING)('string') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('name.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NCName') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('family-name.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:normalizedString') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Should I add some constraints to the family-name.datatype?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('color.datatype') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:token') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Should I add some constraints to the color.datatype?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('country.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"\w{2,3}"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('language.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"\w{2,3}"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('script.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"\w"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Should I add detailed constraints to the country/language/script.datatype?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('uri-specification.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Should I add some constraints to the uri-specification.datatype?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('time.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"[\-+]?(\d*\.?\d+)(m?s)"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('frequency.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"[\-+]?(\d*\.?\d+)(k?Hz)"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('# NOTE: datatype added in XSL FO 1.0 Errata') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('shape.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:normalizedString') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"(([\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em))|auto) (([\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em))|auto) (([\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em))|auto) (([\-+]?(\d*\.?\d+)(cm|mm|in|pt|pc|px|em))|auto)"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ***************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Special datatype - expressions') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ***************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: simple example of constraint for functions') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('expr.datatype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:normalizedString') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('".*\(.*\).*"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('x') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('abc:x') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n\n') + PsiElement(})('}') \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/complex/Docbook.rnc b/plugins/relaxng/testData/parsing/psi/complex/Docbook.rnc new file mode 100644 index 000000000000..f77b13c20ebf --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/Docbook.rnc @@ -0,0 +1,10638 @@ + +namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" +namespace ctrl = "http://nwalsh.com/xmlns/schema-control/" +default namespace db = "http://docbook.org/ns/docbook" +namespace html = "http://www.w3.org/1999/xhtml" +namespace mml = "http://www.w3.org/1998/Math/MathML" +namespace rng = "http://relaxng.org/ns/structure/1.0" +namespace s = "http://www.ascc.net/xml/schematron" +namespace svg = "http://www.w3.org/2000/svg" +namespace xlink = "http://www.w3.org/1999/xlink" +s:ns [ + prefix = "a" + uri = "http://relaxng.org/ns/compatibility/annotations/1.0" +] +s:ns [ prefix = "ctrl" uri = "http://nwalsh.com/xmlns/schema-control/" ] +s:ns [ prefix = "db" uri = "http://docbook.org/ns/docbook" ] +s:ns [ + prefix = "dbx" + uri = + "http://sourceforge.net/projects/docbook/defguide/schema/extra-markup" +] +s:ns [ prefix = "html" uri = "http://www.w3.org/1999/xhtml" ] +s:ns [ prefix = "mml" uri = "http://www.w3.org/1998/Math/MathML" ] +s:ns [ prefix = "rng" uri = "http://relaxng.org/ns/structure/1.0" ] +s:ns [ prefix = "s" uri = "http://www.ascc.net/xml/schematron" ] +s:ns [ prefix = "svg" uri = "http://www.w3.org/2000/svg" ] +s:ns [ prefix = "xlink" uri = "http://www.w3.org/1999/xlink" ] + +# DocBook V5.0CR5 + +# See http://docbook.org/ns/docbook + +# This file is part of DocBook V5.0CR5 +# +# Copyright 1992-2005 HaL Computer Systems, Inc., +# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software +# Corporation, Norman Walsh, Sun Microsystems, Inc., and the +# Organization for the Advancement of Structured Information +# Standards (OASIS). +# +# +# Permission to use, copy, modify and distribute the DocBook schema +# and its accompanying documentation for any purpose and without fee +# is hereby granted in perpetuity, provided that the above copyright +# notice and this paragraph appear in all copies. The copyright +# holders make no representation about the suitability of the schema +# for any purpose. It is provided "as is" without expressed or implied +# warranty. +# +# If you modify the DocBook schema in any way, label your schema as a +# variant of DocBook. See the reference documentation +# (http://docbook.org/tdg5/en/html/ch05.html#s-notdocbook) +# for more information. +# +# Please direct all questions, bug reports, or suggestions for changes +# to the docbook@lists.oasis-open.org mailing list. For more +# information, see http://www.oasis-open.org/docbook/. +# +# ====================================================================== +start = + (db.set + | db.book + | db.divisions + | db.components + | db.navigation.components + | db.section + | db.para) + | (db.sect1 | db.sect2 | db.sect3 | db.sect4 | db.sect5) + | (db.refentry | db.refsection) + | (db.refsect1 | db.refsect2 | db.refsect3) + | db.setindex +div { + db._any.attribute = + + ## Any attribute including in any attribute in any namespace. + attribute * { text } + db._any = + + ## Any element from almost any namespace + element * - (db:* | html:*) { + (db._any.attribute | text | db._any)* + } +} +db.arch.attribute = + + ## Designates the computer or chip architecture to which the element applies + attribute arch { text } +db.audience.attribute = + + ## Designates the intended audience to which the element applies, for example, system administrators, programmers, or new users. + attribute audience { text } +db.condition.attribute = + + ## provides a standard place for application-specific effectivity + attribute condition { text } +db.conformance.attribute = + + ## Indicates standards conformance characteristics of the element + attribute conformance { text } +db.os.attribute = + + ## Indicates the operating system to which the element is applicable + attribute os { text } +db.revision.attribute = + + ## Indicates the editorial revision to which the element belongs + attribute revision { text } +db.security.attribute = + + ## Indicates something about the security level associated with the element to which it applies + attribute security { text } +db.userlevel.attribute = + + ## Indicates the level of user experience for which the element applies + attribute userlevel { text } +db.vendor.attribute = + + ## Indicates the computer vendor to which the element applies. + attribute vendor { text } +db.wordsize.attribute = + + ## Indicates the word size (width in bits) of the computer architecture to which the element applies + attribute wordsize { text } +db.effectivity.attributes = + db.arch.attribute? + & db.audience.attribute? + & db.condition.attribute? + & db.conformance.attribute? + & db.os.attribute? + & db.revision.attribute? + & db.security.attribute? + & db.userlevel.attribute? + & db.vendor.attribute? + & db.wordsize.attribute? +db.endterm.attribute = + + ## Points to the element whose content is to be used as the text of the link + attribute endterm { xsd:IDREF } +db.linkend.attribute = + + ## Points to an internal link target by identifying the value of its xml:id attribute + attribute linkend { xsd:IDREF } +db.linkends.attribute = + + ## Points to one or more internal link targets by identifying the value of their xml:id attributes + attribute linkends { xsd:IDREFS } +db.xlink.href.attribute = + + ## Identifies a link target with a URI + attribute xlink:href { xsd:anyURI } +db.xlink.type.attribute = + + ## Identifies the XLink link type + attribute xlink:type { + + ## An XLink simple link + "simple" + } +db.xlink.role.attribute = + + ## Identifies the XLink role of the link + attribute xlink:role { xsd:anyURI } +db.xlink.arcrole.attribute = + + ## Identifies the XLink arcrole of the link + attribute xlink:arcrole { xsd:anyURI } +db.xlink.title.attribute = + + ## Identifies the XLink title of the link + attribute xlink:title { text }? +db.xlink.show.enumeration = + + ## An application traversing to the ending resource should load it in a new window, frame, pane, or other relevant presentation context. + "new" + | + ## An application traversing to the ending resource should load the resource in the same window, frame, pane, or other relevant presentation context in which the starting resource was loaded. + "replace" + | + ## An application traversing to the ending resource should load its presentation in place of the presentation of the starting resource. + "embed" + | + ## The behavior of an application traversing to the ending resource is unconstrained by XLink. The application should look for other markup present in the link to determine the appropriate behavior. + "other" + | + ## The behavior of an application traversing to the ending resource is unconstrained by this specification. No other markup is present to help the application determine the appropriate behavior. + "none" +db.xlink.show.attribute = + + ## Identifies the XLink show behavior of the link + attribute xlink:show { db.xlink.show.enumeration } +db.xlink.actuate.enumeration = + + ## An application should traverse to the ending resource immediately on loading the starting resource. + "onLoad" + | + ## An application should traverse from the starting resource to the ending resource only on a post-loading event triggered for the purpose of traversal. + "onRequest" + | + ## The behavior of an application traversing to the ending resource is unconstrained by this specification. The application should look for other markup present in the link to determine the appropriate behavior. + "other" + | + ## The behavior of an application traversing to the ending resource is unconstrained by this specification. No other markup is present to help the application determine the appropriate behavior. + "none" +db.xlink.actuate.attribute = + + ## Identifies the XLink actuate behavior of the link + attribute xlink:actuate { db.xlink.actuate.enumeration } +db.href.attributes = + db.xlink.href.attribute + & db.xlink.type.attribute? + & db.xlink.role.attribute? + & db.xlink.arcrole.attribute? + & db.xlink.title.attribute? + & db.xlink.show.attribute? + & db.xlink.actuate.attribute? +db.xml.id.attribute = + + ## Identifies the unique ID value of the element + attribute xml:id { xsd:ID } +db.version.attribute = + + ## Specifies the DocBook version of the element and its descendants + attribute version { text } +db.xml.lang.attribute = + + ## Specifies the natural language of the element and its descendants + attribute xml:lang { text } +db.xml.base.attribute = + + ## Specifies the base URI of the element and its descendants + attribute xml:base { xsd:anyURI } +db.remap.attribute = + + ## Provides the name or similar semantic identifier assigned to the content in some previous markup scheme + attribute remap { text } +db.xreflabel.attribute = + + ## Provides the text that is to be generated for a cross reference to the element + attribute xreflabel { text } +db.xrefstyle.attribute = + + ## Specifies a keyword or keywords identifying additional style information + attribute xrefstyle { text } +db.revisionflag.enumeration = + + ## The element has been changed. + "changed" + | + ## The element is new (has been added to the document). + "added" + | + ## The element has been deleted. + "deleted" + | + ## Explicitly turns off revision markup for this element. + "off" +db.revisionflag.attribute = + + ## Identifies the revision status of the element + attribute revisionflag { db.revisionflag.enumeration } +db.dir.enumeration = + + ## Left-to-right text + "ltr" + | + ## Right-to-left text + "rtl" + | + ## Left-to-right override + "lro" + | + ## Right-to-left override + "rlo" +db.dir.attribute = + + ## Identifies the direction of text in an element + attribute dir { db.dir.enumeration } +db.common.base.attributes = + db.version.attribute? + & db.xml.lang.attribute? + & db.xml.base.attribute? + & db.remap.attribute? + & db.xreflabel.attribute? + & db.revisionflag.attribute? + & db.dir.attribute? + & db.effectivity.attributes +db.common.attributes = + db.xml.id.attribute? + & db.common.base.attributes + & db.annotations.attribute? +db.common.idreq.attributes = + db.xml.id.attribute + & db.common.base.attributes + & db.annotations.attribute? +db.common.linking.attributes = + (db.linkend.attribute | db.href.attributes)? +db.common.req.linking.attributes = + db.linkend.attribute | db.href.attributes +db.common.data.attributes = + + ## Specifies the format of the data + attribute format { text }?, + ( + ## Indentifies the location of the data by URI + attribute fileref { xsd:anyURI } + | + ## Identifies the location of the data by external identifier (entity name) + attribute entityref { xsd:ENTITY }) +db.verbatim.continuation.enumeration = + + ## Line numbering continues from the immediately preceding element with the same name. + "continues" + | + ## Line numbering restarts (begins at 1, usually). + "restarts" +db.verbatim.continuation.attribute = + + ## Determines whether line numbering continues from the previous element or restarts. + attribute continuation { db.verbatim.continuation.enumeration } +db.verbatim.linenumbering.enumeration = + + ## Lines are numbered. + "numbered" + | + ## Lines are not numbered. + "unnumbered" +db.verbatim.linenumbering.attribute = + + ## Determines whether lines are numbered. + attribute linenumbering { db.verbatim.linenumbering.enumeration } +db.verbatim.startinglinenumber.attribute = + + ## Specifies the initial line number. + attribute startinglinenumber { xsd:integer } +db.verbatim.language.attribute = + + ## Identifies the language (i.e. programming language) of the verbatim content. + attribute language { text } +db.verbatim.xml.space.attribute = + + ## Can be used to indicate explicitly that whitespace in the verbatim environment is preserved. Whitespace must always be preserved in verbatim environments whether this attribute is specified or not. + attribute xml:space { + + ## Whitespace must be preserved. + "preserve" + } +db.verbatim.attributes = + db.verbatim.continuation.attribute? + & db.verbatim.linenumbering.attribute? + & db.verbatim.startinglinenumber.attribute? + & db.verbatim.language.attribute? + & db.verbatim.xml.space.attribute? +db.label.attribute = + + ## Specifies an identifying string for presentation purposes + attribute label { text } +db.width.characters.attribute = + + ## Specifies the width (in characters) of the element + attribute width { xsd:nonNegativeInteger } +db.spacing.enumeration = + + ## The spacing should be "compact". + "compact" + | + ## The spacing should be "normal". + "normal" +db.spacing.attribute = + + ## Specifies (a hint about) the spacing of the content + attribute spacing { db.spacing.enumeration } +db.pgwide.enumeration = + + ## The element should be rendered in the current text flow (with the flow column width). + "0" + | + ## The element should be rendered across the full text page. + "1" +db.pgwide.attribute = + + ## Indicates if the element is rendered across the column or the page + attribute pgwide { db.pgwide.enumeration } +db.language.attribute = + + ## Identifies the language (i.e. programming language) of the content. + attribute language { text } +db.performance.enumeration = + + ## The content describes an optional step or steps. + "optional" + | + ## The content describes a required step or steps. + "required" +db.performance.attribute = + + ## Specifies if the content is required or optional. + attribute performance { db.performance.enumeration } +db.floatstyle.attribute = + + ## Specifies style information to be used when rendering the float + attribute floatstyle { text } +db.width.attribute = + + ## Specifies the width of the element + attribute width { text } +db.depth.attribute = + + ## Specifies the depth of the element + attribute depth { text } +db.contentwidth.attribute = + + ## Specifies the width of the content rectangle + attribute contentwidth { text } +db.contentdepth.attribute = + + ## Specifies the depth of the content rectangle + attribute contentdepth { text } +db.scalefit.enumeration = + + ## False (do not scale-to-fit; anamorphic scaling may occur) + "0" + | + ## True (scale-to-fit; anamorphic scaling is forbidden) + "1" +db.scale.attribute = + + ## Specifies the scaling factor + attribute scale { xsd:positiveInteger } +db.halign.enumeration = + + ## Centered horizontally + "center" + | + ## Aligned horizontally on the specified character + "char" + | + ## Fully justified (left and right margins or edges) + "justify" + | + ## Left aligned + "left" + | + ## Right aligned + "right" +db.valign.enumeration = + + ## Aligned on the bottom of the region + "bottom" + | + ## Centered vertically + "middle" + | + ## Aligned on the top of the region + "top" +db.biblio.class.enumeration = + + ## A document object identifier. + "doi" + | + ## An international standard book number. + "isbn" + | + ## An international standard technical report number (ISO 10444). + "isrn" + | + ## An international standard serial number. + "issn" + | + ## A Library of Congress reference number. + "libraryofcongress" + | + ## A publication number (an internal number or possibly organizational standard). + "pubsnumber" + | + ## A Uniform Resource Identifier + "uri" +db.biblio.class-enum.attribute = + + ## Identifies the kind of bibliographic identifier + attribute class { db.biblio.class.enumeration }? +db.biblio.class-other.attribute = + + ## Identifies the nature of the non-standard bibliographic identifier + attribute otherclass { xsd:NMTOKEN } +db.biblio.class-other.attributes = + + ## Identifies the kind of bibliographic identifier + attribute class { + + ## Indicates that the identifier is some 'other' kind. + "other" + } + & db.biblio.class-other.attribute +db.biblio.class.attribute = + db.biblio.class-enum.attribute | db.biblio.class-other.attributes +db.ubiq.inlines = + (db.inlinemediaobject + | db.remark + | db.superscript + | db.subscript + | db.link.inlines + | db.alt) + | db.annotation + | db.indexterm +db._text = (text | db.ubiq.inlines | db._phrase | db.replaceable)* +db._title = db.title? & db.titleabbrev? & db.subtitle? +db._title.req = db.title & db.titleabbrev? & db.subtitle? +db._title.only = db.title? & db.titleabbrev? +db._title.onlyreq = db.title & db.titleabbrev? +db._info = (db._title.req?, db.titleforbidden.info?) | db.info? +db._info.title.req = + (db._title.req, db.titleforbidden.info?) | db.titlereq.info +db._info.title.only = + (db._title.only, db.titleforbidden.info?) | db.titleonly.info +db._info.title.onlyreq = + (db._title.onlyreq, db.titleforbidden.info?) | db.titleonlyreq.info +db._info.title.forbidden = db.titleforbidden.info? +db.all.inlines = + text + | db.ubiq.inlines + | db.general.inlines + | db.domain.inlines + | db.extension.inlines +db.general.inlines = + db.publishing.inlines + | db.product.inlines + | db.bibliography.inlines + | db.graphic.inlines + | db.indexing.inlines + | db.link.inlines +db.domain.inlines = + (db.technical.inlines + | db.error.inlines + | db.os.inlines + | db.programming.inlines + | db.markup.inlines + | db.gui.inlines + | db.keyboard.inlines) + | db.math.inlines +db.technical.inlines = + (db.replaceable + | db.systemitem + | db.option + | db.optional + | db.package + | db.parameter + | db.property) + | db.termdef + | db.nonterminal +db.error.inlines = + db.errorcode | db.errortext | db.errorname | db.errortype +db.oo.inlines = db.ooclass | db.ooexception | db.oointerface +db.programming.inlines = + db.function + | db.parameter + | db.varname + | db.returnvalue + | db.type + | db.classname + | db.exceptionname + | db.interfacename + | db.methodname + | db.modifier + | db.initializer + | db.oo.inlines +db.product.inlines = + db.productnumber + | db.productname + | db.database + | db.application + | db.hardware + | db.trademark +db.os.inlines = + db.prompt + | db.envar + | db.filename + | db.command + | db.computeroutput + | db.userinput +db.markup.inlines = + db.tag + | db.markup + | db.token + | db.symbol + | db.literal + | db.code + | db.constant + | db.email + | db.uri +db.bibliography.inlines = + db.citation + | db.citerefentry + | db.citetitle + | db.citebiblioid + | db.author + | db.person + | db.personname + | db.org + | db.orgname + | db.editor + | db.jobtitle +db.publishing.inlines = + (db.abbrev + | db.acronym + | db.date + | db.emphasis + | db.footnote + | db.footnoteref + | db.foreignphrase + | db.phrase + | db.quote + | db.subscript + | db.superscript + | db.wordasword) + | db.glossary.inlines + | db.coref +db.graphic.inlines = db.inlinemediaobject +db.indexing.inlines = notAllowed | db.indexterm +db.gui.inlines = + db.guiicon + | db.guibutton + | db.guimenuitem + | db.guimenu + | db.guisubmenu + | db.guilabel + | db.menuchoice + | db.mousebutton +db.keyboard.inlines = + db.keycombo + | db.keycap + | db.keycode + | db.keysym + | db.shortcut + | db.accel +db.link.inlines = + (db.xref | db.link | db.olink | db.anchor) | db.biblioref +db.extension.inlines = notAllowed +db.nopara.blocks = + (db.list.blocks + | db.admonition.blocks + | db.formal.blocks + | db.informal.blocks + | db.publishing.blocks + | db.graphic.blocks + | db.technical.blocks + | db.verbatim.blocks + | db.synopsis.blocks + | db.bridgehead + | db.remark + | db.revhistory) + | db.indexterm +db.para.blocks = db.anchor | db.para | db.formalpara | db.simpara +db.all.blocks = + (db.nopara.blocks | db.para.blocks | db.extension.blocks) + | db.annotation +db.formal.blocks = (db.example | db.figure | db.table) | db.equation +db.informal.blocks = + (db.informalexample | db.informalfigure | db.informaltable) + | db.informalequation +db.publishing.blocks = + db.sidebar | db.blockquote | db.address | db.epigraph +db.graphic.blocks = db.mediaobject | db.screenshot +db.technical.blocks = + db.procedure + | db.task + | (db.productionset | db.constraintdef) + | db.msgset +db.admonition.blocks = + db.caution | db.important | db.note | db.tip | db.warning +db.list.blocks = + (db.itemizedlist + | db.orderedlist + | db.procedure + | db.simplelist + | db.variablelist + | db.segmentedlist) + | db.glosslist + | db.bibliolist + | db.calloutlist + | db.qandaset +db.verbatim.blocks = + (db.programlisting | db.screen | db.literallayout | db.synopsis) + | (db.programlistingco | db.screenco) +db.synopsis.blocks = + db.cmdsynopsis + | db.funcsynopsis + | db.classsynopsis + | db.methodsynopsis + | db.constructorsynopsis + | db.destructorsynopsis + | db.fieldsynopsis +db.extension.blocks = notAllowed +db.info.extension = db._any +db.info.elements = + (db.abstract + | db.address + | db.artpagenums + | db.author + | db.authorgroup + | db.authorinitials + | db.bibliocoverage + | db.biblioid + | db.bibliosource + | db.collab + | db.confgroup + | db.contractsponsor + | db.contractnum + | db.copyright + | db.cover + | db.date + | db.edition + | db.editor + | db.issuenum + | db.keywordset + | db.legalnotice + | db.mediaobject + | db.org + | db.orgname + | db.othercredit + | db.pagenums + | db.printhistory + | db.productname + | db.productnumber + | db.pubdate + | db.publisher + | db.publishername + | db.releaseinfo + | db.revhistory + | db.seriesvolnums + | db.subjectset + | db.volumenum + | db.info.extension) + | db.annotation + | db.extendedlink + | (db.bibliomisc | db.bibliomset | db.bibliorelation | db.biblioset) + | db.itermset +db.bibliographic.elements = + db.info.elements + | db.publishing.inlines + | db.citerefentry + | db.citetitle + | db.citebiblioid + | db.person + | db.personname + | db.subtitle + | db.title +div { + db.title.role.attribute = attribute role { text } + db.title.attlist = + db.title.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.title = + + ## The text of the title of a section of a document or of a formal block-level element + element title { db.title.attlist, db.all.inlines* } +} +div { + db.titleabbrev.role.attribute = attribute role { text } + db.titleabbrev.attlist = + db.titleabbrev.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.titleabbrev = + + ## The abbreviation of a title + element titleabbrev { db.titleabbrev.attlist, db.all.inlines* } +} +div { + db.subtitle.role.attribute = attribute role { text } + db.subtitle.attlist = + db.subtitle.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.subtitle = + + ## The subtitle of a document + element subtitle { db.subtitle.attlist, db.all.inlines* } +} +div { + db.info.role.attribute = attribute role { text } + db.info.attlist = db.info.role.attribute? & db.common.attributes + db.info = + + ## A wrapper for information about a component or other block + element info { db.info.attlist, (db._title & db.info.elements*) } +} +div { + db.titlereq.info.role.attribute = attribute role { text } + db.titlereq.info.attlist = + db.titlereq.info.role.attribute? & db.common.attributes + db.titlereq.info = + + ## A wrapper for information about a component or other block with a required title + element info { + db.titlereq.info.attlist, (db._title.req & db.info.elements*) + } +} +div { + db.titleonly.info.role.attribute = attribute role { text } + db.titleonly.info.attlist = + db.titleonly.info.role.attribute? & db.common.attributes + db.titleonly.info = + + ## A wrapper for information about a component or other block with only a title + element info { + db.titleonly.info.attlist, (db._title.only & db.info.elements*) + } +} +div { + db.titleonlyreq.info.role.attribute = attribute role { text } + db.titleonlyreq.info.attlist = + db.titleonlyreq.info.role.attribute? & db.common.attributes + db.titleonlyreq.info = + + ## A wrapper for information about a component or other block with only a required title + element info { + db.titleonlyreq.info.attlist, + (db._title.onlyreq & db.info.elements*) + } +} +div { + db.titleforbidden.info.role.attribute = attribute role { text } + db.titleforbidden.info.attlist = + db.titleforbidden.info.role.attribute? & db.common.attributes + db.titleforbidden.info = + + ## A wrapper for information about a component or other block without a title + element info { db.titleforbidden.info.attlist, db.info.elements* } +} +div { + db.subjectset.role.attribute = attribute role { text } + db.subjectset.scheme.attribute = + + ## Identifies the controlled vocabulary used by this set's terms + attribute scheme { xsd:NMTOKEN } + db.subjectset.attlist = + db.subjectset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.subjectset.scheme.attribute? + db.subjectset = + + ## A set of terms describing the subject matter of a document + element subjectset { db.subjectset.attlist, db.subject+ } +} +div { + db.subject.role.attribute = attribute role { text } + db.subject.weight.attribute = + + ## Specifies a ranking for this subject relative to other subjects in the same set + attribute weight { text } + db.subject.attlist = + db.subject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.subject.weight.attribute? + db.subject = + + ## One of a group of terms describing the subject matter of a document + element subject { db.subject.attlist, db.subjectterm+ } +} +div { + db.subjectterm.role.attribute = attribute role { text } + db.subjectterm.attlist = + db.subjectterm.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.subjectterm = + + ## A term in a group of terms describing the subject matter of a document + element subjectterm { db.subjectterm.attlist, text } +} +div { + db.keywordset.role.attribute = attribute role { text } + db.keywordset.attlist = + db.keywordset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.keywordset = + + ## A set of keywords describing the content of a document + element keywordset { db.keywordset.attlist, db.keyword+ } +} +div { + db.keyword.role.attribute = attribute role { text } + db.keyword.attlist = + db.keyword.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.keyword = + + ## One of a set of keywords describing the content of a document + element keyword { db.keyword.attlist, text } +} +db.table.choice = notAllowed | db.cals.table | db.html.table +db.informaltable.choice = + notAllowed | db.cals.informaltable | db.html.informaltable +db.table = db.table.choice +db.informaltable = db.informaltable.choice +div { + db.procedure.role.attribute = attribute role { text } + db.procedure.attlist = + db.procedure.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.procedure.info = db._info.title.only + db.procedure = + + ## A list of operations to be performed in a well-defined sequence + element procedure { + db.procedure.attlist, db.procedure.info, db.all.blocks*, db.step+ + } +} +div { + db.step.role.attribute = attribute role { text } + db.step.attlist = + db.step.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.performance.attribute? + db.step.info = db._info.title.only + # + # This content model is blocks*, step|stepalternatives, blocks* but + # expressed this way it avoids UPA issues in XSD and DTD versions + db.step = + + ## A unit of action in a procedure + element step { + db.step.attlist, + db.step.info, + ((db.all.blocks+, + ((db.substeps | db.stepalternatives), db.all.blocks*)?) + | ((db.substeps | db.stepalternatives), db.all.blocks*)) + } +} +div { + db.stepalternatives.role.attribute = attribute role { text } + db.stepalternatives.attlist = + db.stepalternatives.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.performance.attribute? + db.stepalternatives.info = db._info.title.forbidden + db.stepalternatives = + + ## Alternative steps in a procedure + element stepalternatives { + db.stepalternatives.attlist, db.stepalternatives.info, db.step+ + } +} +div { + db.substeps.role.attribute = attribute role { text } + db.substeps.attlist = + db.substeps.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.performance.attribute? + db.substeps = + + ## A wrapper for steps that occur within steps in a procedure + element substeps { db.substeps.attlist, db.step+ } +} +div { + db.sidebar.role.attribute = attribute role { text } + db.sidebar.attlist = + db.sidebar.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.sidebar.info = db._info.title.only + db.sidebar = + + ## A portion of a document that is isolated from the main narrative flow + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:sidebar" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:sidebar)" + "sidebar must not occur in the descendants of sidebar" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element sidebar { + db.sidebar.attlist, db.sidebar.info, db.all.blocks+ + } +} +div { + db.abstract.role.attribute = attribute role { text } + db.abstract.attlist = + db.abstract.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.abstract.info = db._info.title.only + db.abstract = + + ## A summary + element abstract { + db.abstract.attlist, db.abstract.info, db.para.blocks+ + } +} +div { + db.personblurb.role.attribute = attribute role { text } + db.personblurb.attlist = + db.personblurb.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.personblurb.info = db._info.title.only + db.personblurb = + + ## A short description or note about a person + element personblurb { + db.personblurb.attlist, db.personblurb.info, db.para.blocks+ + } +} +div { + db.blockquote.role.attribute = attribute role { text } + db.blockquote.attlist = + db.blockquote.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.blockquote.info = db._info.title.only + db.blockquote = + + ## A quotation set off from the main text + element blockquote { + db.blockquote.attlist, + db.blockquote.info, + db.attribution?, + db.all.blocks+ + } +} +div { + db.attribution.role.attribute = attribute role { text } + db.attribution.attlist = + db.attribution.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.attribution = + + ## The source of a block quote or epigraph + element attribution { + db.attribution.attlist, + (db._text + | db.person + | db.personname + | db.citetitle + | db.citation)* + } +} +div { + db.bridgehead.renderas.enumeration = + + ## Render as a first-level section + "sect1" + | + ## Render as a second-level section + "sect2" + | + ## Render as a third-level section + "sect3" + | + ## Render as a fourth-level section + "sect4" + | + ## Render as a fifth-level section + "sect5" + db.bridgehead.renderas-enum.attribute = + + ## Indicates how the bridge head should be rendered + attribute renderas { db.bridgehead.renderas.enumeration }? + db.bridgehead.renderas-other.attribute = + + ## Identifies the nature of the non-standard rendering + attribute otherrenderas { xsd:NMTOKEN } + db.bridgehead.renderas-other.attributes = + + ## Indicates how the bridge head should be rendered + attribute renderas { + + ## Identifies a non-standard rendering + "other" + } + & db.bridgehead.renderas-other.attribute + db.bridgehead.renderas.attribute = + db.bridgehead.renderas-enum.attribute + | db.bridgehead.renderas-other.attributes + db.bridgehead.role.attribute = attribute role { text } + db.bridgehead.attlist = + db.bridgehead.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.bridgehead.renderas.attribute? + db.bridgehead = + + ## A free-floating heading + element bridgehead { db.bridgehead.attlist, db.all.inlines* } +} +div { + db.remark.role.attribute = attribute role { text } + db.remark.attlist = + db.remark.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.remark = + + ## A remark (or comment) intended for presentation in a draft manuscript + element remark { db.remark.attlist, db._text } +} +div { + db.epigraph.role.attribute = attribute role { text } + db.epigraph.attlist = + db.epigraph.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.epigraph.info = db._info.title.forbidden + db.epigraph = + + ## A short inscription at the beginning of a document or component + element epigraph { + db.epigraph.attlist, + db.epigraph.info, + db.attribution?, + (db.para.blocks | db.literallayout)+ + } +} +div { + db.footnote.role.attribute = attribute role { text } + db.footnote.label.attribute = + + ## Identifies the desired footnote mark + attribute label { xsd:NMTOKEN } + db.footnote.attlist = + db.footnote.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.footnote.label.attribute? + db.footnote = + + ## A footnote + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:footnote)" + "footnote must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:table)" + "table must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:indexterm)" + "indexterm must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:sidebar)" + "sidebar must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:task)" + "task must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnote" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:epigraph)" + "epigraph must not occur in the descendants of footnote" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element footnote { db.footnote.attlist, db.all.blocks+ } +} +div { + db.formalpara.role.attribute = attribute role { text } + db.formalpara.attlist = + db.formalpara.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.formalpara.info = db._info.title.onlyreq + db.formalpara = + + ## A paragraph with a title + element formalpara { + db.formalpara.attlist, + db.formalpara.info, + db.indexing.inlines*, + db.para + } +} +div { + db.para.role.attribute = attribute role { text } + db.para.attlist = + db.para.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.para.info = db._info.title.forbidden + db.para = + + ## A paragraph + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:para" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element para { + db.para.attlist, + db.para.info, + (db.all.inlines | db.nopara.blocks)* + } +} +div { + db.simpara.role.attribute = attribute role { text } + db.simpara.attlist = + db.simpara.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.simpara.info = db._info.title.forbidden + db.simpara = + + ## A paragraph that contains only text and inline markup, no block elements + element simpara { + db.simpara.attlist, db.simpara.info, db.all.inlines* + } +} +db.admonition.contentmodel = db._info.title.only, db.all.blocks+ +div { + db.caution.role.attribute = attribute role { text } + db.caution.attlist = + db.caution.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.caution = + + ## A note of caution + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caution" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of caution" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caution" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of caution" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caution" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of caution" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caution" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of caution" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caution" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of caution" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element caution { db.caution.attlist, db.admonition.contentmodel } +} +div { + db.important.role.attribute = attribute role { text } + db.important.attlist = + db.important.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.important = + + ## An admonition set off from the text + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:important" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of important" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:important" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of important" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:important" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of important" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:important" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of important" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:important" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of important" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element important { + db.important.attlist, db.admonition.contentmodel + } +} +div { + db.note.role.attribute = attribute role { text } + db.note.attlist = + db.note.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.note = + + ## A message set off from the text + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:note" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of note" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:note" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of note" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:note" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of note" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:note" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of note" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:note" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of note" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element note { db.note.attlist, db.admonition.contentmodel } +} +div { + db.tip.role.attribute = attribute role { text } + db.tip.attlist = + db.tip.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.tip = + + ## A suggestion to the user, set off from the text + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:tip" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of tip" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:tip" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of tip" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:tip" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of tip" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:tip" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of tip" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:tip" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of tip" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element tip { db.tip.attlist, db.admonition.contentmodel } +} +div { + db.warning.role.attribute = attribute role { text } + db.warning.attlist = + db.warning.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.warning = + + ## An admonition set off from the text + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:warning" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of warning" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:warning" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of warning" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:warning" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of warning" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:warning" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of warning" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:warning" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of warning" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element warning { db.warning.attlist, db.admonition.contentmodel } +} +div { + db.itemizedlist.role.attribute = attribute role { text } + db.itemizedlist.mark.attribute = + + ## Identifies the type of mark to be used on items in this list + attribute mark { xsd:NMTOKEN } + db.itemizedlist.attlist = + db.itemizedlist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.spacing.attribute? + & db.itemizedlist.mark.attribute? + db.itemizedlist.info = db._info.title.only + db.itemizedlist = + + ## A list in which each entry is marked with a bullet or other dingbat + element itemizedlist { + db.itemizedlist.attlist, + db.itemizedlist.info, + db.all.blocks*, + db.listitem+ + } +} +div { + db.orderedlist.role.attribute = attribute role { text } + db.orderedlist.continuation.enumeration = + + ## Specifies that numbering should begin where the preceding list left off + "continues" + | + ## Specifies that numbering should begin again at 1 + "restarts" + db.orderedlist.continuation.attribute = + + ## Indicates how list numbering should begin relative to the immediately preceding list + attribute continuation { db.orderedlist.continuation.enumeration } + db.orderedlist.startingnumber.attribute = + + ## Specifies the initial line number. + attribute startingnumber { xsd:integer } + db.orderedlist.inheritnum.enumeration = + + ## Specifies that numbering should ignore list nesting + "ignore" + | + ## Specifies that numbering should inherit from outer-level lists + "inherit" + db.orderedlist.inheritnum.attribute = + + ## Indicates whether or not item numbering should be influenced by list nesting + attribute inheritnum { db.orderedlist.inheritnum.enumeration } + db.orderedlist.numeration.enumeration = + + ## Specifies Arabic numeration (1, 2, 3, …) + "arabic" + | + ## Specifies upper-case alphabetic numeration (A, B, C, …) + "upperalpha" + | + ## Specifies lower-case alphabetic numeration (a, b, c, …) + "loweralpha" + | + ## Specifies upper-case Roman numeration (I, II, III, …) + "upperroman" + | + ## Specifies lower-case Roman numeration (i, ii, iii …) + "lowerroman" + db.orderedlist.numeration.attribute = + + ## Indicates the desired numeration + attribute numeration { db.orderedlist.numeration.enumeration } + db.orderedlist.attlist = + db.orderedlist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.spacing.attribute? + & (db.orderedlist.continuation.attribute + | db.orderedlist.startingnumber.attribute)? + & db.orderedlist.inheritnum.attribute? + & db.orderedlist.numeration.attribute? + db.orderedlist.info = db._info.title.only + db.orderedlist = + + ## A list in which each entry is marked with a sequentially incremented label + element orderedlist { + db.orderedlist.attlist, + db.orderedlist.info, + db.all.blocks*, + db.listitem+ + } +} +div { + db.listitem.role.attribute = attribute role { text } + db.listitem.override.attribute = + + ## Specifies the keyword for the type of mark that should be used on this + ## item, instead of the mark that would be used by default + attribute override { xsd:NMTOKEN } + db.listitem.attlist = + db.listitem.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.listitem.override.attribute? + db.listitem = + + ## A wrapper for the elements of a list item + element listitem { db.listitem.attlist, db.all.blocks+ } +} +div { + db.segmentedlist.role.attribute = attribute role { text } + db.segmentedlist.attlist = + db.segmentedlist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.segmentedlist.info = db._info.title.only + db.segmentedlist = + + ## A segmented list, a list of sets of elements + element segmentedlist { + db.segmentedlist.attlist, + db.segmentedlist.info, + db.segtitle+, + db.seglistitem+ + } +} +div { + db.segtitle.role.attribute = attribute role { text } + db.segtitle.attlist = + db.segtitle.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.segtitle = + + ## The title of an element of a list item in a segmented list + element segtitle { db.segtitle.attlist, db.all.inlines* } +} +div { + db.seglistitem.role.attribute = attribute role { text } + db.seglistitem.attlist = + db.seglistitem.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.seglistitem = + + ## A list item in a segmented list + [ + s:pattern [ + name = "Cardinality of segments and titles" + "\x{a}" ~ + " " + s:rule [ + context = "db:seglistitem" + "\x{a}" ~ + " " + s:assert [ + test = "count(db:seg) = count(../db:segtitle)" + "The number of seg elements must be the same as the number of segtitle elements in the parent segmentedlist" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element seglistitem { db.seglistitem.attlist, db.seg+ } +} +div { + db.seg.role.attribute = attribute role { text } + db.seg.attlist = + db.seg.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.seg = + + ## An element of a list item in a segmented list + element seg { db.seg.attlist, db.all.inlines* } +} +div { + db.simplelist.role.attribute = attribute role { text } + db.simplelist.type.enumeration = + + ## A tabular presentation in row-major order. + "horiz" + | + ## A tabular presentation in column-major order. + "vert" + | + ## An inline presentation, usually a comma-delimited list. + "inline" + db.simplelist.type.attribute = + + ## Specifies the type of list presentation. + [ a:defaultValue = "vert" ] + attribute type { db.simplelist.type.enumeration } + db.simplelist.columns.attribute = + + ## Specifies the number of columns for horizontal or vertical presentation + attribute columns { xsd:integer } + db.simplelist.attlist = + db.simplelist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.simplelist.type.attribute? + & db.simplelist.columns.attribute? + db.simplelist = + + ## An undecorated list of single words or short phrases + element simplelist { db.simplelist.attlist, db.member+ } +} +div { + db.member.role.attribute = attribute role { text } + db.member.attlist = + db.member.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.member = + + ## An element of a simple list + element member { db.member.attlist, db.all.inlines* } +} +div { + db.variablelist.role.attribute = attribute role { text } + db.variablelist.termlength.attribute = + + ## Indicates a length beyond which the presentation system may consider a term too long and select an alternate presentation for that term, item, or list + attribute termlength { text } + db.variablelist.attlist = + db.variablelist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.spacing.attribute? + & db.variablelist.termlength.attribute? + db.variablelist.info = db._info.title.only + db.variablelist = + + ## A list in which each entry is composed of a set of one or more terms and an associated description + element variablelist { + db.variablelist.attlist, + db.variablelist.info, + db.all.blocks*, + db.varlistentry+ + } +} +div { + db.varlistentry.role.attribute = attribute role { text } + db.varlistentry.attlist = + db.varlistentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.varlistentry = + + ## A wrapper for a set of terms and the associated description in a variable list + element varlistentry { + db.varlistentry.attlist, db.term+, db.listitem + } +} +div { + db.term.role.attribute = attribute role { text } + db.term.attlist = + db.term.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.term = + + ## The word or phrase being defined or described in a variable list + element term { db.term.attlist, db.all.inlines* } +} +div { + db.example.role.attribute = attribute role { text } + db.example.label.attribute = db.label.attribute + db.example.width.attribute = db.width.characters.attribute + db.example.pgwide.attribute = db.pgwide.attribute + db.example.floatstyle.attribute = db.floatstyle.attribute + db.example.attlist = + db.example.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.example.label.attribute? + & db.example.floatstyle.attribute? + & (db.example.width.attribute | db.example.pgwide.attribute)? + db.example.info = db._info.title.onlyreq + db.example = + + ## A formal example, with a title + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:table)" + "table must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:example" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of example" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element example { + db.example.attlist, db.example.info, db.all.blocks+, db.caption? + } +} +div { + db.informalexample.role.attribute = attribute role { text } + db.informalexample.width.attribute = db.width.characters.attribute + db.informalexample.floatstyle.attribute = db.floatstyle.attribute + db.informalexample.attlist = + db.informalexample.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.informalexample.floatstyle.attribute? + & db.informalexample.width.attribute? + db.informalexample.info = db._info.title.forbidden + db.informalexample = + + ## A displayed example without a title + element informalexample { + db.informalexample.attlist, + db.informalexample.info, + db.all.blocks+, + db.caption? + } +} +db.verbatim.inlines = (db.all.inlines | db.lineannotation) | db.co +db.verbatim.contentmodel = + db._info.title.forbidden, (db.textobject | db.verbatim.inlines*) +div { + db.programlisting.role.attribute = attribute role { text } + db.programlisting.width.attribute = db.width.characters.attribute + db.programlisting.attlist = + db.programlisting.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + & db.programlisting.width.attribute? + db.programlisting = + + ## A literal listing of all or part of a program + element programlisting { + db.programlisting.attlist, db.verbatim.contentmodel + } +} +div { + db.literallayout.role.attribute = attribute role { text } + db.literallayout.class.enumeration = + + ## The literal layout should be formatted with a monospaced font + "monospaced" + | + ## The literal layout should be formatted with the current font + "normal" + db.literallayout.class.attribute = + + ## Specifies the class of literal layout + attribute class { db.literallayout.class.enumeration } + db.literallayout.attlist = + db.literallayout.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + & db.literallayout.class.attribute? + db.literallayout = + + ## A block of text in which line breaks and white space are to be reproduced faithfully + element literallayout { + db.literallayout.attlist, db.verbatim.contentmodel + } +} +div { + db.screen.role.attribute = attribute role { text } + db.screen.width.attribute = db.width.characters.attribute + db.screen.attlist = + db.screen.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + & db.screen.width.attribute? + db.screen = + + ## Text that a user sees or might see on a computer screen + element screen { db.screen.attlist, db.verbatim.contentmodel } +} +div { + db.screenshot.role.attribute = attribute role { text } + db.screenshot.attlist = + db.screenshot.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.screenshot.info = db._info + db.screenshot = + + ## A representation of what the user sees or might see on a computer screen + element screenshot { + db.screenshot.attlist, db.screenshot.info, db.mediaobject + } +} +div { + db.figure.role.attribute = attribute role { text } + db.figure.label.attribute = db.label.attribute + db.figure.pgwide.attribute = db.pgwide.attribute + db.figure.floatstyle.attribute = db.floatstyle.attribute + db.figure.attlist = + db.figure.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.figure.label.attribute? + & db.figure.pgwide.attribute? + & db.figure.floatstyle.attribute? + db.figure.info = db._info.title.onlyreq + db.figure = + + ## A formal figure, generally an illustration, with a title + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:table)" + "table must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:figure" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of figure" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element figure { + db.figure.attlist, db.figure.info, db.all.blocks+, db.caption? + } +} +div { + db.informalfigure.role.attribute = attribute role { text } + db.informalfigure.label.attribute = db.label.attribute + db.informalfigure.pgwide.attribute = db.pgwide.attribute + db.informalfigure.floatstyle.attribute = db.floatstyle.attribute + db.informalfigure.attlist = + db.informalfigure.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.informalfigure.label.attribute? + & db.informalfigure.pgwide.attribute? + & db.informalfigure.floatstyle.attribute? + db.informalfigure.info = db._info.title.forbidden + db.informalfigure = + + ## A untitled figure + element informalfigure { + db.informalfigure.attlist, + db.informalfigure.info, + db.all.blocks+, + db.caption? + } +} +db.mediaobject.content = + (db.videoobject | db.audioobject | db.imageobject | db.textobject) + | db.imageobjectco +div { + db.mediaobject.role.attribute = attribute role { text } + db.mediaobject.attlist = + db.mediaobject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.mediaobject.info = db._info.title.forbidden + db.mediaobject = + + ## A displayed media object (video, audio, image, etc.) + element mediaobject { + db.mediaobject.attlist, + db.mediaobject.info, + db.alt?, + db.mediaobject.content+, + db.caption? + } +} +div { + db.inlinemediaobject.role.attribute = attribute role { text } + db.inlinemediaobject.attlist = + db.inlinemediaobject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.inlinemediaobject.info = db._info.title.forbidden + db.inlinemediaobject = + + ## An inline media object (video, audio, image, and so on) + element inlinemediaobject { + db.inlinemediaobject.attlist, + db.inlinemediaobject.info, + db.alt?, + db.mediaobject.content+ + } +} +div { + db.videoobject.role.attribute = attribute role { text } + db.videoobject.attlist = + db.videoobject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.videoobject.info = db._info.title.forbidden + db.videoobject = + + ## A wrapper for video data and its associated meta-information + element videoobject { + db.videoobject.attlist, db.videoobject.info, db.videodata + } +} +div { + db.audioobject.role.attribute = attribute role { text } + db.audioobject.attlist = + db.audioobject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.audioobject.info = db._info.title.forbidden + db.audioobject = + + ## A wrapper for audio data and its associated meta-information + element audioobject { + db.audioobject.attlist, db.audioobject.info, db.audiodata + } +} +db.imageobject.content = + db.imagedata | db.imagedata.mathml | db.imagedata.svg +div { + db.imageobject.role.attribute = attribute role { text } + db.imageobject.attlist = + db.imageobject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.imageobject.info = db._info.title.forbidden + db.imageobject = + + ## A wrapper for image data and its associated meta-information + element imageobject { + db.imageobject.attlist, + db.imageobject.info, + db.imageobject.content + } +} +div { + db.textobject.role.attribute = attribute role { text } + db.textobject.attlist = + db.textobject.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.textobject.info = db._info.title.forbidden + db.textobject = + + ## A wrapper for a text description of an object and its associated meta-information + element textobject { + db.textobject.attlist, + db.textobject.info, + (db.phrase | db.textdata | db.all.blocks+) + } +} +div { + db.videodata.role.attribute = attribute role { text } + db.videodata.align.enumeration = db.halign.enumeration + db.videodata.align.attribute = + + ## Specifies the (horizontal) alignment of the video data + attribute align { db.videodata.align.enumeration } + db.videodata.valign.enumeration = db.valign.enumeration + db.videodata.valign.attribute = + + ## Specifies the vertical alignment of the video data + attribute valign { db.videodata.valign.enumeration } + db.videodata.width.attribute = db.width.attribute + db.videodata.depth.attribute = db.depth.attribute + db.videodata.contentwidth.attribute = db.contentwidth.attribute + db.videodata.contentdepth.attribute = db.contentdepth.attribute + db.videodata.scalefit.enumeration = db.scalefit.enumeration + db.videodata.scalefit.attribute = + + ## Determines if anamorphic scaling is forbidden + attribute scalefit { db.videodata.scalefit.enumeration } + db.videodata.scale.attribute = db.scale.attribute + db.videodata.attlist = + db.videodata.role.attribute? + & db.common.attributes + & db.common.data.attributes + & db.videodata.align.attribute? + & db.videodata.valign.attribute? + & db.videodata.width.attribute? + & db.videodata.contentwidth.attribute? + & db.videodata.scalefit.attribute? + & db.videodata.scale.attribute? + & db.videodata.depth.attribute? + & db.videodata.contentdepth.attribute? + db.videodata.info = db._info.title.forbidden + db.videodata = + + ## Pointer to external video data + element videodata { db.videodata.attlist, db.videodata.info } +} +div { + db.audiodata.role.attribute = attribute role { text } + db.audiodata.attlist = + db.audiodata.role.attribute? + & db.common.attributes + & db.common.data.attributes + db.audiodata.info = db._info.title.forbidden + db.audiodata = + + ## Pointer to external audio data + element audiodata { db.audiodata.attlist, db.audiodata.info } +} +div { + db.imagedata.role.attribute = attribute role { text } + db.imagedata.align.enumeration = db.halign.enumeration + db.imagedata.align.attribute = + + ## Specifies the (horizontal) alignment of the image data + attribute align { db.imagedata.align.enumeration } + db.imagedata.valign.enumeration = db.valign.enumeration + db.imagedata.valign.attribute = + + ## Specifies the vertical alignment of the image data + attribute valign { db.imagedata.valign.enumeration } + db.imagedata.width.attribute = db.width.attribute + db.imagedata.depth.attribute = db.depth.attribute + db.imagedata.contentwidth.attribute = db.contentwidth.attribute + db.imagedata.contentdepth.attribute = db.contentdepth.attribute + db.imagedata.scalefit.enumeration = db.scalefit.enumeration + db.imagedata.scalefit.attribute = + + ## Determines if anamorphic scaling is forbidden + attribute scalefit { db.imagedata.scalefit.enumeration } + db.imagedata.scale.attribute = db.scale.attribute + db.imagedata.attlist = + db.imagedata.role.attribute? + & db.common.attributes + & db.common.data.attributes + & db.imagedata.align.attribute? + & db.imagedata.valign.attribute? + & db.imagedata.width.attribute? + & db.imagedata.contentwidth.attribute? + & db.imagedata.scalefit.attribute? + & db.imagedata.scale.attribute? + & db.imagedata.depth.attribute? + & db.imagedata.contentdepth.attribute? + db.imagedata.info = db._info.title.forbidden + db.imagedata = + + ## Pointer to external image data + element imagedata { db.imagedata.attlist, db.imagedata.info } +} +div { + db.textdata.role.attribute = attribute role { text } + db.textdata.encoding.attribute = + + ## Identifies the encoding of the text in the external file + attribute encoding { text } + db.textdata.attlist = + db.textdata.role.attribute? + & db.common.attributes + & db.common.data.attributes + & db.textdata.encoding.attribute? + db.textdata.info = db._info.title.forbidden + db.textdata = + + ## Pointer to external text data + element textdata { db.textdata.attlist, db.textdata.info } +} +div { + db.caption.role.attribute = attribute role { text } + db.caption.attlist = + db.caption.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.caption.info = db._info.title.forbidden + db.caption = + + ## A caption + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:table)" + "table must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:sidebar)" + "sidebar must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:task)" + "task must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element caption { + db.caption.attlist, db.caption.info, db.all.blocks+ + } +} +div { + db.synopsis.role.attribute = attribute role { text } + db.synopsis.label.attribute = db.label.attribute + db.synopsis.attlist = + db.synopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + & db.synopsis.label.attribute? + db.synopsis = + + ## A general-purpose element for representing the syntax of commands or functions + element synopsis { db.synopsis.attlist, db.verbatim.contentmodel } +} +div { + db.cmdsynopsis.role.attribute = attribute role { text } + db.cmdsynopsis.sepchar.attribute = + + ## Specifies the character that should separate the command and its top-level arguments + attribute sepchar { text } + db.cmdsynopsis.cmdlength.attribute = + + ## Indicates the displayed length of the command; this information may be used to intelligently indent command synopses which extend beyond one line + attribute cmdlength { text } + db.cmdsynopsis.label.attribute = db.label.attribute + db.cmdsynopsis.attlist = + db.cmdsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.cmdsynopsis.sepchar.attribute? + & db.cmdsynopsis.cmdlength.attribute? + & db.cmdsynopsis.label.attribute? + db.cmdsynopsis.info = db._info.title.forbidden + db.cmdsynopsis = + + ## A syntax summary for a software command + element cmdsynopsis { + db.cmdsynopsis.attlist, + db.cmdsynopsis.info, + (db.command | db.arg | db.group | db.sbr)+, + db.synopfragment* + } +} +db.rep.enumeration = + + ## Can not be repeated. + "norepeat" + | + ## Can be repeated. + "repeat" +db.rep.attribute = + + ## Indicates whether or not repetition is possible. + [ a:defaultValue = "norepeat" ] attribute rep { db.rep.enumeration } +db.choice.enumeration = + + ## Formatted to indicate that it is optional. + "opt" + | + ## Formatted without indication. + "plain" + | + ## Formatted to indicate that it is required. + "req" +db.choice.opt.attribute = + + ## Indicates optionality. + [ a:defaultValue = "opt" ] attribute choice { db.choice.enumeration } +db.choice.req.attribute = + + ## Indicates optionality. + [ a:defaultValue = "req" ] attribute choice { db.choice.enumeration } +div { + db.arg.role.attribute = attribute role { text } + db.arg.rep.attribute = db.rep.attribute + db.arg.choice.attribute = db.choice.opt.attribute + db.arg.attlist = + db.arg.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.arg.rep.attribute? + & db.arg.choice.attribute? + db.arg = + + ## An argument in a CmdSynopsis + element arg { + db.arg.attlist, + (db._text + | db.arg + | db.group + | db.option + | db.synopfragmentref + | db.sbr)* + } +} +div { + db.group.role.attribute = attribute role { text } + db.group.rep.attribute = db.rep.attribute + db.group.choice.attribute = db.choice.opt.attribute + db.group.attlist = + db.group.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.group.rep.attribute? + & db.group.choice.attribute? + db.group = + + ## A group of elements in a CmdSynopsis + element group { + db.group.attlist, + (db.arg + | db.group + | db.option + | db.synopfragmentref + | db.replaceable + | db.sbr)+ + } +} +div { + db.sbr.role.attribute = attribute role { text } + db.sbr.attlist = db.sbr.role.attribute? & db.common.attributes + db.sbr = + + ## An explicit line break in a command synopsis + element sbr { db.sbr.attlist, empty } +} +div { + db.synopfragment.role.attribute = attribute role { text } + db.synopfragment.attlist = + db.synopfragment.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.synopfragment = + + ## A portion of a CmdSynopsis broken out from the main body of the synopsis + element synopfragment { + db.synopfragment.attlist, (db.arg | db.group)+ + } +} +div { + db.synopfragmentref.role.attribute = attribute role { text } + db.synopfragmentref.attlist = + db.synopfragmentref.role.attribute? + & db.common.attributes + & db.linkend.attribute + db.synopfragmentref = + + ## A reference to a fragment of a command synopsis + [ + s:pattern [ + name = "Synopsis fragment type constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:synopfragmentref" + "\x{a}" ~ + " " + s:assert [ + test = + "local-name(//*[@xml:id=current()/@linkend]) = 'synopfragment' and namespace-uri(//*[@xml:id=current()/@linkend]) = 'http://docbook.org/ns/docbook'" + "@linkend on synopfragmentref must point to a synopfragment." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element synopfragmentref { db.synopfragmentref.attlist, text } +} +div { + db.funcsynopsis.role.attribute = attribute role { text } + db.funcsynopsis.attlist = + db.funcsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.language.attribute? + db.funcsynopsis.info = db._info.title.forbidden + db.funcsynopsis = + + ## The syntax summary for a function definition + element funcsynopsis { + db.funcsynopsis.attlist, + db.funcsynopsis.info, + (db.funcsynopsisinfo | db.funcprototype)+ + } +} +div { + db.funcsynopsisinfo.role.attribute = attribute role { text } + db.funcsynopsisinfo.attlist = + db.funcsynopsisinfo.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + db.funcsynopsisinfo = + + ## Information supplementing the FuncDefs of a FuncSynopsis + element funcsynopsisinfo { + db.funcsynopsisinfo.attlist, db.verbatim.contentmodel + } +} +div { + db.funcprototype.role.attribute = attribute role { text } + db.funcprototype.attlist = + db.funcprototype.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.funcprototype = + + ## The prototype of a function + element funcprototype { + db.funcprototype.attlist, + db.modifier*, + db.funcdef, + (db.void | db.varargs | (db.paramdef+, db.varargs?)), + db.modifier* + } +} +div { + db.funcdef.role.attribute = attribute role { text } + db.funcdef.attlist = + db.funcdef.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.funcdef = + + ## A function (subroutine) name and its return type + element funcdef { + db.funcdef.attlist, (db._text | db.type | db.function)* + } +} +div { + db.void.role.attribute = attribute role { text } + db.void.attlist = + db.void.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.void = + + ## An empty element in a function synopsis indicating that the function in question takes no arguments + element void { db.void.attlist, empty } +} +div { + db.varargs.role.attribute = attribute role { text } + db.varargs.attlist = + db.varargs.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.varargs = + + ## An empty element in a function synopsis indicating a variable number of arguments + element varargs { db.varargs.attlist, empty } +} +div { + db.paramdef.role.attribute = attribute role { text } + db.paramdef.choice.enumeration = + + ## Formatted to indicate that it is optional. + "opt" + | + ## Formatted to indicate that it is required. + "req" + db.paramdef.choice.attribute = + + ## Indicates optionality. + [ a:defaultValue = "opt" ] + attribute choice { db.paramdef.choice.enumeration } + db.paramdef.attlist = + db.paramdef.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.paramdef.choice.attribute? + db.paramdef = + + ## Information about a function parameter in a programming language + element paramdef { + db.paramdef.attlist, + (db._text + | db.initializer + | db.type + | db.parameter + | db.funcparams)* + } +} +div { + db.funcparams.role.attribute = attribute role { text } + db.funcparams.attlist = + db.funcparams.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.funcparams = + + ## Parameters for a function referenced through a function pointer in a synopsis + element funcparams { db.funcparams.attlist, db._text } +} +div { + db.classsynopsis.role.attribute = attribute role { text } + db.classsynopsis.class.enumeration = + + ## This is the synopsis of a class + "class" + | + ## This is the synopsis of an interface + "interface" + db.classsynopsis.class.attribute = + + ## Specifies the nature of the synopsis + attribute class { db.classsynopsis.class.enumeration } + db.classsynopsis.attlist = + db.classsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.language.attribute? + & db.classsynopsis.class.attribute? + db.classsynopsis = + + ## The syntax summary for a class definition + element classsynopsis { + db.classsynopsis.attlist, + db.oo.inlines+, + (db.classsynopsisinfo + | db.methodsynopsis + | db.constructorsynopsis + | db.destructorsynopsis + | db.fieldsynopsis)* + } +} +div { + db.classsynopsisinfo.role.attribute = attribute role { text } + db.classsynopsisinfo.attlist = + db.classsynopsisinfo.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + db.classsynopsisinfo = + + ## Information supplementing the contents of a ClassSynopsis + element classsynopsisinfo { + db.classsynopsisinfo.attlist, db.verbatim.contentmodel + } +} +div { + db.ooclass.role.attribute = attribute role { text } + db.ooclass.attlist = + db.ooclass.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.ooclass = + + ## A class in an object-oriented programming language + element ooclass { + db.ooclass.attlist, (db.package | db.modifier)*, db.classname + } +} +div { + db.oointerface.role.attribute = attribute role { text } + db.oointerface.attlist = + db.oointerface.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.oointerface = + + ## An interface in an object-oriented programming language + element oointerface { + db.oointerface.attlist, + (db.package | db.modifier)*, + db.interfacename + } +} +div { + db.ooexception.role.attribute = attribute role { text } + db.ooexception.attlist = + db.ooexception.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.ooexception = + + ## An exception in an object-oriented programming language + element ooexception { + db.ooexception.attlist, + (db.package | db.modifier)*, + db.exceptionname + } +} +db.modifier.xml.space.attribute = + + ## Can be used to indicate that whitespace in the modifier should be preserved (for multi-line annotations, for example). + attribute xml:space { + + ## Extra whitespace and line breaks must be preserved. + [ + # Ideally the definition of xml:space used on modifier would be + # different from the definition used on the verbatim elements. The + # verbatim elements forbid the use of xml:space="default" which + # wouldn't be a problem on modifier. But doing that causes the + # generated XSD schemas to be broken so I'm just reusing the existing + # definition for now. It won't be backwards incompatible to fix this + # problem in the future. + # | ## Extra whitespace and line breaks are not preserved. + # "default" + + ] + "preserve" + } +div { + db.modifier.role.attribute = attribute role { text } + db.modifier.attlist = + db.modifier.xml.space.attribute? + & db.modifier.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.modifier = + + ## Modifiers in a synopsis + element modifier { db.modifier.attlist, db._text } +} +div { + db.interfacename.role.attribute = attribute role { text } + db.interfacename.attlist = + db.interfacename.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.interfacename = + + ## The name of an interface + element interfacename { db.interfacename.attlist, db._text } +} +div { + db.exceptionname.role.attribute = attribute role { text } + db.exceptionname.attlist = + db.exceptionname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.exceptionname = + + ## The name of an exception + element exceptionname { db.exceptionname.attlist, db._text } +} +div { + db.fieldsynopsis.role.attribute = attribute role { text } + db.fieldsynopsis.attlist = + db.fieldsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.language.attribute? + db.fieldsynopsis = + + ## The name of a field in a class definition + element fieldsynopsis { + db.fieldsynopsis.attlist, + db.modifier*, + db.type?, + db.varname, + db.initializer? + } +} +div { + db.initializer.role.attribute = attribute role { text } + db.initializer.attlist = + db.initializer.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.initializer = + + ## The initializer for a FieldSynopsis + element initializer { db.initializer.attlist, db._text } +} +div { + db.constructorsynopsis.role.attribute = attribute role { text } + db.constructorsynopsis.attlist = + db.constructorsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.language.attribute? + db.constructorsynopsis = + + ## A syntax summary for a constructor + element constructorsynopsis { + db.constructorsynopsis.attlist, + db.modifier*, + db.methodname?, + (db.methodparam+ | db.void?), + db.exceptionname* + } +} +div { + db.destructorsynopsis.role.attribute = attribute role { text } + db.destructorsynopsis.attlist = + db.destructorsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.language.attribute? + db.destructorsynopsis = + + ## A syntax summary for a destructor + element destructorsynopsis { + db.destructorsynopsis.attlist, + db.modifier*, + db.methodname?, + (db.methodparam+ | db.void?), + db.exceptionname* + } +} +div { + db.methodsynopsis.role.attribute = attribute role { text } + db.methodsynopsis.attlist = + db.methodsynopsis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.language.attribute? + db.methodsynopsis = + + ## A syntax summary for a method + element methodsynopsis { + db.methodsynopsis.attlist, + db.modifier*, + (db.type | db.void)?, + db.methodname, + (db.methodparam+ | db.void), + db.exceptionname*, + db.modifier* + } +} +div { + db.methodname.role.attribute = attribute role { text } + db.methodname.attlist = + db.methodname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.methodname = + + ## The name of a method + element methodname { db.methodname.attlist, db._text } +} +div { + db.methodparam.role.attribute = attribute role { text } + db.methodparam.rep.attribute = db.rep.attribute + db.methodparam.choice.attribute = db.choice.req.attribute + db.methodparam.attlist = + db.methodparam.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.methodparam.rep.attribute? + & db.methodparam.choice.attribute? + db.methodparam = + + ## Parameters to a method + element methodparam { + db.methodparam.attlist, + db.modifier*, + db.type?, + ((db.modifier*, db.parameter, db.initializer?) | db.funcparams), + db.modifier* + } +} +div { + db.address.role.attribute = attribute role { text } + db.address.attlist = + db.address.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.verbatim.attributes + db.address = + + ## A real-world address, generally a postal address + element address { + db.address.attlist, + (db._text + | db.personname + | db.pob + | db.street + | db.city + | db.state + | db.postcode + | db.country + | db.phone + | db.fax + | db.email + | db.otheraddr)* + } +} +div { + db.street.role.attribute = attribute role { text } + db.street.attlist = + db.street.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.street = + + ## A street address in an address + element street { db.street.attlist, db._text } +} +div { + db.pob.role.attribute = attribute role { text } + db.pob.attlist = + db.pob.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.pob = + + ## A post office box in an address + element pob { db.pob.attlist, db._text } +} +div { + db.postcode.role.attribute = attribute role { text } + db.postcode.attlist = + db.postcode.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.postcode = + + ## A postal code in an address + element postcode { db.postcode.attlist, db._text } +} +div { + db.city.role.attribute = attribute role { text } + db.city.attlist = + db.city.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.city = + + ## The name of a city in an address + element city { db.city.attlist, db._text } +} +div { + db.state.role.attribute = attribute role { text } + db.state.attlist = + db.state.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.state = + + ## A state or province in an address + element state { db.state.attlist, db._text } +} +div { + db.country.role.attribute = attribute role { text } + db.country.attlist = + db.country.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.country = + + ## The name of a country + element country { db.country.attlist, db._text } +} +div { + db.phone.role.attribute = attribute role { text } + db.phone.attlist = + db.phone.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.phone = + + ## A telephone number + element phone { db.phone.attlist, db._text } +} +div { + db.fax.role.attribute = attribute role { text } + db.fax.attlist = + db.fax.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.fax = + + ## A fax number + element fax { db.fax.attlist, db._text } +} +div { + db.otheraddr.role.attribute = attribute role { text } + db.otheraddr.attlist = + db.otheraddr.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.otheraddr = + + ## Uncategorized information in address + element otheraddr { db.otheraddr.attlist, db._text } +} +div { + db.affiliation.role.attribute = attribute role { text } + db.affiliation.attlist = + db.affiliation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.affiliation = + + ## The institutional affiliation of an individual + element affiliation { + db.affiliation.attlist, + db.shortaffil?, + db.jobtitle*, + (db.org? | (db.orgname?, db.orgdiv*, db.address*)) + } +} +div { + db.shortaffil.role.attribute = attribute role { text } + db.shortaffil.attlist = + db.shortaffil.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.shortaffil = + + ## A brief description of an affiliation + element shortaffil { db.shortaffil.attlist, db._text } +} +div { + db.jobtitle.role.attribute = attribute role { text } + db.jobtitle.attlist = + db.jobtitle.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.jobtitle = + + ## The title of an individual in an organization + element jobtitle { db.jobtitle.attlist, db._text } +} +div { + db.orgname.class.enumeration = + + ## A consortium + "consortium" + | + ## A corporation + "corporation" + | + ## An informal organization + "informal" + | + ## A non-profit organization + "nonprofit" + db.orgname.class-enum.attribute = + + ## Specifies the nature of the organization + attribute class { db.orgname.class.enumeration } + db.orgname.class-other.attributes = + + ## Specifies the nature of the organization + attribute class { + + ## Indicates a non-standard organization class + "other" + }, + + ## Identifies the non-standard nature of the organization + attribute otherclass { text } + db.orgname.class.attribute = + db.orgname.class-enum.attribute | db.orgname.class-other.attributes + db.orgname.role.attribute = attribute role { text } + db.orgname.attlist = + db.orgname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.orgname.class.attribute? + db.orgname = + + ## The name of an organization other than a corporation + element orgname { db.orgname.attlist, db._text } +} +div { + db.orgdiv.role.attribute = attribute role { text } + db.orgdiv.attlist = + db.orgdiv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.orgdiv = + + ## A division of an organization + element orgdiv { db.orgdiv.attlist, db.all.inlines* } +} +div { + db.artpagenums.role.attribute = attribute role { text } + db.artpagenums.attlist = + db.artpagenums.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.artpagenums = + + ## The page numbers of an article as published + element artpagenums { db.artpagenums.attlist, db._text } +} +div { + db.personname.role.attribute = attribute role { text } + db.personname.attlist = + db.personname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.personname = + + ## The personal name of an individual + element personname { + db.personname.attlist, + (db._text + | (db.honorific + | db.firstname + | db.surname + | db.lineage + | db.othername)+) + } +} +db.person.author.contentmodel = + db.personname, + (db.personblurb + | db.affiliation + | db.email + | db.address + | db.contrib)* +db.org.author.contentmodel = + db.orgname, + (db.orgdiv | db.affiliation | db.email | db.address | db.contrib)* +db.credit.contentmodel = + db.person.author.contentmodel | db.org.author.contentmodel +div { + db.author.role.attribute = attribute role { text } + db.author.attlist = + db.author.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.author = + + ## The name of an individual author + element author { db.author.attlist, db.credit.contentmodel } +} +div { + db.authorgroup.role.attribute = attribute role { text } + db.authorgroup.attlist = + db.authorgroup.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.authorgroup = + + ## Wrapper for author information when a document has multiple authors or collabarators + element authorgroup { + db.authorgroup.attlist, (db.author | db.editor | db.othercredit)+ + } +} +div { + db.collab.role.attribute = attribute role { text } + db.collab.attlist = + db.collab.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.collab = + + ## Identifies a collaborator + element collab { + db.collab.attlist, + (db.person | db.personname | db.org | db.orgname)+, + db.affiliation* + } +} +div { + db.authorinitials.role.attribute = attribute role { text } + db.authorinitials.attlist = + db.authorinitials.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.authorinitials = + + ## The initials or other short identifier for an author + element authorinitials { db.authorinitials.attlist, db._text } +} +div { + db.person.role.attribute = attribute role { text } + db.person.attlist = + db.person.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.person = + + ## A person and associated metadata + element person { + db.person.attlist, + db.personname, + (db.address | db.affiliation | db.email | db.personblurb)* + } +} +div { + db.org.role.attribute = attribute role { text } + db.org.attlist = + db.org.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.org = + + ## An organization and associated metadata + element org { + db.org.attlist, + db.orgname, + (db.address | db.affiliation | db.email | db.orgdiv)* + } +} +div { + db.confgroup.role.attribute = attribute role { text } + db.confgroup.attlist = + db.confgroup.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.confgroup = + + ## A wrapper for document meta-information about a conference + element confgroup { + db.confgroup.attlist, + (db.confdates + | db.conftitle + | db.confnum + | db.confsponsor + | db.address)* + } +} +div { + db.confdates.role.attribute = attribute role { text } + db.confdates.attlist = + db.confdates.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.confdates = + + ## The dates of a conference for which a document was written + element confdates { db.confdates.attlist, db._text } +} +div { + db.conftitle.role.attribute = attribute role { text } + db.conftitle.attlist = + db.conftitle.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.conftitle = + + ## The title of a conference for which a document was written + element conftitle { db.conftitle.attlist, db._text } +} +div { + db.confnum.role.attribute = attribute role { text } + db.confnum.attlist = + db.confnum.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.confnum = + + ## An identifier, frequently numerical, associated with a conference for which a document was written + element confnum { db.confnum.attlist, db._text } +} +div { + db.confsponsor.role.attribute = attribute role { text } + db.confsponsor.attlist = + db.confsponsor.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.confsponsor = + + ## The sponsor of a conference for which a document was written + element confsponsor { db.confsponsor.attlist, db._text } +} +div { + db.contractnum.role.attribute = attribute role { text } + db.contractnum.attlist = + db.contractnum.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.contractnum = + + ## The contract number of a document + element contractnum { db.contractnum.attlist, db._text } +} +div { + db.contractsponsor.role.attribute = attribute role { text } + db.contractsponsor.attlist = + db.contractsponsor.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.contractsponsor = + + ## The sponsor of a contract + element contractsponsor { db.contractsponsor.attlist, db._text } +} +div { + db.copyright.role.attribute = attribute role { text } + db.copyright.attlist = + db.copyright.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.copyright = + + ## Copyright information about a document + element copyright { db.copyright.attlist, db.year+, db.holder* } +} +div { + db.year.role.attribute = attribute role { text } + db.year.attlist = + db.year.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.year = + + ## The year of publication of a document + element year { db.year.attlist, db._text } +} +div { + db.holder.role.attribute = attribute role { text } + db.holder.attlist = + db.holder.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.holder = + + ## The name of the individual or organization that holds a copyright + element holder { db.holder.attlist, db._text } +} +db.cover.contentmodel = + (db.para.blocks + | db.extension.blocks + | db.list.blocks + | db.informal.blocks + | db.publishing.blocks + | db.graphic.blocks + | db.technical.blocks + | db.verbatim.blocks + | db.bridgehead + | db.synopsis.blocks + | db.remark + | db.revhistory)+ +div { + db.cover.role.attribute = attribute role { text } + db.cover.attlist = + db.cover.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.cover = + + ## Additional content for the cover of a publication + element cover { db.cover.attlist, db.cover.contentmodel } +} +db.date.contentmodel = + xsd:date | xsd:dateTime | xsd:gYearMonth | xsd:gYear | text +div { + db.date.role.attribute = attribute role { text } + db.date.attlist = + db.date.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.date = + + ## The date of publication or revision of a document + element date { db.date.attlist, db.date.contentmodel } +} +div { + db.edition.role.attribute = attribute role { text } + db.edition.attlist = + db.edition.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.edition = + + ## The name or number of an edition of a document + element edition { db.edition.attlist, db._text } +} +div { + db.editor.role.attribute = attribute role { text } + db.editor.attlist = + db.editor.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.editor = + + ## The name of the editor of a document + element editor { db.editor.attlist, db.credit.contentmodel } +} +div { + db.biblioid.role.attribute = attribute role { text } + db.biblioid.attlist = + db.biblioid.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.biblio.class.attribute + db.biblioid = + + ## An identifier for a document + element biblioid { db.biblioid.attlist, db._text } +} +div { + db.citebiblioid.role.attribute = attribute role { text } + db.citebiblioid.attlist = + db.citebiblioid.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.biblio.class.attribute + db.citebiblioid = + + ## A citation of a bibliographic identifier + element citebiblioid { db.citebiblioid.attlist, db._text } +} +div { + db.bibliosource.role.attribute = attribute role { text } + db.bibliosource.attlist = + db.bibliosource.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.biblio.class.attribute + db.bibliosource = + + ## The source of a document + element bibliosource { db.bibliosource.attlist, db._text } +} +div { + db.bibliorelation.type.enumeration = + + ## The described resource pre-existed the referenced resource, which is essentially the same intellectual content presented in another format + "hasformat" + | + ## The described resource includes the referenced resource either physically or logically + "haspart" + | + ## The described resource has a version, edition, or adaptation, namely, the referenced resource + "hasversion" + | + ## The described resource is the same intellectual content of the referenced resource, but presented in another format + "isformatof" + | + ## The described resource is a physical or logical part of the referenced resource + "ispartof" + | + ## The described resource is referenced, cited, or otherwise pointed to by the referenced resource + "isreferencedby" + | + ## The described resource is supplanted, displaced, or superceded by the referenced resource + "isreplacedby" + | + ## The described resource is required by the referenced resource, either physically or logically + "isrequiredby" + | + ## The described resource is a version, edition, or adaptation of the referenced resource; changes in version imply substantive changes in content rather than differences in format + "isversionof" + | + ## The described resource references, cites, or otherwise points to the referenced resource + "references" + | + ## The described resource supplants, displaces, or supersedes the referenced resource + "replaces" + | + ## The described resource requires the referenced resource to support its function, delivery, or coherence of content + "requires" + db.bibliorelation.type-enum.attribute = + + ## Identifies the type of relationship + attribute type { db.bibliorelation.type.enumeration }? + db.bibliorelation.type-other.attributes = + + ## Identifies the type of relationship + attribute type { + + ## The described resource has a non-standard relationship with the referenced resource + "othertype" + }?, + + ## A keyword that identififes the type of the non-standard relationship + attribute othertype { xsd:NMTOKEN } + db.bibliorelation.type.attribute = + db.bibliorelation.type-enum.attribute + | db.bibliorelation.type-other.attributes + db.bibliorelation.role.attribute = attribute role { text } + db.bibliorelation.attlist = + db.bibliorelation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.biblio.class.attribute + & db.bibliorelation.type.attribute + db.bibliorelation = + + ## The relationship of a document to another + element bibliorelation { db.bibliorelation.attlist, db._text } +} +div { + db.bibliocoverage.spacial.enumeration = + + ## The DCMI Point identifies a point in space using its geographic coordinates + "dcmipoint" + | + ## ISO 3166 Codes for the representation of names of countries + "iso3166" + | + ## The DCMI Box identifies a region of space using its geographic limits + "dcmibox" + | + ## The Getty Thesaurus of Geographic Names + "tgn" + db.bibliocoverage.spatial-enum.attribute = + + ## Specifies the type of spatial coverage + attribute spatial { db.bibliocoverage.spacial.enumeration }? + db.bibliocoverage.spatial-other.attributes = + + ## Specifies the type of spatial coverage + attribute spatial { + + ## Identifies a non-standard type of coverage + "otherspatial" + }?, + + ## A keyword that identifies the type of non-standard coverage + attribute otherspatial { xsd:NMTOKEN } + db.bibliocoverage.spatial.attribute = + db.bibliocoverage.spatial-enum.attribute + | db.bibliocoverage.spatial-other.attributes + db.bibliocoverage.temporal.enumeration = + + ## A specification of the limits of a time interval + "dcmiperiod" + | + ## W3C Encoding rules for dates and times—a profile based on ISO 8601 + "w3c-dtf" + db.bibliocoverage.temporal-enum.attribute = + + ## Specifies the type of temporal coverage + attribute temporal { db.bibliocoverage.temporal.enumeration }? + db.bibliocoverage.temporal-other.attributes = + + ## Specifies the type of temporal coverage + attribute temporal { + + ## Specifies a non-standard type of coverage + "othertemporal" + }?, + + ## A keyword that identifies the type of non-standard coverage + attribute othertemporal { xsd:NMTOKEN } + db.bibliocoverage.temporal.attribute = + db.bibliocoverage.temporal-enum.attribute + | db.bibliocoverage.temporal-other.attributes + db.bibliocoverage.coverage.attrib = + db.bibliocoverage.spatial.attribute + & db.bibliocoverage.temporal.attribute + db.bibliocoverage.role.attribute = attribute role { text } + db.bibliocoverage.attlist = + db.bibliocoverage.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.bibliocoverage.coverage.attrib + db.bibliocoverage = + + ## The spatial or temporal coverage of a document + element bibliocoverage { db.bibliocoverage.attlist, db._text } +} +div { + db.legalnotice.role.attribute = attribute role { text } + db.legalnotice.attlist = + db.legalnotice.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.legalnotice.info = db._info.title.only + db.legalnotice = + + ## A statement of legal obligations or requirements + element legalnotice { + db.legalnotice.attlist, db.legalnotice.info, db.all.blocks+ + } +} +div { + db.othercredit.class.enumeration = + + ## A copy editor + "copyeditor" + | + ## A graphic designer + "graphicdesigner" + | + ## Some other contributor + "other" + | + ## A production editor + "productioneditor" + | + ## A technical editor + "technicaleditor" + | + ## A translator + "translator" + db.othercredit.class-enum.attribute = + + ## Identifies the nature of the contributor + attribute class { db.othercredit.class.enumeration }? + db.othercredit.class-other.attribute = + + ## Identifies the nature of the non-standard contribution + attribute otherclass { xsd:NMTOKEN } + db.othercredit.class-other.attributes = + + ## Identifies the nature of the contributor + attribute class { + + ## Identifies a non-standard contribution + "other" + } + & db.othercredit.class-other.attribute + db.othercredit.class.attribute = + db.othercredit.class-enum.attribute + | db.othercredit.class-other.attributes + db.othercredit.role.attribute = attribute role { text } + db.othercredit.attlist = + db.othercredit.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.othercredit.class.attribute + db.othercredit = + + ## A person or entity, other than an author or editor, credited in a document + element othercredit { + db.othercredit.attlist, db.credit.contentmodel + } +} +div { + db.pagenums.role.attribute = attribute role { text } + db.pagenums.attlist = + db.pagenums.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.pagenums = + + ## The numbers of the pages in a book, for use in a bibliographic entry + element pagenums { db.pagenums.attlist, db._text } +} +div { + db.contrib.role.attribute = attribute role { text } + db.contrib.attlist = + db.contrib.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.contrib = + + ## A summary of the contributions made to a document by a credited source + element contrib { db.contrib.attlist, db._text } +} +div { + db.honorific.role.attribute = attribute role { text } + db.honorific.attlist = + db.honorific.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.honorific = + + ## The title of a person + element honorific { db.honorific.attlist, db._text } +} +div { + db.firstname.role.attribute = attribute role { text } + db.firstname.attlist = + db.firstname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.firstname = + + ## The first name of a person + element firstname { db.firstname.attlist, db._text } +} +div { + db.surname.role.attribute = attribute role { text } + db.surname.attlist = + db.surname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.surname = + + ## A family name; in western cultures the last name + element surname { db.surname.attlist, db._text } +} +div { + db.lineage.role.attribute = attribute role { text } + db.lineage.attlist = + db.lineage.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.lineage = + + ## The portion of a person's name indicating a relationship to ancestors + element lineage { db.lineage.attlist, db._text } +} +div { + db.othername.role.attribute = attribute role { text } + db.othername.attlist = + db.othername.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.othername = + + ## A component of a persons name that is not a first name, surname, or lineage + element othername { db.othername.attlist, db._text } +} +div { + db.printhistory.role.attribute = attribute role { text } + db.printhistory.attlist = + db.printhistory.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.printhistory = + + ## The printing history of a document + element printhistory { db.printhistory.attlist, db.para.blocks+ } +} +div { + db.productname.role.attribute = attribute role { text } + db.productname.class.enumeration = + + ## A name with a copyright + "copyright" + | + ## A name with a registered copyright + "registered" + | + ## A name of a service + "service" + | + ## A name which is trademarked + "trade" + db.productname.class.attribute = + + ## Specifies the class of product name + attribute class { db.productname.class.enumeration } + db.productname.attlist = + db.productname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.productname.class.attribute? + db.productname = + + ## The formal name of a product + element productname { db.productname.attlist, db._text } +} +div { + db.productnumber.role.attribute = attribute role { text } + db.productnumber.attlist = + db.productnumber.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.productnumber = + + ## A number assigned to a product + element productnumber { db.productnumber.attlist, db._text } +} +div { + db.pubdate.role.attribute = attribute role { text } + db.pubdate.attlist = + db.pubdate.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.pubdate = + + ## The date of publication of a document + element pubdate { db.pubdate.attlist, db.date.contentmodel } +} +div { + db.publisher.role.attribute = attribute role { text } + db.publisher.attlist = + db.publisher.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.publisher = + + ## The publisher of a document + element publisher { + db.publisher.attlist, db.publishername, db.address* + } +} +div { + db.publishername.role.attribute = attribute role { text } + db.publishername.attlist = + db.publishername.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.publishername = + + ## The name of the publisher of a document + element publishername { db.publishername.attlist, db._text } +} +div { + db.releaseinfo.role.attribute = attribute role { text } + db.releaseinfo.attlist = + db.releaseinfo.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.releaseinfo = + + ## Information about a particular release of a document + element releaseinfo { db.releaseinfo.attlist, db._text } +} +div { + db.revhistory.role.attribute = attribute role { text } + db.revhistory.attlist = + db.revhistory.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.revhistory.info = db._info.title.only + db.revhistory = + + ## A history of the revisions to a document + element revhistory { + db.revhistory.attlist, db.revhistory.info, db.revision+ + } +} +div { + db.revision.role.attribute = attribute role { text } + db.revision.attlist = + db.revision.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.revision = + + ## An entry describing a single revision in the history of the revisions to a document + element revision { + db.revision.attlist, + db.revnumber?, + db.date, + (db.authorinitials | db.author)*, + (db.revremark | db.revdescription)? + } +} +div { + db.revnumber.role.attribute = attribute role { text } + db.revnumber.attlist = + db.revnumber.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.revnumber = + + ## A document revision number + element revnumber { db.revnumber.attlist, db._text } +} +div { + db.revremark.role.attribute = attribute role { text } + db.revremark.attlist = + db.revremark.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.revremark = + + ## A description of a revision to a document + element revremark { db.revremark.attlist, db._text } +} +div { + db.revdescription.role.attribute = attribute role { text } + db.revdescription.attlist = + db.revdescription.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.revdescription = + + ## A extended description of a revision to a document + element revdescription { db.revdescription.attlist, db.all.blocks* } +} +div { + db.seriesvolnums.role.attribute = attribute role { text } + db.seriesvolnums.attlist = + db.seriesvolnums.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.seriesvolnums = + + ## Numbers of the volumes in a series of books + element seriesvolnums { db.seriesvolnums.attlist, db._text } +} +div { + db.volumenum.role.attribute = attribute role { text } + db.volumenum.attlist = + db.volumenum.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.volumenum = + + ## The volume number of a document in a set (as of books in a set or articles in a journal) + element volumenum { db.volumenum.attlist, db._text } +} +div { + db.issuenum.role.attribute = attribute role { text } + db.issuenum.attlist = + db.issuenum.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.issuenum = + + ## The number of an issue of a journal + element issuenum { db.issuenum.attlist, db._text } +} +div { + db.accel.role.attribute = attribute role { text } + db.accel.attlist = + db.accel.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.accel = + + ## A graphical user interface (GUI) keyboard shortcut + element accel { db.accel.attlist, db._text } +} +div { + db.application.class.enumeration = + + ## A hardware application + "hardware" + | + ## A software application + "software" + db.application.class.attribute = + + ## Identifies the class of application + attribute class { db.application.class.enumeration } + db.application.role.attribute = attribute role { text } + db.application.attlist = + db.application.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.application.class.attribute? + db.application = + + ## The name of a software program + element application { db.application.attlist, db._text } +} +div { + db.package.role.attribute = attribute role { text } + db.package.attlist = + db.package.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.package = + + ## A software or application package + element package { db.package.attlist, db._text } +} +div { + db.classname.role.attribute = attribute role { text } + db.classname.attlist = + db.classname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.classname = + + ## The name of a class, in the object-oriented programming sense + element classname { db.classname.attlist, db._text } +} +div { + db.command.role.attribute = attribute role { text } + db.command.attlist = + db.command.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.command = + + ## The name of an executable program or other software command + element command { db.command.attlist, db._text } +} +db.computeroutput.inlines = + (text + | db.ubiq.inlines + | db.os.inlines + | db.technical.inlines + | db.markup.inlines) + | db.co +div { + db.computeroutput.role.attribute = attribute role { text } + db.computeroutput.attlist = + db.computeroutput.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.computeroutput = + + ## Data, generally text, displayed or presented by a computer + element computeroutput { + db.computeroutput.attlist, db.computeroutput.inlines* + } +} +div { + db.database.class.enumeration = + + ## An alternate or secondary key + "altkey" + | + ## A constraint + "constraint" + | + ## A data type + "datatype" + | + ## A field + "field" + | + ## A foreign key + "foreignkey" + | + ## A group + "group" + | + ## An index + "index" + | + ## The first or primary key + "key1" + | + ## An alternate or secondary key + "key2" + | + ## A name + "name" + | + ## The primary key + "primarykey" + | + ## A (stored) procedure + "procedure" + | + ## A record + "record" + | + ## A rule + "rule" + | + ## The secondary key + "secondarykey" + | + ## A table + "table" + | + ## A user + "user" + | + ## A view + "view" + db.database.class.attribute = + + ## Identifies the class of database artifact + attribute class { db.database.class.enumeration } + db.database.role.attribute = attribute role { text } + db.database.attlist = + db.database.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.database.class.attribute? + db.database = + + ## The name of a database, or part of a database + element database { db.database.attlist, db._text } +} +div { + db.email.role.attribute = attribute role { text } + db.email.attlist = + db.email.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.email = + + ## An email address + element email { db.email.attlist, db._text } +} +div { + db.envar.role.attribute = attribute role { text } + db.envar.attlist = + db.envar.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.envar = + + ## A software environment variable + element envar { db.envar.attlist, db._text } +} +div { + db.errorcode.role.attribute = attribute role { text } + db.errorcode.attlist = + db.errorcode.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.errorcode = + + ## An error code + element errorcode { db.errorcode.attlist, db._text } +} +div { + db.errorname.role.attribute = attribute role { text } + db.errorname.attlist = + db.errorname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.errorname = + + ## An error name + element errorname { db.errorname.attlist, db._text } +} +div { + db.errortext.role.attribute = attribute role { text } + db.errortext.attlist = + db.errortext.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.errortext = + + ## An error message. + element errortext { db.errortext.attlist, db._text } +} +div { + db.errortype.role.attribute = attribute role { text } + db.errortype.attlist = + db.errortype.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.errortype = + + ## The classification of an error message + element errortype { db.errortype.attlist, db._text } +} +div { + db.filename.class.enumeration = + + ## A device + "devicefile" + | + ## A directory + "directory" + | + ## A filename extension + "extension" + | + ## A header file (as for a programming language) + "headerfile" + | + ## A library file + "libraryfile" + | + ## A partition (as of a hard disk) + "partition" + | + ## A symbolic link + "symlink" + db.filename.class.attribute = + + ## Identifies the class of filename + attribute class { db.filename.class.enumeration } + db.filename.path.attribute = + + ## Specifies the path of the filename + attribute path { text } + db.filename.role.attribute = attribute role { text } + db.filename.attlist = + db.filename.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.filename.path.attribute? + & db.filename.class.attribute? + db.filename = + + ## The name of a file + element filename { db.filename.attlist, db._text } +} +div { + db.function.role.attribute = attribute role { text } + db.function.attlist = + db.function.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.function = + + ## The name of a function or subroutine, as in a programming language + element function { db.function.attlist, db._text } +} +div { + db.guibutton.role.attribute = attribute role { text } + db.guibutton.attlist = + db.guibutton.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.guibutton = + + ## The text on a button in a GUI + element guibutton { + db.guibutton.attlist, + (db._text | db.accel | db.superscript | db.subscript)* + } +} +div { + db.guiicon.role.attribute = attribute role { text } + db.guiicon.attlist = + db.guiicon.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.guiicon = + + ## Graphic and/or text appearing as a icon in a GUI + element guiicon { + db.guiicon.attlist, + (db._text | db.accel | db.superscript | db.subscript)* + } +} +div { + db.guilabel.role.attribute = attribute role { text } + db.guilabel.attlist = + db.guilabel.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.guilabel = + + ## The text of a label in a GUI + element guilabel { + db.guilabel.attlist, + (db._text | db.accel | db.superscript | db.subscript)* + } +} +div { + db.guimenu.role.attribute = attribute role { text } + db.guimenu.attlist = + db.guimenu.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.guimenu = + + ## The name of a menu in a GUI + element guimenu { + db.guimenu.attlist, + (db._text | db.accel | db.superscript | db.subscript)* + } +} +div { + db.guimenuitem.role.attribute = attribute role { text } + db.guimenuitem.attlist = + db.guimenuitem.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.guimenuitem = + + ## The name of a terminal menu item in a GUI + element guimenuitem { + db.guimenuitem.attlist, + (db._text | db.accel | db.superscript | db.subscript)* + } +} +div { + db.guisubmenu.role.attribute = attribute role { text } + db.guisubmenu.attlist = + db.guisubmenu.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.guisubmenu = + + ## The name of a submenu in a GUI + element guisubmenu { + db.guisubmenu.attlist, + (db._text | db.accel | db.superscript | db.subscript)* + } +} +div { + db.hardware.role.attribute = attribute role { text } + db.hardware.attlist = + db.hardware.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.hardware = + + ## A physical part of a computer system + element hardware { db.hardware.attlist, db._text } +} +div { + db.keycap.function.enumeration = + + ## The "Alt" key + "alt" + | + ## The "Backspace" key + "backspace" + | + ## The "Command" key + "command" + | + ## The "Control" key + "control" + | + ## The "Delete" key + "delete" + | + ## The down arrow + "down" + | + ## The "End" key + "end" + | + ## The "Enter" or "Return" key + "enter" + | + ## The "Escape" key + "escape" + | + ## The "Home" key + "home" + | + ## The "Insert" key + "insert" + | + ## The left arrow + "left" + | + ## The "Meta" key + "meta" + | + ## The "Option" key + "option" + | + ## The page down key + "pagedown" + | + ## The page up key + "pageup" + | + ## The right arrow + "right" + | + ## The "Shift" key + "shift" + | + ## The spacebar + "space" + | + ## The "Tab" key + "tab" + | + ## The up arrow + "up" + db.keycap.function-enum.attribute = + + ## Identifies the function key + attribute function { db.keycap.function.enumeration }? + db.keycap.function-other.attributes = + + ## Identifies the function key + attribute function { + + ## Indicates a non-standard function key + "other" + }?, + + ## Specifies a keyword that identifies the non-standard key + attribute otherfunction { text } + db.keycap.function.attrib = + db.keycap.function-enum.attribute + | db.keycap.function-other.attributes + db.keycap.role.attribute = attribute role { text } + db.keycap.attlist = + db.keycap.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.keycap.function.attrib + db.keycap = + + ## The text printed on a key on a keyboard + element keycap { db.keycap.attlist, db._text } +} +div { + db.keycode.role.attribute = attribute role { text } + db.keycode.attlist = + db.keycode.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.keycode = + + ## The internal, frequently numeric, identifier for a key on a keyboard + element keycode { db.keycode.attlist, db._text } +} +div { + db.keycombo.action.enumeration = + + ## A (single) mouse click. + "click" + | + ## A double mouse click. + "double-click" + | + ## A mouse or key press. + "press" + | + ## Sequential clicks or presses. + "seq" + | + ## Simultaneous clicks or presses. + "simul" + db.keycombo.action-enum.attribute = + + ## Identifies the nature of the action taken. If keycombo + ## contains more than one element, simul + ## is the default, otherwise there is no default. + attribute action { db.keycombo.action.enumeration }? + db.keycombo.action-other.attributes = + + ## Identifies the nature of the action taken + attribute action { + + ## Indicates a non-standard action + "other" + }?, + + ## Identifies the non-standard action in some unspecified way. + attribute otheraction { text } + db.keycombo.action.attrib = + db.keycombo.action-enum.attribute + | db.keycombo.action-other.attributes + db.keycombo.role.attribute = attribute role { text } + db.keycombo.attlist = + db.keycombo.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.keycombo.action.attrib + db.keycombo = + + ## A combination of input actions + element keycombo { + db.keycombo.attlist, + (db.keycap | db.keycombo | db.keysym | db.mousebutton)+ + } +} +div { + db.keysym.role.attribute = attribute role { text } + db.keysym.attlist = + db.keysym.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.keysym = + + ## The symbolic name of a key on a keyboard + element keysym { db.keysym.attlist, db._text } +} +div { + db.lineannotation.role.attribute = attribute role { text } + db.lineannotation.attlist = + db.lineannotation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.lineannotation = + + ## A comment on a line in a verbatim listing + element lineannotation { db.lineannotation.attlist, db._text } +} +div { + db.literal.role.attribute = attribute role { text } + db.literal.attlist = + db.literal.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.literal = + + ## Inline text that is some literal value + element literal { db.literal.attlist, db._text } +} +div { + code.language.attribute = + + ## Identifies the (computer) language of the code fragment + attribute language { text } + db.code.role.attribute = attribute role { text } + db.code.attlist = + db.code.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & code.language.attribute? + db.code = + + ## An inline code fragment + element code { + db.code.attlist, (db.programming.inlines | db._text)* + } +} +div { + db.constant.class.attribute = + + ## Identifies the class of constant + attribute class { + + ## The value is a limit of some kind + "limit" + } + db.constant.role.attribute = attribute role { text } + db.constant.attlist = + db.constant.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.constant.class.attribute? + db.constant = + + ## A programming or system constant + element constant { db.constant.attlist, db._text } +} +div { + db.varname.role.attribute = attribute role { text } + db.varname.attlist = + db.varname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.varname = + + ## The name of a variable + element varname { db.varname.attlist, db._text } +} +div { + db.markup.role.attribute = attribute role { text } + db.markup.attlist = + db.markup.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.markup = + + ## A string of formatting markup in text that is to be represented literally + element markup { db.markup.attlist, db._text } +} +div { + db.menuchoice.role.attribute = attribute role { text } + db.menuchoice.attlist = + db.menuchoice.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.menuchoice = + + ## A selection or series of selections from a menu + element menuchoice { + db.menuchoice.attlist, + db.shortcut?, + (db.guibutton + | db.guiicon + | db.guilabel + | db.guimenu + | db.guimenuitem + | db.guisubmenu)+ + } +} +div { + db.shortcut.action.attrib = db.keycombo.action.attrib + db.shortcut.role.attribute = attribute role { text } + db.shortcut.attlist = + db.shortcut.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.shortcut.action.attrib + db.shortcut = + + ## A key combination for an action that is also accessible through a menu + element shortcut { + db.shortcut.attlist, + (db.keycap | db.keycombo | db.keysym | db.mousebutton)+ + } +} +div { + db.mousebutton.role.attribute = attribute role { text } + db.mousebutton.attlist = + db.mousebutton.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.mousebutton = + + ## The conventional name of a mouse button + element mousebutton { db.mousebutton.attlist, db._text } +} +div { + db.option.role.attribute = attribute role { text } + db.option.attlist = + db.option.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.option = + + ## An option for a software command + element option { db.option.attlist, db._text } +} +div { + db.optional.role.attribute = attribute role { text } + db.optional.attlist = + db.optional.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.optional = + + ## Optional information + element optional { db.optional.attlist, db._text } +} +div { + db.property.role.attribute = attribute role { text } + db.property.attlist = + db.property.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.property = + + ## A unit of data associated with some part of a computer system + element property { db.property.attlist, db._text } +} +div { + db.parameter.class.enumeration = + + ## A command + "command" + | + ## A function + "function" + | + ## An option + "option" + db.parameter.class.attribute = + + ## Identifies the class of parameter + attribute class { db.parameter.class.enumeration } + db.parameter.role.attribute = attribute role { text } + db.parameter.attlist = + db.parameter.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.parameter.class.attribute? + db.parameter = + + ## A value or a symbolic reference to a value + element parameter { db.parameter.attlist, db._text } +} +db.prompt.inlines = db._text | db.co +div { + db.prompt.role.attribute = attribute role { text } + db.prompt.attlist = + db.prompt.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.prompt = + + ## A character or string indicating the start of an input field in a computer display + element prompt { db.prompt.attlist, db.prompt.inlines* } +} +db.replaceable.inlines = db._text | db.co +div { + db.replaceable.class.enumeration = + + ## A command + "command" + | + ## A function + "function" + | + ## An option + "option" + | + ## A parameter + "parameter" + db.replaceable.class.attribute = + + ## Identifies the nature of the replaceable text + attribute class { db.replaceable.class.enumeration } + db.replaceable.role.attribute = attribute role { text } + db.replaceable.attlist = + db.replaceable.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.replaceable.class.attribute? + db.replaceable = + + ## Content that may or must be replaced by the user + element replaceable { + db.replaceable.attlist, db.replaceable.inlines* + } +} +div { + db.returnvalue.role.attribute = attribute role { text } + db.returnvalue.attlist = + db.returnvalue.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.returnvalue = + + ## The value returned by a function + element returnvalue { db.returnvalue.attlist, db._text } +} +div { + db.tag.role.attribute = attribute role { text } + db.tag.class.enumeration = + + ## An attribute + "attribute" + | + ## An attribute value + "attvalue" + | + ## An element + "element" + | + ## An empty element tag + "emptytag" + | + ## An end tag + "endtag" + | + ## A general entity + "genentity" + | + ## The local name part of a qualified name + "localname" + | + ## A namespace + "namespace" + | + ## A numeric character reference + "numcharref" + | + ## A parameter entity + "paramentity" + | + ## A processing instruction + "pi" + | + ## The prefix part of a qualified name + "prefix" + | + ## An SGML comment + "comment" + | + ## A start tag + "starttag" + | + ## An XML processing instruction + "xmlpi" + db.tag.class.attribute = + + ## Identifies the nature of the tag content + attribute class { db.tag.class.enumeration } + db.tag.namespace.attribute = + + ## Identifies the namespace of the tag content + attribute namespace { xsd:anyURI } + db.tag.attlist = + db.tag.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.tag.class.attribute? + & db.tag.namespace.attribute? + db.tag = + + ## A component of XML (or SGML) markup + element tag { db.tag.attlist, db._text } +} +div { + db.symbol.class.attribute = + + ## Identifies the class of symbol + attribute class { + + ## The value is a limit of some kind + "limit" + } + db.symbol.role.attribute = attribute role { text } + db.symbol.attlist = + db.symbol.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.symbol.class.attribute? + db.symbol = + + ## A name that is replaced by a value before processing + element symbol { db.symbol.attlist, db._text } +} +db.systemitem.inlines = db._text | db.co +div { + db.systemitem.class.enumeration = + + ## A daemon or other system process (syslogd) + "daemon" + | + ## A domain name (example.com) + "domainname" + | + ## An ethernet address (00:05:4E:49:FD:8E) + "etheraddress" + | + ## An event of some sort (SIGHUP) + "event" + | + ## An event handler of some sort (hangup) + "eventhandler" + | + ## A filesystem (ext3) + "filesystem" + | + ## A fully qualified domain name (my.example.com) + "fqdomainname" + | + ## A group name (wheel) + "groupname" + | + ## An IP address (127.0.0.1) + "ipaddress" + | + ## A library (libncurses) + "library" + | + ## A macro + "macro" + | + ## A netmask (255.255.255.192) + "netmask" + | + ## A newsgroup (comp.text.xml) + "newsgroup" + | + ## An operating system name (Hurd) + "osname" + | + ## A process (gnome-cups-icon) + "process" + | + ## A protocol (ftp) + "protocol" + | + ## A resource + "resource" + | + ## A server (mail.example.com) + "server" + | + ## A service (ppp) + "service" + | + ## A system name (hephaistos) + "systemname" + | + ## A user name (ndw) + "username" + db.systemitem.class.attribute = + + ## Identifies the nature of the system item + attribute class { db.systemitem.class.enumeration } + db.systemitem.role.attribute = attribute role { text } + db.systemitem.attlist = + db.systemitem.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.systemitem.class.attribute? + db.systemitem = + + ## A system-related item or term + element systemitem { db.systemitem.attlist, db.systemitem.inlines* } +} +div { + db.uri.type.attribute = + + ## Identifies the type of URI specified + attribute type { text }? + db.uri.role.attribute = attribute role { text } + db.uri.attlist = + db.uri.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.uri.type.attribute + db.uri = + + ## A Uniform Resource Identifier + element uri { db.uri.attlist, db._text } +} +div { + db.token.role.attribute = attribute role { text } + db.token.attlist = + db.token.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.token = + + ## A unit of information + element token { db.token.attlist, db._text } +} +div { + db.type.role.attribute = attribute role { text } + db.type.attlist = + db.type.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.type = + + ## The classification of a value + element type { db.type.attlist, db._text } +} +db.userinput.inlines = + (text + | db.ubiq.inlines + | db.os.inlines + | db.technical.inlines + | db.markup.inlines) + | db.co +div { + db.userinput.role.attribute = attribute role { text } + db.userinput.attlist = + db.userinput.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.userinput = + + ## Data entered by the user + element userinput { db.userinput.attlist, db.userinput.inlines* } +} +div { + db.abbrev.role.attribute = attribute role { text } + db.abbrev.attlist = + db.abbrev.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.abbrev = + + ## An abbreviation, especially one followed by a period + element abbrev { + db.abbrev.attlist, + (db._text | db.superscript | db.subscript | db.trademark)* + } +} +div { + db.acronym.role.attribute = attribute role { text } + db.acronym.attlist = + db.acronym.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.acronym = + + ## An often pronounceable word made from the initial (or selected) letters of a name or phrase + element acronym { + db.acronym.attlist, + (db._text | db.superscript | db.subscript | db.trademark)* + } +} +div { + db.citation.role.attribute = attribute role { text } + db.citation.attlist = + db.citation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.citation = + + ## An inline bibliographic reference to another published work + element citation { db.citation.attlist, db.all.inlines* } +} +div { + db.citerefentry.role.attribute = attribute role { text } + db.citerefentry.attlist = + db.citerefentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.citerefentry = + + ## A citation to a reference page + element citerefentry { + db.citerefentry.attlist, db.refentrytitle, db.manvolnum? + } +} +div { + db.refentrytitle.role.attribute = attribute role { text } + db.refentrytitle.attlist = + db.refentrytitle.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refentrytitle = + + ## The title of a reference page + element refentrytitle { db.refentrytitle.attlist, db.all.inlines* } +} +div { + db.manvolnum.role.attribute = attribute role { text } + db.manvolnum.attlist = + db.manvolnum.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.manvolnum = + + ## A reference volume number + element manvolnum { db.manvolnum.attlist, db._text } +} +div { + db.citetitle.pubwork.enumeration = + + ## An article + "article" + | + ## A bulletin board system + "bbs" + | + ## A book + "book" + | + ## A CD-ROM + "cdrom" + | + ## A chapter (as of a book) + "chapter" + | + ## A DVD + "dvd" + | + ## An email message + "emailmessage" + | + ## A gopher page + "gopher" + | + ## A journal + "journal" + | + ## A manuscript + "manuscript" + | + ## A posting to a newsgroup + "newsposting" + | + ## A part (as of a book) + "part" + | + ## A reference entry + "refentry" + | + ## A section (as of a book or article) + "section" + | + ## A series + "series" + | + ## A set (as of books) + "set" + | + ## A web page + "webpage" + | + ## A wiki page + "wiki" + db.citetitle.pubwork.attribute = + + ## Identifies the nature of the publication being cited + attribute pubwork { db.citetitle.pubwork.enumeration } + db.citetitle.role.attribute = attribute role { text } + db.citetitle.attlist = + db.citetitle.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.citetitle.pubwork.attribute? + db.citetitle = + + ## The title of a cited work + element citetitle { db.citetitle.attlist, db.all.inlines* } +} +div { + db.emphasis.role.attribute = attribute role { text } + db.emphasis.attlist = + db.emphasis.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.emphasis = + + ## Emphasized text + element emphasis { db.emphasis.attlist, db.all.inlines* } +} +div { + db._emphasis = + + ## A limited span of emphasized text + element emphasis { db.emphasis.attlist, (db._text | db._emphasis)* } +} +div { + db.foreignphrase.role.attribute = attribute role { text } + db.foreignphrase.attlist = + db.foreignphrase.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.foreignphrase = + + ## A word or phrase in a language other than the primary language of the document + element foreignphrase { + db.foreignphrase.attlist, (text | db.general.inlines)* + } +} +div { + db.phrase.role.attribute = attribute role { text } + db.phrase.attlist = + db.phrase.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.phrase = + + ## A span of text + element phrase { db.phrase.attlist, db.all.inlines* } +} +div { + db._phrase = + + ## A limited span of text + element phrase { db.phrase.attlist, db._text } +} +div { + db.quote.role.attribute = attribute role { text } + db.quote.attlist = + db.quote.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.quote = + + ## An inline quotation + element quote { db.quote.attlist, db.all.inlines* } +} +div { + db.subscript.role.attribute = attribute role { text } + db.subscript.attlist = + db.subscript.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.subscript = + + ## A subscript (as in H2 + ## O, the molecular formula for water) + element subscript { db.subscript.attlist, db._text } +} +div { + db.superscript.role.attribute = attribute role { text } + db.superscript.attlist = + db.superscript.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.superscript = + + ## A superscript (as in x^2, the mathematical notation for x multiplied by itself) + element superscript { db.superscript.attlist, db._text } +} +div { + db.trademark.class.enumeration = + + ## A copyright + "copyright" + | + ## A registered copyright + "registered" + | + ## A service + "service" + | + ## A trademark + "trade" + db.trademark.class.attribute = + + ## Identifies the class of trade mark + attribute class { db.trademark.class.enumeration } + db.trademark.role.attribute = attribute role { text } + db.trademark.attlist = + db.trademark.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.trademark.class.attribute? + db.trademark = + + ## A trademark + element trademark { db.trademark.attlist, db._text } +} +div { + db.wordasword.role.attribute = attribute role { text } + db.wordasword.attlist = + db.wordasword.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.wordasword = + + ## A word meant specifically as a word and not representing anything else + element wordasword { db.wordasword.attlist, db._text } +} +div { + db.footnoteref.role.attribute = attribute role { text } + db.footnoteref.label.attribute = db.label.attribute + db.footnoteref.attlist = + db.footnoteref.role.attribute? + & db.common.attributes + & db.linkend.attribute + & db.footnoteref.label.attribute? + db.footnoteref = + + ## A cross reference to a footnote (a footnote mark) + [ + s:pattern [ + name = "Footnote reference type constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:footnoteref" + "\x{a}" ~ + " " + s:assert [ + test = + "local-name(//*[@xml:id=current()/@linkend]) = 'footnote' and namespace-uri(//*[@xml:id=current()/@linkend]) = 'http://docbook.org/ns/docbook'" + "@linkend on footnoteref must point to a footnote." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element footnoteref { db.footnoteref.attlist, empty } +} +div { + db.xref.role.attribute = attribute role { text } + db.xref.xrefstyle.attribute = db.xrefstyle.attribute + db.xref.endterm.attribute = db.endterm.attribute + db.xref.attlist = + db.xref.role.attribute? + & db.common.attributes + & db.common.req.linking.attributes + & db.xref.xrefstyle.attribute? + & db.xref.endterm.attribute? + db.xref = + + ## A cross reference to another part of the document + element xref { db.xref.attlist, empty } +} +div { + db.link.role.attribute = attribute role { text } + db.link.xrefstyle.attribute = db.xrefstyle.attribute + db.link.endterm.attribute = db.endterm.attribute + db.link.attlist = + db.link.role.attribute? + & db.common.attributes + & db.common.req.linking.attributes + & db.link.xrefstyle.attribute? + & db.link.endterm.attribute? + db.link = + + ## A hypertext link + element link { db.link.attlist, db.all.inlines* } +} +div { + db.olink.role.attribute = attribute role { text } + db.olink.xrefstyle.attribute = db.xrefstyle.attribute + db.olink.localinfo.attribute = + + ## Holds additional information that may be used by the applicatoin when resolving the link + attribute localinfo { text } + db.olink.targetdoc.attribute = + + ## Specifies the URI of the document in which the link target appears + attribute targetdoc { xsd:anyURI } + db.olink.targetptr.attribute = + + ## Specifies the location of the link target in the document + attribute targetptr { text } + db.olink.type.attribute = + + ## Identifies application-specific customization of the link behavior + attribute type { text } + db.olink.attlist = + db.common.attributes + & db.olink.targetdoc.attribute? + & db.olink.role.attribute? + & db.olink.xrefstyle.attribute? + & db.olink.localinfo.attribute? + & db.olink.targetptr.attribute? + & db.olink.type.attribute? + db.olink = + + ## A link that addresses its target indirectly + element olink { db.olink.attlist, db.all.inlines* } +} +div { + db.anchor.role.attribute = attribute role { text } + db.anchor.attlist = + db.anchor.role.attribute? & db.common.idreq.attributes + db.anchor = + + ## A spot in the document + element anchor { db.anchor.attlist, empty } +} +div { + db.alt.role.attribute = attribute role { text } + db.alt.attlist = db.alt.role.attribute? & db.common.attributes + db.alt = + + ## A text-only annotation, often used for accessibility + element alt { db.alt.attlist, (text | db.inlinemediaobject)* } +} +db.annotations.attribute = + + ## Identifies one or more annotations that apply to this element + attribute annotations { text } +div { + db.annotation.role.attribute = attribute role { text } + db.annotation.annotates.attribute = + + ## Identifies one ore more elements to which this annotation applies + attribute annotates { text } + db.annotation.attlist = + db.annotation.role.attribute? + & db.annotation.annotates.attribute? + & db.common.attributes + db.annotation.info = db._info.title.only + db.annotation = + + ## An annotation + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:annotation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:annotation)" + "annotation must not occur in the descendants of annotation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element annotation { + db.annotation.attlist, db.annotation.info, db.all.blocks+ + } +} +db.xlink.from.attribute = + + ## Specifies the XLink traversal-from + attribute xlink:from { xsd:NMTOKEN }? +db.xlink.label.attribute = + + ## Specifies the XLink label + attribute xlink:label { xsd:NMTOKEN }? +db.xlink.to.attribute = + + ## Specifies the XLink traversal-to + attribute xlink:to { xsd:NMTOKEN }? +div { + db.extendedlink.role.attribute = attribute role { text } + db.extendedlink.attlist = + db.extendedlink.role.attribute? + & db.common.attributes + & + ## Identifies the XLink link type + [ a:defaultValue = "extended" ] + attribute xlink:type { + + ## An XLink extended link + "extended" + }? + & db.xlink.role.attribute? + & db.xlink.title.attribute? + db.extendedlink = + + ## An XLink extended link + element extendedlink { + db.extendedlink.attlist, (db.locator | db.arc)+ + } +} +div { + db.locator.role.attribute = attribute role { text } + db.locator.attlist = + db.locator.role.attribute? + & db.common.attributes + & + ## Identifies the XLink link type + [ a:defaultValue = "locator" ] + attribute xlink:type { + + ## An XLink locator link + "locator" + }? + & db.xlink.href.attribute + & db.xlink.role.attribute? + & db.xlink.title.attribute? + & db.xlink.label.attribute? + db.locator = + + ## An XLink locator in an extendedlink + element locator { db.locator.attlist, empty } +} +div { + db.arc.role.attribute = attribute role { text } + db.arc.attlist = + db.arc.role.attribute? + & db.common.attributes + & + ## Identifies the XLink link type + [ a:defaultValue = "arc" ] + attribute xlink:type { + + ## An XLink arc link + "arc" + }? + & db.xlink.arcrole.attribute? + & db.xlink.title.attribute? + & db.xlink.show.attribute? + & db.xlink.actuate.attribute? + & db.xlink.from.attribute? + & db.xlink.to.attribute? + db.arc = + + ## An XLink arc in an extendedlink + element arc { db.arc.attlist, empty } +} +db.status.attribute = + + ## Identifies the editorial or publication status of the element on which it occurs + attribute status { text } +db.toplevel.sections = + ((db.section+, db.simplesect*) | db.simplesect+) + | (db.sect1+, db.simplesect*) + | db.refentry+ +db.toplevel.blocks.or.sections = + (db.all.blocks+, db.toplevel.sections?) | db.toplevel.sections +db.recursive.sections = + ((db.section+, db.simplesect*) | db.simplesect+) + | db.refentry+ +db.recursive.blocks.or.sections = + (db.all.blocks+, db.recursive.sections?) | db.recursive.sections +db.divisions = db.part | db.reference +db.components = + db.dedication + | db.acknowledgements + | db.preface + | db.chapter + | db.appendix + | db.article + | db.colophon +db.navigation.components = + notAllowed | db.glossary | db.bibliography | db.index | db.toc +db.component.contentmodel = + db.navigation.components*, + db.toplevel.blocks.or.sections, + db.navigation.components* +db.setindex.components = notAllowed | db.setindex +db.toc.components = notAllowed | db.toc +db.set.components = db.set | db.book +div { + db.set.status.attribute = db.status.attribute + db.set.role.attribute = attribute role { text } + db.set.attlist = + db.set.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.set.status.attribute? + db.set.info = db._info.title.req + db.set = + + ## A collection of books + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:set" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element set { + db.set.attlist, + db.set.info, + db.toc.components?, + db.set.components+, + db.setindex.components? + } +} +div { + db.book.status.attribute = db.status.attribute + db.book.role.attribute = attribute role { text } + db.book.attlist = + db.book.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.book.status.attribute? + db.book.info = db._info.title.req + db.book = + + ## A book + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:book" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element book { + db.book.attlist, + db.book.info, + (db.navigation.components | db.components | db.divisions)+ + } +} +div { + db.dedication.status.attribute = db.status.attribute + db.dedication.role.attribute = attribute role { text } + db.dedication.attlist = + db.dedication.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.dedication.status.attribute? + db.dedication.info = db._info + db.dedication = + + ## The dedication of a book or other component + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:dedication" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element dedication { + db.dedication.attlist, db.dedication.info, db.all.blocks+ + } +} +div { + db.acknowledgements.status.attribute = db.status.attribute + db.acknowledgements.role.attribute = attribute role { text } + db.acknowledgements.attlist = + db.acknowledgements.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.acknowledgements.status.attribute? + db.acknowledgements.info = db._info + db.acknowledgements = + + ## Acknowledgements of a book or other component + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:acknowledgements" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element acknowledgements { + db.acknowledgements.attlist, + db.acknowledgements.info, + db.all.blocks+ + } +} +div { + db.colophon.status.attribute = db.status.attribute + db.colophon.role.attribute = attribute role { text } + db.colophon.attlist = + db.colophon.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.colophon.status.attribute? + db.colophon.info = db._info + db.colophon = + + ## Text at the back of a book describing facts about its production + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:colophon" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element colophon { + db.colophon.attlist, db.colophon.info, db.all.blocks+ + } +} +div { + db.appendix.status.attribute = db.status.attribute + db.appendix.role.attribute = attribute role { text } + db.appendix.attlist = + db.appendix.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.appendix.status.attribute? + db.appendix.info = db._info.title.req + db.appendix = + + ## An appendix in a Book or Article + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:appendix" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element appendix { + db.appendix.attlist, db.appendix.info, db.component.contentmodel + } +} +div { + db.chapter.status.attribute = db.status.attribute + db.chapter.role.attribute = attribute role { text } + db.chapter.attlist = + db.chapter.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.chapter.status.attribute? + db.chapter.info = db._info.title.req + db.chapter = + + ## A chapter, as of a book + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:chapter" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element chapter { + db.chapter.attlist, db.chapter.info, db.component.contentmodel + } +} +db.part.components = + (db.navigation.components | db.components) + | (db.refentry | db.reference) +div { + db.part.status.attribute = db.status.attribute + db.part.role.attribute = attribute role { text } + db.part.attlist = + db.part.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.part.status.attribute? + db.part.info = db._info.title.req + db.part = + + ## A division in a book + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:part" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element part { + db.part.attlist, db.part.info, db.partintro?, db.part.components+ + } +} +div { + db.preface.status.attribute = db.status.attribute + db.preface.role.attribute = attribute role { text } + db.preface.attlist = + db.preface.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.preface.status.attribute? + db.preface.info = db._info.title.req + db.preface = + + ## Introductory matter preceding the first chapter of a book + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:preface" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element preface { + db.preface.attlist, db.preface.info, db.component.contentmodel + } +} +div { + db.partintro.status.attribute = db.status.attribute + db.partintro.role.attribute = attribute role { text } + db.partintro.attlist = + db.partintro.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.partintro.status.attribute? + db.partintro.info = db._info + db.partintro = + + ## An introduction to the contents of a part + element partintro { + db.partintro.attlist, + db.partintro.info, + db.toplevel.blocks.or.sections + } +} +div { + db.section.status.attribute = db.status.attribute + db.section.role.attribute = attribute role { text } + db.section.attlist = + db.section.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.section.status.attribute? + db.section.info = db._info.title.req + db.section = + + ## A recursive section + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:section" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element section { + db.section.attlist, + db.section.info, + db.recursive.blocks.or.sections, + db.navigation.components* + } +} +div { + db.simplesect.status.attribute = db.status.attribute + db.simplesect.role.attribute = attribute role { text } + db.simplesect.attlist = + db.simplesect.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.simplesect.status.attribute? + db.simplesect.info = db._info.title.req + db.simplesect = + + ## A section of a document with no subdivisions + element simplesect { + db.simplesect.attlist, db.simplesect.info, db.all.blocks+ + } +} +db.article.components = db.toplevel.sections +div { + db.article.status.attribute = db.status.attribute + db.article.class.enumeration = + + ## A collection of frequently asked questions. + "faq" + | + ## An article in a journal or other periodical. + "journalarticle" + | + ## A description of a product. + "productsheet" + | + ## A specification. + "specification" + | + ## A technical report. + "techreport" + | + ## A white paper. + "whitepaper" + db.article.class.attribute = + + ## Identifies the nature of the article + attribute class { db.article.class.enumeration } + db.article.role.attribute = attribute role { text } + db.article.attlist = + db.article.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.article.status.attribute? + & db.article.class.attribute? + db.article.info = db._info.title.req + db.article = + + ## An article + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:article" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element article { + db.article.attlist, + db.article.info, + (db.navigation.components + | db.appendix + | db.acknowledgements + | db.colophon)*, + ((db.all.blocks+, db.article.components?) + | db.article.components), + (db.navigation.components + | db.appendix + | db.acknowledgements + | db.colophon)* + } +} +db.sect1.sections = (db.sect2+, db.simplesect*) | db.simplesect+ +div { + db.sect1.status.attribute = db.status.attribute + db.sect1.role.attribute = attribute role { text } + db.sect1.attlist = + db.sect1.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.sect1.status.attribute? + db.sect1.info = db._info.title.req + db.sect1 = + + ## A top-level section of document + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:sect1" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element sect1 { + db.sect1.attlist, + db.sect1.info, + ((db.all.blocks+, db.sect1.sections?) | db.sect1.sections), + db.navigation.components* + } +} +db.sect2.sections = (db.sect3+, db.simplesect*) | db.simplesect+ +div { + db.sect2.status.attribute = db.status.attribute + db.sect2.role.attribute = attribute role { text } + db.sect2.attlist = + db.sect2.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.sect2.status.attribute? + db.sect2.info = db._info.title.req + db.sect2 = + + ## A subsection within a Sect1 + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:sect2" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element sect2 { + db.sect2.attlist, + db.sect2.info, + ((db.all.blocks+, db.sect2.sections?) | db.sect2.sections), + db.navigation.components* + } +} +db.sect3.sections = (db.sect4+, db.simplesect*) | db.simplesect+ +div { + db.sect3.status.attribute = db.status.attribute + db.sect3.role.attribute = attribute role { text } + db.sect3.attlist = + db.sect3.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.sect3.status.attribute? + db.sect3.info = db._info.title.req + db.sect3 = + + ## A subsection within a Sect2 + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:sect3" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element sect3 { + db.sect3.attlist, + db.sect3.info, + ((db.all.blocks+, db.sect3.sections?) | db.sect3.sections), + db.navigation.components* + } +} +db.sect4.sections = (db.sect5+, db.simplesect*) | db.simplesect+ +div { + db.sect4.status.attribute = db.status.attribute + db.sect4.role.attribute = attribute role { text } + db.sect4.attlist = + db.sect4.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.sect4.status.attribute? + db.sect4.info = db._info.title.req + db.sect4 = + + ## A subsection within a Sect3 + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:sect4" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element sect4 { + db.sect4.attlist, + db.sect4.info, + ((db.all.blocks+, db.sect4.sections?) | db.sect4.sections), + db.navigation.components* + } +} +db.sect5.sections = db.simplesect+ +div { + db.sect5.status.attribute = db.status.attribute + db.sect5.role.attribute = attribute role { text } + db.sect5.attlist = + db.sect5.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.sect5.status.attribute? + db.sect5.info = db._info.title.req + db.sect5 = + + ## A subsection within a Sect4 + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:sect5" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element sect5 { + db.sect5.attlist, + db.sect5.info, + ((db.all.blocks+, db.sect5.sections?) | db.sect5.sections), + db.navigation.components* + } +} +db.toplevel.refsection = db.refsection+ | db.refsect1+ +db.secondlevel.refsection = db.refsection+ | db.refsect2+ +db.reference.components = db.refentry +div { + db.reference.role.attribute = attribute role { text } + db.reference.attlist = + db.reference.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.status.attribute? + & db.label.attribute? + db.reference.info = db._info.title.req + db.reference = + + ## A collection of reference entries + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:reference" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element reference { + db.reference.attlist, + db.reference.info, + db.partintro?, + db.reference.components+ + } +} +div { + db.refentry.role.attribute = attribute role { text } + db.refentry.attlist = + db.refentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.status.attribute? + & db.label.attribute? + db.refentry.info = db._info.title.forbidden + db.refentry = + + ## A reference page (originally a UNIX man-style reference page) + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:refentry" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element refentry { + db.refentry.attlist, + db.indexterm*, + db.refentry.info, + db.refmeta?, + db.refnamediv+, + db.refsynopsisdiv?, + db.toplevel.refsection + } +} +div { + db.refmeta.role.attribute = attribute role { text } + db.refmeta.attlist = + db.refmeta.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refmeta = + + ## Meta-information for a reference entry + element refmeta { + db.refmeta.attlist, + db.indexterm*, + db.refentrytitle, + db.manvolnum?, + db.refmiscinfo*, + db.indexterm* + } +} +db.refmiscinfo.class.enumeration = + + ## The name of the software product or component to which this topic applies + "source" + | + ## The version of the software product or component to which this topic applies + "version" + | + ## The section title of the reference page (e.g., User Commands) + "manual" + | + ## The section title of the reference page (believed synonymous with "manual" but in wide use) + "sectdesc" + | + ## The name of the software product or component to which this topic applies (e.g., SunOS x.y; believed synonymous with "source" but in wide use) + "software" +db.refmiscinfo.class-enum.attribute = + + ## Identifies the kind of miscellaneous information + attribute class { db.refmiscinfo.class.enumeration }? +db.refmiscinfo.class-other.attribute = + + ## Identifies the nature of non-standard miscellaneous information + attribute otherclass { text } +db.refmiscinfo.class-other.attributes = + + ## Identifies the kind of miscellaneious information + attribute class { + + ## Indicates that the information is some 'other' kind. + "other" + } + & db.refmiscinfo.class-other.attribute +db.refmiscinfo.class.attribute = + db.refmiscinfo.class-enum.attribute + | db.refmiscinfo.class-other.attributes +div { + db.refmiscinfo.role.attribute = attribute role { text } + db.refmiscinfo.attlist = + db.refmiscinfo.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.refmiscinfo.class.attribute? + db.refmiscinfo = + + ## Meta-information for a reference entry other than the title and volume number + element refmiscinfo { db.refmiscinfo.attlist, db._text } +} +div { + db.refnamediv.role.attribute = attribute role { text } + db.refnamediv.attlist = + db.refnamediv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refnamediv = + + ## The name, purpose, and classification of a reference page + element refnamediv { + db.refnamediv.attlist, + db.refdescriptor?, + db.refname+, + db.refpurpose, + db.refclass* + } +} +div { + db.refdescriptor.role.attribute = attribute role { text } + db.refdescriptor.attlist = + db.refdescriptor.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refdescriptor = + + ## A description of the topic of a reference page + element refdescriptor { db.refdescriptor.attlist, db.all.inlines* } +} +div { + db.refname.role.attribute = attribute role { text } + db.refname.attlist = + db.refname.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refname = + + ## The name of (one of) the subject(s) of a reference page + element refname { db.refname.attlist, db.all.inlines* } +} +div { + db.refpurpose.role.attribute = attribute role { text } + db.refpurpose.attlist = + db.refpurpose.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refpurpose = + + ## A short (one sentence) synopsis of the topic of a reference page + element refpurpose { db.refpurpose.attlist, db.all.inlines* } +} +div { + db.refclass.role.attribute = attribute role { text } + db.refclass.attlist = + db.refclass.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refclass = + + ## The scope or other indication of applicability of a reference entry + element refclass { db.refclass.attlist, (text | db.application)* } +} +div { + db.refsynopsisdiv.role.attribute = attribute role { text } + db.refsynopsisdiv.attlist = + db.refsynopsisdiv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.refsynopsisdiv.info = db._info + db.refsynopsisdiv = + + ## A syntactic synopsis of the subject of the reference page + element refsynopsisdiv { + db.refsynopsisdiv.attlist, + db.refsynopsisdiv.info, + ((db.all.blocks+, db.secondlevel.refsection?) + | db.secondlevel.refsection) + } +} +div { + db.refsection.role.attribute = attribute role { text } + db.refsection.attlist = + db.refsection.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.status.attribute? + & db.label.attribute? + db.refsection.info = db._info.title.req + db.refsection = + + ## A recursive section in a refentry + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:refsection" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element refsection { + db.refsection.attlist, + db.refsection.info, + ((db.all.blocks+, db.refsection*) | db.refsection+) + } +} +db.refsect1.sections = db.refsect2+ +div { + db.refsect1.status.attribute = db.status.attribute + db.refsect1.role.attribute = attribute role { text } + db.refsect1.attlist = + db.refsect1.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.refsect1.status.attribute? + db.refsect1.info = db._info.title.req + db.refsect1 = + + ## A major subsection of a reference entry + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:refsect1" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element refsect1 { + db.refsect1.attlist, + db.refsect1.info, + ((db.all.blocks+, db.refsect1.sections?) | db.refsect1.sections) + } +} +db.refsect2.sections = db.refsect3+ +div { + db.refsect2.status.attribute = db.status.attribute + db.refsect2.role.attribute = attribute role { text } + db.refsect2.attlist = + db.refsect2.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.refsect2.status.attribute? + db.refsect2.info = db._info.title.req + db.refsect2 = + + ## A subsection of a refsect1 + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:refsect2" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element refsect2 { + db.refsect2.attlist, + db.refsect2.info, + ((db.all.blocks+, db.refsect2.sections?) | db.refsect2.sections) + } +} +div { + db.refsect3.status.attribute = db.status.attribute + db.refsect3.role.attribute = attribute role { text } + db.refsect3.attlist = + db.refsect3.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.refsect3.status.attribute? + db.refsect3.info = db._info.title.req + db.refsect3 = + + ## A subsection of a refsect2 + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:refsect3" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element refsect3 { + db.refsect3.attlist, db.refsect3.info, db.all.blocks+ + } +} +db.glossary.inlines = db.firstterm | db.glossterm +db.baseform.attribute = + + ## Specifies the base form of the term, the one that appears in the glossary. This allows adjectival, plural, and other variations of the term to appear in the element. The element content is the default base form. + attribute baseform { text }? +div { + db.glosslist.role.attribute = attribute role { text } + db.glosslist.attlist = + db.glosslist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.glosslist.info = db._info.title.only + db.glosslist = + + ## A wrapper for a list of glossary entries + element glosslist { + db.glosslist.attlist, + db.glosslist.info?, + db.all.blocks*, + db.glossentry+ + } +} +div { + db.glossentry.role.attribute = attribute role { text } + db.glossentry.sortas.attribute = + + ## Specifies the string by which the element's content is to be sorted; if unspecified, the content is used + attribute sortas { text } + db.glossentry.attlist = + db.glossentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.glossentry.sortas.attribute? + db.glossentry = + + ## An entry in a Glossary or GlossList + element glossentry { + db.glossentry.attlist, + db.glossterm, + db.acronym?, + db.abbrev?, + db.indexterm*, + (db.glosssee | db.glossdef+) + } +} +div { + db.glossdef.role.attribute = attribute role { text } + db.glossdef.subject.attribute = + + ## Specifies a list of keywords for the definition + attribute subject { text } + db.glossdef.attlist = + db.glossdef.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.glossdef.subject.attribute? + db.glossdef = + + ## A definition in a GlossEntry + element glossdef { + db.glossdef.attlist, db.all.blocks+, db.glossseealso* + } +} +div { + db.glosssee.role.attribute = attribute role { text } + db.glosssee.otherterm.attribute = + + ## Identifies the other term + attribute otherterm { xsd:IDREF } + db.glosssee.attlist = + db.glosssee.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.glosssee.otherterm.attribute? + db.glosssee = + + ## A cross-reference from one glossentry + ## to another + [ + s:pattern [ + name = "Glosssary 'see' type constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:glosssee[@otherterm]" + "\x{a}" ~ + " " + s:assert [ + test = + "local-name(//*[@xml:id=current()/@otherterm]) = 'glossentry' and namespace-uri(//*[@xml:id=current()/@otherterm]) = 'http://docbook.org/ns/docbook'" + "@otherterm on glosssee must point to a glossentry." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element glosssee { db.glosssee.attlist, db.all.inlines* } +} +div { + db.glossseealso.role.attribute = attribute role { text } + db.glossseealso.otherterm.attribute = + + ## Identifies the other term + attribute otherterm { xsd:IDREF } + db.glossseealso.attlist = + db.glossseealso.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.glossseealso.otherterm.attribute? + db.glossseealso = + + ## A cross-reference from one GlossEntry to another + [ + s:pattern [ + name = "Glossary 'seealso' type constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:glossseealso[@otherterm]" + "\x{a}" ~ + " " + s:assert [ + test = + "local-name(//*[@xml:id=current()/@otherterm]) = 'glossentry' and namespace-uri(//*[@xml:id=current()/@otherterm]) = 'http://docbook.org/ns/docbook'" + "@otherterm on glossseealso must point to a glossentry." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element glossseealso { db.glossseealso.attlist, db.all.inlines* } +} +div { + db.firstterm.role.attribute = attribute role { text } + db.firstterm.attlist = + db.firstterm.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.baseform.attribute + db.firstterm = + + ## The first occurrence of a term + [ + s:pattern [ + name = "Glossary 'firstterm' type constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:firstterm[@linkend]" + "\x{a}" ~ + " " + s:assert [ + test = + "local-name(//*[@xml:id=current()/@linkend]) = 'glossentry' and namespace-uri(//*[@xml:id=current()/@linkend]) = 'http://docbook.org/ns/docbook'" + "@linkend on firstterm must point to a glossentry." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element firstterm { db.firstterm.attlist, db.all.inlines* } +} +div { + db.glossterm.role.attribute = attribute role { text } + db.glossterm.attlist = + db.glossterm.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.baseform.attribute + db.glossterm = + + ## A glossary term + [ + s:pattern [ + name = "Glossary 'glossterm' type constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:glossterm[@linkend]" + "\x{a}" ~ + " " + s:assert [ + test = + "local-name(//*[@xml:id=current()/@linkend]) = 'glossentry' and namespace-uri(//*[@xml:id=current()/@linkend]) = 'http://docbook.org/ns/docbook'" + "@linkend on glossterm must point to a glossentry." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element glossterm { db.glossterm.attlist, db.all.inlines* } +} +div { + db.glossary.status.attribute = db.status.attribute + db.glossary.role.attribute = attribute role { text } + db.glossary.attlist = + db.glossary.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.glossary.status.attribute? + db.glossary.info = db._info + db.glossary = + + ## A glossary + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:glossary" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element glossary { + db.glossary.attlist, + db.glossary.info, + db.all.blocks*, + (db.glossdiv* | db.glossentry*), + db.bibliography? + } +} +div { + db.glossdiv.status.attribute = db.status.attribute + db.glossdiv.role.attribute = attribute role { text } + db.glossdiv.attlist = + db.glossdiv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.glossdiv.status.attribute? + db.glossdiv.info = db._info.title.req + db.glossdiv = + + ## A division in a Glossary + element glossdiv { + db.glossdiv.attlist, + db.glossdiv.info, + db.all.blocks*, + db.glossentry+ + } +} +div { + db.termdef.role.attribute = attribute role { text } + db.termdef.attlist = + db.termdef.role.attribute? + & db.glossentry.sortas.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.baseform.attribute + db.termdef = + + ## An inline definition of a term + [ + s:pattern [ + name = "Glossary term definition constraint" + "\x{a}" ~ + " " + s:rule [ + context = "db:termdef" + "\x{a}" ~ + " " + s:assert [ + test = "count(db:firstterm) = 1" + "A termdef must contain exactly one firstterm" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element termdef { db.termdef.attlist, db.all.inlines* } +} +db.relation.attribute = + + ## Identifies the relationship between the bibliographic elemnts + attribute relation { text } +div { + db.biblioentry.role.attribute = attribute role { text } + db.biblioentry.attlist = + db.biblioentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.biblioentry = + + ## An entry in a Bibliography + element biblioentry { + db.biblioentry.attlist, db.bibliographic.elements+ + } +} +div { + db.bibliomixed.role.attribute = attribute role { text } + db.bibliomixed.attlist = + db.bibliomixed.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.bibliomixed = + + ## An entry in a Bibliography + element bibliomixed { + db.bibliomixed.attlist, (text | db.bibliographic.elements)* + } +} +div { + db.biblioset.relation.attribute = db.relation.attribute + db.biblioset.role.attribute = attribute role { text } + db.biblioset.attlist = + db.biblioset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.biblioset.relation.attribute? + db.biblioset = + + ## A raw container for related bibliographic information + element biblioset { + db.biblioset.attlist, db.bibliographic.elements+ + } +} +div { + db.bibliomset.relation.attribute = db.relation.attribute + db.bibliomset.role.attribute = attribute role { text } + db.bibliomset.attlist = + db.bibliomset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.bibliomset.relation.attribute? + db.bibliomset = + + ## A cooked container for related bibliographic information + element bibliomset { + db.bibliomset.attlist, (db._text | db.bibliographic.elements)* + } +} +div { + db.bibliomisc.role.attribute = attribute role { text } + db.bibliomisc.attlist = + db.bibliomisc.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.bibliomisc = + + ## Untyped bibliographic information + element bibliomisc { db.bibliomisc.attlist, db._text } +} +div { + db.bibliography.status.attrib = db.status.attribute + db.bibliography.role.attribute = attribute role { text } + db.bibliography.attlist = + db.bibliography.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.bibliography.status.attrib? + db.bibliography.info = db._info + db.bibliography = + + ## A bibliography + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:bibliography" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element bibliography { + db.bibliography.attlist, + db.bibliography.info, + db.all.blocks*, + (db.bibliodiv+ | (db.biblioentry | db.bibliomixed)+) + } +} +div { + db.bibliodiv.status.attrib = db.status.attribute + db.bibliodiv.role.attribute = attribute role { text } + db.bibliodiv.attlist = + db.bibliodiv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.bibliodiv.status.attrib? + db.bibliodiv.info = db._info.title.req + db.bibliodiv = + + ## A section of a Bibliography + element bibliodiv { + db.bibliodiv.attlist, + db.bibliodiv.info, + db.all.blocks*, + (db.biblioentry | db.bibliomixed)+ + } +} +div { + db.bibliolist.role.attribute = attribute role { text } + db.bibliolist.attlist = + db.bibliolist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.bibliolist.info = db._info.title.only + db.bibliolist = + + ## A wrapper for a list of bibliography entries + element bibliolist { + db.bibliolist.attlist, + db.bibliolist.info?, + db.all.blocks*, + (db.biblioentry | db.bibliomixed)+ + } +} +div { + db.biblioref.role.attribute = attribute role { text } + db.biblioref.xrefstyle.attribute = db.xrefstyle.attribute + db.biblioref.endterm.attribute = db.endterm.attribute + db.biblioref.units.attribute = + + ## The units (for example, pages) used to identify the beginning and ending of a reference. + attribute units { xsd:token } + db.biblioref.begin.attribute = + + ## Identifies the beginning of a reference; the location within the work that is being referenced. + attribute begin { xsd:token } + db.biblioref.end.attribute = + + ## Identifies the end of a reference. + attribute end { xsd:token } + db.biblioref.attlist = + db.biblioref.role.attribute? + & db.common.attributes + & db.common.req.linking.attributes + & db.biblioref.xrefstyle.attribute? + & db.biblioref.endterm.attribute? + & db.biblioref.units.attribute? + & db.biblioref.begin.attribute? + & db.biblioref.end.attribute? + db.biblioref = + + ## A cross-reference to a bibliographic entry + element biblioref { db.biblioref.attlist, empty } +} +db.significance.enumeration = + + ## Normal + "normal" + | + ## Preferred + "preferred" +db.significance.attribute = + + ## Specifies the significance of the term + attribute significance { db.significance.enumeration } +db.zone.attribute = + + ## Specifies the IDs of the elements to which this term applies + attribute zone { xsd:IDREFS } +db.indexterm.pagenum.attribute = + + ## Indicates the page on which this index term occurs in some version of the printed document + attribute pagenum { text } +db.scope.enumeration = + + ## All indexes + "all" + | + ## The global index (as for a combined index of a set of box) + "global" + | + ## The local index (the index for this document only) + "local" +db.scope.attribute = + + ## Specifies the scope of the index term + attribute scope { db.scope.enumeration } +db.sortas.attribute = + + ## Specifies the string by which the term is to be sorted; if unspecified, the term content is used + attribute sortas { text } +db.index.type.attribute = + + ## Specifies the target index for this term + attribute type { text } +div { + db.itermset.role.attribute = attribute role { text } + db.itermset.attlist = + db.itermset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.itermset = + + ## A set of index terms in the meta-information of a document + element itermset { db.itermset.attlist, db.indexterm.singular+ } +} +db.indexterm.contentmodel = + db.primary?, + ((db.secondary, + ((db.tertiary, (db.see | db.seealso+)?) + | db.see + | db.seealso+)?) + | db.see + | db.seealso+)? +div { + db.indexterm.singular.role.attribute = attribute role { text } + db.indexterm.singular.class.attribute = + + ## Identifies the class of index term + attribute class { + + ## A singular index term + "singular" + } + db.indexterm.singular.attlist = + db.indexterm.singular.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.significance.attribute? + & db.zone.attribute? + & db.indexterm.pagenum.attribute? + & db.scope.attribute? + & db.index.type.attribute? + & db.indexterm.singular.class.attribute? + db.indexterm.singular = + + ## A wrapper for an indexed term + element indexterm { + db.indexterm.singular.attlist, db.indexterm.contentmodel + } +} +div { + db.indexterm.startofrange.role.attribute = attribute role { text } + db.indexterm.startofrange.class.attribute = + + ## Identifies the class of index term + attribute class { + + ## The start of a range + "startofrange" + } + db.indexterm.startofrange.attlist = + db.indexterm.startofrange.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.significance.attribute? + & db.zone.attribute? + & db.indexterm.pagenum.attribute? + & db.scope.attribute? + & db.index.type.attribute? + & db.indexterm.startofrange.class.attribute + db.indexterm.startofrange = + + ## A wrapper for an indexed term that covers a range + element indexterm { + db.indexterm.startofrange.attlist, db.indexterm.contentmodel + } +} +div { + db.indexterm.endofrange.role.attribute = attribute role { text } + db.indexterm.endofrange.class.attribute = + + ## Identifies the class of index term + attribute class { + + ## The end of a range + "endofrange" + } + db.indexterm.endofrange.startref.attribute = + + ## Points to the start of the range + attribute startref { xsd:IDREF } + db.indexterm.endofrange.attlist = + db.indexterm.endofrange.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.indexterm.endofrange.class.attribute + & db.indexterm.endofrange.startref.attribute + db.indexterm.endofrange = + + ## Identifies the end of a range associated with an indexed term + element indexterm { db.indexterm.endofrange.attlist, empty } +} +div { + db.indexterm = + db.indexterm.singular + | db.indexterm.startofrange + | db.indexterm.endofrange +} +div { + db.primary.role.attribute = attribute role { text } + db.primary.attlist = + db.primary.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.sortas.attribute? + db.primary = + + ## The primary word or phrase under which an index term should be sorted + element primary { db.primary.attlist, db.all.inlines* } +} +div { + db.secondary.role.attribute = attribute role { text } + db.secondary.attlist = + db.secondary.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.sortas.attribute? + db.secondary = + + ## A secondary word or phrase in an index term + element secondary { db.secondary.attlist, db.all.inlines* } +} +div { + db.tertiary.role.attribute = attribute role { text } + db.tertiary.attlist = + db.tertiary.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.sortas.attribute? + db.tertiary = + + ## A tertiary word or phrase in an index term + element tertiary { db.tertiary.attlist, db.all.inlines* } +} +div { + db.see.role.attribute = attribute role { text } + db.see.attlist = + db.see.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.see = + + ## Part of an index term directing the reader instead to another entry in the index + element see { db.see.attlist, db.all.inlines* } +} +div { + db.seealso.role.attribute = attribute role { text } + db.seealso.attlist = + db.seealso.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.seealso = + + ## Part of an index term directing the reader also to another entry in the index + element seealso { db.seealso.attlist, db.all.inlines* } +} +div { + db.index.status.attribute = db.status.attribute + db.index.role.attribute = attribute role { text } + db.index.attlist = + db.index.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.index.status.attribute? + & db.index.type.attribute? + db.index.info = db._info + # + # Yes, db.indexdiv* and db.indexentry*; that way an is valid. + # Authors can use an empty index to indicate where a generated index should + # appear. + db.index = + + ## An index to a book or part of a book + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:index" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element index { + db.index.attlist, + db.index.info, + db.all.blocks*, + (db.indexdiv* | db.indexentry* | db.segmentedlist) + } +} +div { + db.setindex.status.attribute = db.status.attribute + db.setindex.role.attribute = attribute role { text } + db.setindex.attlist = + db.setindex.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.setindex.status.attribute? + & db.index.type.attribute? + db.setindex.info = db._info + db.setindex = + + ## An index to a set of books + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:setindex" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element setindex { + db.setindex.attlist, + db.setindex.info, + db.all.blocks*, + (db.indexdiv* | db.indexentry*) + } +} +div { + db.indexdiv.status.attribute = db.status.attribute + db.indexdiv.role.attribute = attribute role { text } + db.indexdiv.attlist = + db.indexdiv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.label.attribute? + & db.indexdiv.status.attribute? + db.indexdiv.info = db._info.title.req + db.indexdiv = + + ## A division in an index + element indexdiv { + db.indexdiv.attlist, + db.indexdiv.info, + db.all.blocks*, + (db.indexentry+ | db.segmentedlist) + } +} +div { + db.indexentry.role.attribute = attribute role { text } + db.indexentry.attlist = + db.indexentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.indexentry = + + ## An entry in an index + element indexentry { + db.indexentry.attlist, + db.primaryie, + (db.seeie | db.seealsoie)*, + (db.secondaryie, (db.seeie | db.seealsoie | db.tertiaryie)*)* + } +} +div { + db.primaryie.role.attribute = attribute role { text } + db.primaryie.attlist = + db.primaryie.role.attribute? + & db.common.attributes + & db.linkends.attribute? + db.primaryie = + + ## A primary term in an index entry, not in the text + element primaryie { db.primaryie.attlist, db.all.inlines* } +} +div { + db.secondaryie.role.attribute = attribute role { text } + db.secondaryie.attlist = + db.secondaryie.role.attribute? + & db.common.attributes + & db.linkends.attribute? + db.secondaryie = + + ## A secondary term in an index entry, rather than in the text + element secondaryie { db.secondaryie.attlist, db.all.inlines* } +} +div { + db.tertiaryie.role.attribute = attribute role { text } + db.tertiaryie.attlist = + db.tertiaryie.role.attribute? + & db.common.attributes + & db.linkends.attribute? + db.tertiaryie = + + ## A tertiary term in an index entry, rather than in the text + element tertiaryie { db.tertiaryie.attlist, db.all.inlines* } +} +div { + db.seeie.role.attribute = attribute role { text } + db.seeie.attlist = + db.seeie.role.attribute? + & db.common.attributes + & db.linkend.attribute? + db.seeie = + + ## A See + ## entry in an index, rather than in the text + element seeie { db.seeie.attlist, db.all.inlines* } +} +div { + db.seealsoie.role.attribute = attribute role { text } + db.seealsoie.attlist = + db.seealsoie.role.attribute? + & db.common.attributes + & db.linkends.attribute? + db.seealsoie = + + ## A See also + ## entry in an index, rather than in the text + element seealsoie { db.seealsoie.attlist, db.all.inlines* } +} +db.toc.pagenum.attribute = + + ## Indicates the page on which this element occurs in some version of the printed document + attribute pagenum { text } +div { + db.toc.role.attribute = attribute role { text } + db.toc.attlist = + db.toc.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.toc.info = db._info.title.only + db.toc = + + ## A table of contents + [ + s:pattern [ + name = "Root must have version" + "\x{a}" ~ + " " + s:rule [ + context = "/db:toc" + "\x{a}" ~ + " " + s:assert [ + test = "@version" + "The root element must have a version attribute." + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element toc { + db.toc.attlist, + db.toc.info, + db.all.blocks*, + (db.tocdiv | db.tocentry)* + } +} +div { + db.tocdiv.role.attribute = attribute role { text } + db.tocdiv.pagenum.attribute = db.toc.pagenum.attribute + db.tocdiv.attlist = + db.tocdiv.role.attribute? + & db.common.attributes + & db.tocdiv.pagenum.attribute? + & db.linkend.attribute? + db.tocdiv.info = db._info + db.tocdiv = + + ## A division in a table of contents + element tocdiv { + db.tocdiv.attlist, + db.tocdiv.info, + db.all.blocks*, + (db.tocdiv | db.tocentry)+ + } +} +div { + db.tocentry.role.attribute = attribute role { text } + db.tocentry.pagenum.attribute = db.toc.pagenum.attribute + db.tocentry.attlist = + db.tocentry.role.attribute? + & db.common.attributes + & db.tocentry.pagenum.attribute? + & db.linkend.attribute? + db.tocentry = + + ## A component title in a table of contents + element tocentry { db.tocentry.attlist, db.all.inlines* } +} +db.task.info = db._info.title.req +div { + db.task.role.attribute = attribute role { text } + db.task.attlist = + db.task.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.task = + + ## A task to be completed + element task { + db.task.attlist, + db.task.info, + db.tasksummary?, + db.taskprerequisites?, + db.procedure, + db.example*, + db.taskrelated? + } +} +div { + db.tasksummary.role.attribute = attribute role { text } + db.tasksummary.attlist = + db.tasksummary.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.tasksummary.info = db._info.title.only + db.tasksummary = + + ## A summary of a task + element tasksummary { + db.tasksummary.attlist, db.tasksummary.info, db.all.blocks+ + } +} +div { + db.taskprerequisites.role.attribute = attribute role { text } + db.taskprerequisites.attlist = + db.taskprerequisites.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.taskprerequisites.info = db._info.title.only + db.taskprerequisites = + + ## The prerequisites for a task + element taskprerequisites { + db.taskprerequisites.attlist, + db.taskprerequisites.info, + db.all.blocks+ + } +} +div { + db.taskrelated.role.attribute = attribute role { text } + db.taskrelated.attlist = + db.taskrelated.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.taskrelated.info = db._info.title.only + db.taskrelated = + + ## Information related to a task + element taskrelated { + db.taskrelated.attlist, db.taskrelated.info, db.all.blocks+ + } +} +db.area.units.enumeration = + + ## Coordinates expressed as a pair of CALS graphic coordinates. + "calspair" + | + ## Coordinates expressed as a line and column. + "linecolumn" + | + ## Coordinates expressed as a pair of lines and columns. + "linecolumnpair" + | + ## Coordinates expressed as a line range. + "linerange" +db.area.units-enum.attribute = + + ## Identifies the units used in the coords attribute The default units vary according to the type of callout specified: calspair + ## for graphics and linecolumn + ## for line-oriented elements. + attribute units { db.area.units.enumeration }? +db.area.units-other.attributes = + + ## Indicates that non-standard units are used for this area + ## . In this case otherunits + ## must be specified. + attribute units { + + ## Coordinates expressed in some non-standard units. + "other" + }?, + + ## Identifies the units used in the coords + ## attribute when the units + ## attribute is other + ## . This attribute is forbidden otherwise. + attribute otherunits { xsd:NMTOKEN } +db.area.units.attribute = + db.area.units-enum.attribute | db.area.units-other.attributes +div { + db.calloutlist.role.attribute = attribute role { text } + db.calloutlist.attlist = + db.calloutlist.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.calloutlist.info = db._info.title.only + db.calloutlist = + + ## A list of callout + ## s + element calloutlist { + db.calloutlist.attlist, + db.calloutlist.info, + db.all.blocks*, + db.callout+ + } +} +div { + db.callout.role.attribute = attribute role { text } + db.callout.arearefs.attribute = + + ## Identifies the areas described by this callout. + attribute arearefs { xsd:IDREFS } + db.callout.attlist = + db.callout.role.attribute? + & db.common.attributes + & db.callout.arearefs.attribute + db.callout = + + ## A called out + ## description of a marked Area + element callout { db.callout.attlist, db.all.blocks+ } +} +div { + db.programlistingco.role.attribute = attribute role { text } + db.programlistingco.attlist = + db.programlistingco.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.programlistingco.info = db._info.title.forbidden + db.programlistingco = + + ## A program listing with associated areas used in callouts + element programlistingco { + db.programlistingco.attlist, + db.programlistingco.info, + db.areaspec, + db.programlisting, + db.calloutlist* + } +} +div { + db.areaspec.role.attribute = attribute role { text } + db.areaspec.attlist = + db.areaspec.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.area.units.attribute + db.areaspec = + + ## A collection of regions in a graphic or code example + element areaspec { db.areaspec.attlist, (db.area | db.areaset)+ } +} +div { + db.area.role.attribute = attribute role { text } + db.area.linkends.attribute = + + ## Point to the callout + ## s which refer to this area. (This provides bidirectional linking which may be useful in online presentation.) + attribute linkends { xsd:IDREFS } + db.area.label.attribute = + + ## Specifies an identifying number or string that may be used in presentation. The area label might be drawn on top of the figure, for example, at the position indicated by the coords attribute. + attribute label { text } + db.area.coords.attribute = + + ## Provides the coordinates of the area. The coordinates must be interpreted using the units + ## specified. + attribute coords { text } + db.area.attlist = + db.area.role.attribute? + & db.common.idreq.attributes + & db.area.units.attribute + & (db.area.linkends.attribute | db.href.attributes)? + & db.area.label.attribute? + & db.area.coords.attribute + db.area = + + ## A region defined for a Callout in a graphic or code example + element area { db.area.attlist, db.alt? } +} +div { + # The only difference is that xml:id is optional + db.area.inareaset.attlist = + db.area.role.attribute? + & db.common.attributes + & db.area.units.attribute + & (db.area.linkends.attribute | db.href.attributes)? + & db.area.label.attribute? + & db.area.coords.attribute + db.area.inareaset = + + ## A region defined for a Callout in a graphic or code example + element area { db.area.inareaset.attlist, db.alt? } +} +div { + db.areaset.role.attribute = attribute role { text } + db.areaset.linkends.attribute = db.linkends.attribute + db.areaset.label.attribute = db.label.attribute + db.areaset.attlist = + db.areaset.role.attribute? + & db.common.idreq.attributes + & db.area.units.attribute + & (db.areaset.linkends.attribute | db.href.attributes)? + & db.areaset.label.attribute? + db.areaset = + + ## A set of related areas in a graphic or code example + element areaset { db.areaset.attlist, db.area.inareaset+ } +} +div { + db.screenco.role.attribute = attribute role { text } + db.screenco.attlist = + db.screenco.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.screenco.info = db._info.title.forbidden + db.screenco = + + ## A screen with associated areas used in callouts + element screenco { + db.screenco.attlist, + db.screenco.info, + db.areaspec, + db.screen, + db.calloutlist* + } +} +div { + db.imageobjectco.role.attribute = attribute role { text } + db.imageobjectco.attlist = + db.imageobjectco.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.imageobjectco.info = db._info.title.forbidden + db.imageobjectco = + + ## A wrapper for an image object with callouts + element imageobjectco { + db.imageobjectco.attlist, + db.imageobjectco.info, + db.areaspec, + db.imageobject+, + db.calloutlist* + } +} +div { + db.co.role.attribute = attribute role { text } + db.co.linkends.attribute = db.linkends.attribute + db.co.label.attribute = db.label.attribute + db.co.attlist = + db.co.role.attribute? + & db.common.idreq.attributes + & db.co.linkends.attribute? + & db.co.label.attribute? + db.co = + + ## The location of a callout embedded in text + element co { db.co.attlist, empty } +} +div { + db.coref.role.attribute = attribute role { text } + db.coref.label.attribute = db.label.attribute + db.coref.attlist = + db.coref.role.attribute? + & db.common.attributes + & db.linkend.attribute + & db.coref.label.attribute? + db.coref = + + ## A cross reference to a co + element coref { db.coref.attlist, empty } +} +div { + db.productionset.role.attribute = attribute role { text } + db.productionset.attlist = + db.productionset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.productionset.info = db._info.title.only + db.productionset = + + ## A set of EBNF productions + element productionset { + db.productionset.attlist, + db.productionset.info, + (db.production | db.productionrecap)+ + } +} +div { + db.production.role.attribute = attribute role { text } + db.production.attlist = + db.production.role.attribute? + & db.common.idreq.attributes + & db.common.linking.attributes + db.production = + + ## A production in a set of EBNF productions + element production { + db.production.attlist, db.lhs, db.rhs, db.constraint* + } +} +div { + db.lhs.role.attribute = attribute role { text } + db.lhs.attlist = + db.lhs.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.lhs = + + ## The left-hand side of an EBNF production + element lhs { db.lhs.attlist, text } +} +div { + db.rhs.role.attribute = attribute role { text } + db.rhs.attlist = + db.rhs.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.rhs = + + ## The right-hand side of an EBNF production + element rhs { + db.rhs.attlist, + (text | db.nonterminal | db.lineannotation | db.sbr)* + } +} +div { + db.nonterminal.role.attribute = attribute role { text } + db.nonterminal.def.attribute = + + ## Specifies a URI that points to a production + ## where the nonterminal + ## is defined + attribute def { xsd:anyURI } + db.nonterminal.attlist = + db.nonterminal.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.nonterminal.def.attribute + db.nonterminal = + + ## A non-terminal in an EBNF production + element nonterminal { db.nonterminal.attlist, text } +} +div { + db.constraint.role.attribute = attribute role { text } + db.constraint.attlist = + db.constraint.role.attribute? + & db.common.attributes + & db.common.req.linking.attributes + db.constraint = + + ## A constraint in an EBNF production + element constraint { db.constraint.attlist, empty } +} +div { + db.productionrecap.role.attribute = attribute role { text } + db.productionrecap.attlist = + db.productionrecap.role.attribute? + & db.common.attributes + & db.common.req.linking.attributes + db.productionrecap = + + ## A cross-reference to an EBNF production + element productionrecap { db.productionrecap.attlist, empty } +} +div { + db.constraintdef.role.attribute = attribute role { text } + db.constraintdef.attlist = + db.constraintdef.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.constraintdef.info = db._info.title.only + db.constraintdef = + + ## The definition of a constraint in an EBNF production + element constraintdef { + db.constraintdef.attlist, db.constraintdef.info, db.all.blocks+ + } +} +db.char.attribute = + + ## Specifies the alignment character when align + ## is set to char + ## . + attribute char { text } +db.charoff.attribute = + + ## Specifies the percentage of the column's total width that should appear to the left of the first occurance of the character identified in char + ## when align + ## is set to char + ## . + attribute charoff { + xsd:decimal { minExclusive = "0" maxExclusive = "100" } + } +db.frame.attribute = + + ## Specifies how the table is to be framed. Note that there is no way to obtain a border on only the starting edge (left, in left-to-right writing systems) of the table. + attribute frame { + + ## Frame all four sides of the table. In some environments with limited control over table border formatting, such as HTML, this may imply additional borders. + "all" + | + ## Frame only the bottom of the table. + "bottom" + | + ## Place no border on the table. In some environments with limited control over table border formatting, such as HTML, this may disable other borders as well. + "none" + | + ## Frame the left and right sides of the table. + "sides" + | + ## Frame the top of the table. + "top" + | + ## Frame the top and bottom of the table. + "topbot" + } +db.colsep.attribute = + + ## Specifies the presence or absence of the column separator + attribute colsep { + + ## No column separator rule. + "0" + | + ## Provide a column separator rule on the right + "1" + } +db.rowsep.attribute = + + ## Specifies the presence or absence of the row separator + attribute rowsep { + + ## No row separator rule. + "0" + | + ## Provide a row separator rule below + "1" + } +db.orient.attribute = + + ## Specifies the orientation of the table + attribute orient { + + ## 90 degrees counter-clockwise from the rest of the text flow. + "land" + | + ## The same orientation as the rest of the text flow. + "port" + } +db.tabstyle.attribute = + + ## Specifies the table style + attribute tabstyle { text } +db.rowheader.attribute = + + ## Indicates whether or not the entries in the first column should be considered row headers + attribute rowheader { + + ## Indicates that entries in the first column of the table are functionally row headers (analogous to the way that a thead provides column headers). + "firstcol" + | + ## Indicates that entries in the first column have no special significance with respect to column headers. + "norowheader" + } +db.align.attribute = + + ## Specifies the horizontal alignment of text in an entry. + attribute align { + + ## Centered. + "center" + | + ## Aligned on a particular character. + "char" + | + ## Left and right justified. + "justify" + | + ## Left justified. + "left" + | + ## Right justified. + "right" + } +db.valign.attribute = + + ## Specifies the vertical alignment of text in an entry. + attribute valign { + + ## Aligned on the bottom of the entry. + "bottom" + | + ## Aligned in the middle. + "middle" + | + ## Aligned at the top of the entry. + "top" + } +db.specify-col-by-colname.attributes = + + ## Specifies a column specification by name. + attribute colname { text } +db.specify-col-by-namest.attributes = + + ## Specifies a starting column by name. + attribute namest { text } +db.specify-span-by-spanspec.attributes = + + ## Specifies a span by name. + attribute spanname { text } +db.specify-span-directly.attributes = + + ## Specifies a starting column by name. + attribute namest { text } + & + ## Specifies an ending column by name. + attribute nameend { text } +db.column-spec.attributes = + db.specify-col-by-colname.attributes + | db.specify-col-by-namest.attributes + | db.specify-span-by-spanspec.attributes + | db.specify-span-directly.attributes +db.colname.attribute = + + ## Provides a name for a column specification. + attribute colname { text } +db.spanname.attribute = + + ## Provides a name for a span specification. + attribute spanname { text } +div { + db.tgroup.role.attribute = attribute role { text } + db.tgroup.tgroupstyle.attribute = + + ## Additional style information for downstream processing; typically the name of a style. + attribute tgroupstyle { text } + db.tgroup.cols.attribute = + + ## The number of columns in the table. Must be an integer greater than zero. + attribute cols { xsd:positiveInteger } + db.tgroup.attlist = + db.tgroup.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.char.attribute? + & db.charoff.attribute? + & db.tgroup.tgroupstyle.attribute? + & db.tgroup.cols.attribute + & db.colsep.attribute? + & db.rowsep.attribute? + & db.align.attribute? + db.tgroup = + + ## A wrapper for the main content of a table, or part of a table + element tgroup { + db.tgroup.attlist, + db.colspec*, + db.spanspec*, + db.cals.thead?, + db.cals.tfoot?, + db.cals.tbody + } +} +div { + db.colspec.role.attribute = attribute role { text } + db.colspec.colnum.attribute = + + ## The number of the column to which this specification applies. Must be greater than any preceding column number. Defaults to one more than the number of the preceding column, if there is one, or one. + attribute colnum { xsd:positiveInteger } + db.colspec.colwidth.attribute = + + ## Specifies the width of the column. + attribute colwidth { text } + db.colspec.attlist = + db.colspec.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.colspec.colnum.attribute? + & db.char.attribute? + & db.colsep.attribute? + & db.colspec.colwidth.attribute? + & db.charoff.attribute? + & db.colname.attribute? + & db.rowsep.attribute? + & db.align.attribute? + db.colspec = + + ## Specifications for a column in a table + element colspec { db.colspec.attlist, empty } +} +div { + db.spanspec.role.attribute = attribute role { text } + db.spanspec.namest.attribute = + + ## Specifies a starting column by name. + attribute namest { text } + db.spanspec.nameend.attribute = + + ## Specifies an ending column by name. + attribute nameend { text } + db.spanspec.attlist = + db.spanspec.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.spanname.attribute + & db.spanspec.namest.attribute + & db.spanspec.nameend.attribute + & db.char.attribute? + & db.colsep.attribute? + & db.charoff.attribute? + & db.rowsep.attribute? + & db.align.attribute? + db.spanspec = + + ## Formatting information for a spanned column in a table + element spanspec { db.spanspec.attlist, empty } +} +div { + db.cals.thead.role.attribute = attribute role { text } + db.cals.thead.attlist = + db.cals.thead.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.valign.attribute? + db.cals.thead = + + ## A table header consisting of one or more rows + element thead { db.cals.thead.attlist, db.colspec*, db.row+ } +} +div { + db.cals.tfoot.role.attribute = attribute role { text } + db.cals.tfoot.attlist = + db.cals.tfoot.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.valign.attribute? + db.cals.tfoot = + + ## A table footer consisting of one or more rows + element tfoot { db.cals.tfoot.attlist, db.colspec*, db.row+ } +} +div { + db.cals.tbody.role.attribute = attribute role { text } + db.cals.tbody.attlist = + db.cals.tbody.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.valign.attribute? + db.cals.tbody = + + ## A wrapper for the rows of a table or informal table + element tbody { db.cals.tbody.attlist, db.row+ } +} +div { + db.row.role.attribute = attribute role { text } + db.row.attlist = + db.row.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.rowsep.attribute? + & db.valign.attribute? + db.row = + + ## A row in a table + element row { db.row.attlist, (db.entry | db.entrytbl)+ } +} +div { + db.entry.role.attribute = attribute role { text } + db.entry.morerows.attribute = + + ## Specifies the number of additional rows which this entry occupies. Defaults to zero. + attribute morerows { xsd:integer } + db.entry.rotate.attribute = + + ## Specifies the rotation of this entry. A value of 1 (true) rotates the cell 90 degrees counter-clockwise. A value of 0 (false) leaves the cell unrotated. + attribute rotate { + + ## Do not rotate the cell. + "0" + | + ## Rotate the cell 90 degrees counter-clockwise. + "1" + } + db.entry.attlist = + db.entry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.valign.attribute? + & db.char.attribute? + & db.colsep.attribute? + & db.charoff.attribute? + & db.entry.morerows.attribute? + & db.column-spec.attributes? + & db.rowsep.attribute? + & db.entry.rotate.attribute? + & db.align.attribute? + db.entry = + + ## A cell in a table + element entry { + db.entry.attlist, (db.all.inlines* | db.all.blocks*) + } +} +div { + db.entrytbl.role.attribute = attribute role { text } + db.entrytbl.tgroupstyle.attribute = + + ## Additional style information for downstream processing; typically the name of a style. + attribute tgroupstyle { text } + db.entrytbl.cols.attribute = + + ## The number of columns in the entry table. Must be an integer greater than zero. + attribute cols { xsd:positiveInteger } + db.entrytbl.attlist = + db.entrytbl.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.char.attribute? + & db.charoff.attribute? + & db.column-spec.attributes? + & db.entrytbl.tgroupstyle.attribute? + & db.entrytbl.cols.attribute? + & db.colsep.attribute? + & db.rowsep.attribute? + & db.align.attribute? + db.entrytbl = + + ## A subtable appearing in place of an Entry in a table + element entrytbl { + db.entrytbl.attlist, + db.colspec*, + db.spanspec*, + db.cals.entrytbl.thead?, + db.cals.entrytbl.tbody + } +} +div { + db.cals.entrytbl.thead.role.attribute = attribute role { text } + db.cals.entrytbl.thead.attlist = + db.cals.entrytbl.thead.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.valign.attribute? + db.cals.entrytbl.thead = + + ## A table header consisting of one or more rows + element thead { + db.cals.entrytbl.thead.attlist, db.colspec*, db.entrytbl.row+ + } +} +div { + db.cals.entrytbl.tbody.role.attribute = attribute role { text } + db.cals.entrytbl.tbody.attlist = + db.cals.entrytbl.tbody.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.valign.attribute? + db.cals.entrytbl.tbody = + + ## A wrapper for the rows of a table or informal table + element tbody { db.cals.entrytbl.tbody.attlist, db.entrytbl.row+ } +} +div { + db.entrytbl.row.role.attribute = attribute role { text } + db.entrytbl.row.attlist = + db.entrytbl.row.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.rowsep.attribute? + & db.valign.attribute? + db.entrytbl.row = + + ## A row in a table + element row { db.entrytbl.row.attlist, db.entry+ } +} +div { + db.cals.table.role.attribute = attribute role { text } + db.cals.table.label.attribute = db.label.attribute + db.cals.table.attlist = + db.cals.table.role.attribute? + & db.cals.table.label.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.tabstyle.attribute? + & db.floatstyle.attribute? + & db.orient.attribute? + & db.colsep.attribute? + & db.rowsep.attribute? + & db.frame.attribute? + & db.pgwide.attribute? + & + ## Indicates if the short or long title should be used in a List of Tables + attribute shortentry { + + ## Indicates that the full title should be used. + "0" + | + ## Indicates that the short short title (titleabbrev) should be used. + "1" + }? + & + ## Indicates if the table should appear in a List of Tables + attribute tocentry { + + ## Indicates that the table should not occur in the List of Tables. + "0" + | + ## Indicates that the table should appear in the List of Tables. + "1" + }? + & db.rowheader.attribute? + db.cals.table.info = db._info.title.onlyreq + db.cals.table = + + ## A formal table in a document + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:informaltable)" + "informaltable must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element table { + db.cals.table.attlist, + db.cals.table.info, + (db.alt? & db.indexing.inlines* & db.textobject*), + (db.mediaobject+ | db.tgroup+), + db.caption? + } +} +div { + db.cals.informaltable.role.attribute = attribute role { text } + db.cals.informaltable.attlist = + db.cals.informaltable.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.tabstyle.attribute? + & db.floatstyle.attribute? + & db.orient.attribute? + & db.colsep.attribute? + & db.rowsep.attribute? + & db.frame.attribute? + & db.pgwide.attribute? + & db.rowheader.attribute? + db.cals.informaltable.info = db._info.title.forbidden + db.cals.informaltable = + + ## A table without a title + element informaltable { + db.cals.informaltable.attlist, + db.cals.informaltable.info, + (db.alt? & db.indexing.inlines* & db.textobject*), + (db.mediaobject+ | db.tgroup+), + db.caption? + } +} +db.html.coreattrs = + + ## This attribute assigns a class name or set of class names to an element. Any number of elements may be assigned the same class name or names. Multiple class names must be separated by white space characters. + attribute class { text }? + & + ## This attribute specifies style information for the current element. + attribute style { text }? + & + ## This attribute offers advisory information about the element for which it is set. + attribute title { text }? +db.html.i18n = + + ## This attribute specifies the base language of an element's attribute values and text content. The default value of this attribute is unknown. + attribute lang { text }? +db.html.events = + + ## Occurs when the pointing device button is clicked over an element. + attribute onclick { text }? + & + ## Occurs when the pointing device button is double clicked over an element. + attribute ondblclick { text }? + & + ## Occurs when the pointing device button is pressed over an element. + attribute onmousedown { text }? + & + ## Occurs when the pointing device button is released over an element. + attribute onmouseup { text }? + & + ## Occurs when the pointing device is moved onto an element. + attribute onmouseover { text }? + & + ## Occurs when the pointing device is moved while it is over an element. + attribute onmousemove { text }? + & + ## Occurs when the pointing device is moved away from an element. + attribute onmouseout { text }? + & + ## Occurs when a key is pressed and released over an element. + attribute onkeypress { text }? + & + ## Occurs when a key is pressed down over an element. + attribute onkeydown { text }? + & + ## Occurs when a key is released over an element. + attribute onkeyup { text }? +db.html.attrs = + db.common.attributes + & db.html.coreattrs + & db.html.i18n + & db.html.events +db.html.cellhalign = + + ## Specifies the alignment of data and the justification of text in a cell. + attribute align { + + ## Left-flush data/Left-justify text. This is the default value for table data. + "left" + | + ## Center data/Center-justify text. This is the default value for table headers. + "center" + | + ## Right-flush data/Right-justify text. + "right" + | + ## Double-justify text. + "justify" + | + ## Align text around a specific character. If a user agent doesn't support character alignment, behavior in the presence of this value is unspecified. + "char" + }? + & + ## This attribute specifies a single character within a text fragment to act as an axis for alignment. The default value for this attribute is the decimal point character for the current language as set by the lang attribute (e.g., the period in English and the comma in French). User agents are not required to support this attribute. + attribute char { text }? + & + ## When present, this attribute specifies the offset to the first occurrence of the alignment character on each line. If a line doesn't include the alignment character, it should be horizontally shifted to end at the alignment position. When charoff is used to set the offset of an alignment character, the direction of offset is determined by the current text direction (set by the dir attribute). In left-to-right texts (the default), offset is from the left margin. In right-to-left texts, offset is from the right margin. User agents are not required to support this attribute. + attribute charoff { + xsd:integer + | xsd:string { pattern = "[0-9]+%" } + }? +db.html.cellvalign = + + ## Specifies the vertical position of data within a cell. + attribute valign { + + ## Cell data is flush with the top of the cell. + "top" + | + ## Cell data is centered vertically within the cell. This is the default value. + "middle" + | + ## Cell data is flush with the bottom of the cell. + "bottom" + | + ## All cells in the same row as a cell whose valign attribute has this value should have their textual data positioned so that the first text line occurs on a baseline common to all cells in the row. This constraint does not apply to subsequent text lines in these cells. + "baseline" + }? +db.html.table.attributes = + + ## Provides a summary of the table's purpose and structure for user agents rendering to non-visual media such as speech and Braille. + attribute summary { text }? + & + ## Specifies the desired width of the entire table and is intended for visual user agents. When the value is a percentage value, the value is relative to the user agent's available horizontal space. In the absence of any width specification, table width is determined by the user agent. + attribute width { + xsd:integer + | xsd:string { pattern = "[0-9]+%" } + }? + & + ## Specifies the width (in pixels only) of the frame around a table. + attribute border { xsd:nonNegativeInteger }? + & + ## Specifies which sides of the frame surrounding a table will be visible. + attribute frame { + + ## No sides. This is the default value. + "void" + | + ## The top side only. + "above" + | + ## The bottom side only. + "below" + | + ## The top and bottom sides only. + "hsides" + | + ## The left-hand side only. + "lhs" + | + ## The right-hand side only. + "rhs" + | + ## The right and left sides only. + "vsides" + | + ## All four sides. + "box" + | + ## All four sides. + "border" + }? + & + ## Specifies which rules will appear between cells within a table. The rendering of rules is user agent dependent. + attribute rules { + + ## No rules. This is the default value. + "none" + | + ## Rules will appear between row groups (see thead, tfoot, and tbody) and column groups (see colgroup and col) only. + "groups" + | + ## Rules will appear between rows only. + "rows" + | + ## Rules will appear between columns only. + "cols" + | + ## Rules will appear between all rows and columns. + "all" + }? + & + ## Specifies how much space the user agent should leave between the left side of the table and the left-hand side of the leftmost column, the top of the table and the top side of the topmost row, and so on for the right and bottom of the table. The attribute also specifies the amount of space to leave between cells. + attribute cellspacing { + xsd:integer + | xsd:string { pattern = "[0-9]+%" } + }? + & + ## Specifies the amount of space between the border of the cell and its contents. If the value of this attribute is a pixel length, all four margins should be this distance from the contents. If the value of the attribute is a percentage length, the top and bottom margins should be equally separated from the content based on a percentage of the available vertical space, and the left and right margins should be equally separated from the content based on a percentage of the available horizontal space. + attribute cellpadding { + xsd:integer + | xsd:string { pattern = "[0-9]+%" } + }? +db.html.tablecell.attributes = + + ## Provides an abbreviated form of the cell's content and may be rendered by user agents when appropriate in place of the cell's content. Abbreviated names should be short since user agents may render them repeatedly. For instance, speech synthesizers may render the abbreviated headers relating to a particular cell before rendering that cell's content. + attribute abbr { text }? + & + ## This attribute may be used to place a cell into conceptual categories that can be considered to form axes in an n-dimensional space. User agents may give users access to these categories (e.g., the user may query the user agent for all cells that belong to certain categories, the user agent may present a table in the form of a table of contents, etc.). Please consult an HTML reference for more details. + attribute axis { text }? + & + ## Specifies the list of header cells that provide header information for the current data cell. The value of this attribute is a space-separated list of cell names; those cells must be named by setting their id attribute. Authors generally use the headers attribute to help non-visual user agents render header information about data cells (e.g., header information is spoken prior to the cell data), but the attribute may also be used in conjunction with style sheets. + attribute headers { text }? + & + ## Specifies the set of data cells for which the current header cell provides header information. This attribute may be used in place of the headers attribute, particularly for simple tables. + attribute scope { + + ## The current cell provides header information for the rest of the row that contains it + "row" + | + ## The current cell provides header information for the rest of the column that contains it. + "col" + | + ## The header cell provides header information for the rest of the row group that contains it. + "rowgroup" + | + ## The header cell provides header information for the rest of the column group that contains it. + "colgroup" + }? + & + ## Specifies the number of rows spanned by the current cell. The default value of this attribute is one (1 + ## ). The value zero (0 + ## ) means that the cell spans all rows from the current row to the last row of the table section (thead + ## , tbody + ## , or tfoot + ## ) in which the cell is defined. + attribute rowspan { xsd:nonNegativeInteger }? + & + ## Specifies the number of columns spanned by the current cell. The default value of this attribute is one (1 + ## ). The value zero (0 + ## ) means that the cell spans all columns from the current column to the last column of the column group (colgroup + ## ) in which the cell is defined. + attribute colspan { xsd:nonNegativeInteger }? +db.html.table.info = db._info.title.forbidden +db.html.table.model = + db.html.table.info?, + db.html.caption, + (db.html.col* | db.html.colgroup*), + db.html.thead?, + db.html.tfoot?, + (db.html.tbody+ | db.html.tr+) +db.html.informaltable.info = db._info.title.forbidden +db.html.informaltable.model = + db.html.informaltable.info?, + (db.html.col* | db.html.colgroup*), + db.html.thead?, + db.html.tfoot?, + (db.html.tbody+ | db.html.tr+) +div { + db.html.table.role.attribute = attribute role { text } + db.html.table.label.attribute = db.label.attribute + db.html.table.attlist = + db.html.attrs + & db.html.table.attributes + & db.html.table.role.attribute? + & db.html.table.label.attribute? + & db.orient.attribute? + & db.pgwide.attribute? + & db.tabstyle.attribute? + & db.floatstyle.attribute? + db.html.table = + + ## A formal (captioned) HTML table in a document + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:table" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:informaltable)" + "informaltable must not occur in the descendants of table" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element table { db.html.table.attlist, db.html.table.model } +} +div { + db.html.informaltable.attlist = + db.html.attrs & db.html.table.attributes + db.html.informaltable = + + ## An HTML table without a title + element informaltable { + db.html.informaltable.attlist, db.html.informaltable.model + } +} +div { + db.html.caption.attlist = db.html.attrs + db.html.caption = + + ## An HTML table caption + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:table)" + "table must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:sidebar)" + "sidebar must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:caption" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:task)" + "task must not occur in the descendants of caption" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element caption { db.html.caption.attlist, db.all.inlines* } +} +div { + db.html.col.attlist = + db.html.attrs + & + ## This attribute, whose value must be an integer > 0, specifies the number of columns spanned + ## by the col + ## element; the col + ## element shares its attributes with all the columns it spans. The default value for this attribute is 1 (i.e., a single column). If the span attribute is set to N > 1, the current col + ## element shares its attributes with the next N-1 columns. + attribute span { xsd:nonNegativeInteger }? + & + ## Specifies a default width for each column spanned by the current col + ## element. It has the same meaning as the width + ## attribute for the colgroup + ## element and overrides it. + attribute width { text }? + & db.html.cellhalign + & db.html.cellvalign + db.html.col = + + ## Specifications for a column in an HTML table + element col { db.html.col.attlist, empty } +} +div { + db.html.colgroup.attlist = + db.html.attrs + & + ## This attribute, which must be an integer > 0, specifies the number of columns in a column group. In the absence of a span attribute, each colgroup + ## defines a column group containing one column. If the span attribute is set to N > 0, the current colgroup + ## element defines a column group containing N columns. User agents must ignore this attribute if the colgroup + ## element contains one or more col + ## elements. + attribute span { xsd:nonNegativeInteger }? + & + ## This attribute specifies a default width for each column in the current column group. In addition to the standard pixel, percentage, and relative values, this attribute allows the special form 0* + ## (zero asterisk) which means that the width of the each column in the group should be the minimum width necessary to hold the column's contents. This implies that a column's entire contents must be known before its width may be correctly computed. Authors should be aware that specifying 0* + ## will prevent visual user agents from rendering a table incrementally. This attribute is overridden for any column in the column group whose width is specified via a col + ## element. + attribute width { text }? + & db.html.cellhalign + & db.html.cellvalign + db.html.colgroup = + + ## A group of columns in an HTML table + element colgroup { db.html.colgroup.attlist, db.html.col* } +} +div { + db.html.thead.attlist = + db.html.attrs & db.html.cellhalign & db.html.cellvalign + db.html.thead = + + ## A table header consisting of one or more rows in an HTML table + element thead { db.html.thead.attlist, db.html.tr+ } +} +div { + db.html.tfoot.attlist = + db.html.attrs & db.html.cellhalign & db.html.cellvalign + db.html.tfoot = + + ## A table footer consisting of one or more rows in an HTML table + element tfoot { db.html.tfoot.attlist, db.html.tr+ } +} +div { + db.html.tbody.attlist = + db.html.attrs & db.html.cellhalign & db.html.cellvalign + db.html.tbody = + + ## A wrapper for the rows of an HTML table or informal HTML table + element tbody { db.html.tbody.attlist, db.html.tr+ } +} +div { + db.html.tr.attlist = + db.html.attrs & db.html.cellhalign & db.html.cellvalign + db.html.tr = + + ## A row in an HTML table + element tr { db.html.tr.attlist, (db.html.th | db.html.td)+ } +} +div { + db.html.th.attlist = + db.html.attrs + & db.html.tablecell.attributes + & db.html.cellhalign + & db.html.cellvalign + db.html.th = + + ## A table header entry in an HTML table + element th { + db.html.th.attlist, (db.all.inlines* | db.all.blocks*) + } +} +div { + db.html.td.attlist = + db.html.attrs + & db.html.tablecell.attributes + & db.html.cellhalign + & db.html.cellvalign + db.html.td = + + ## A table entry in an HTML table + element td { + db.html.td.attlist, (db.all.inlines* | db.all.blocks*) + } +} +div { + db.msgset.role.attribute = attribute role { text } + db.msgset.attlist = + db.msgset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgset.info = db._info.title.only + db.msgset = + + ## A detailed set of messages, usually error messages + element msgset { + db.msgset.attlist, + db.msgset.info, + (db.msgentry+ | db.simplemsgentry+) + } +} +div { + db.msgentry.role.attribute = attribute role { text } + db.msgentry.attlist = + db.msgentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgentry = + + ## A wrapper for an entry in a message set + element msgentry { + db.msgentry.attlist, db.msg+, db.msginfo?, db.msgexplan* + } +} +div { + db.simplemsgentry.role.attribute = attribute role { text } + db.simplemsgentry.msgaud.attribute = + + ## The audience to which the message relevant + attribute msgaud { text } + db.simplemsgentry.msgorig.attribute = + + ## The origin of the message + attribute msgorig { text } + db.simplemsgentry.msglevel.attribute = + + ## The level of importance or severity of a message + attribute msglevel { text } + db.simplemsgentry.attlist = + db.simplemsgentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.simplemsgentry.msgaud.attribute? + & db.simplemsgentry.msgorig.attribute? + & db.simplemsgentry.msglevel.attribute? + db.simplemsgentry = + + ## A wrapper for a simpler entry in a message set + element simplemsgentry { + db.simplemsgentry.attlist, db.msgtext, db.msgexplan+ + } +} +div { + db.msg.role.attribute = attribute role { text } + db.msg.attlist = + db.msg.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msg.info = db._info.title.only + db.msg = + + ## A message in a message set + element msg { + db.msg.attlist, db.msg.info, db.msgmain, (db.msgsub | db.msgrel)* + } +} +div { + db.msgmain.role.attribute = attribute role { text } + db.msgmain.attlist = + db.msgmain.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgmain.info = db._info.title.only + db.msgmain = + + ## The primary component of a message in a message set + element msgmain { db.msgmain.attlist, db.msgmain.info, db.msgtext } +} +div { + db.msgsub.role.attribute = attribute role { text } + db.msgsub.attlist = + db.msgsub.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgsub.info = db._info.title.only + db.msgsub = + + ## A subcomponent of a message in a message set + element msgsub { db.msgsub.attlist, db.msgsub.info, db.msgtext } +} +div { + db.msgrel.role.attribute = attribute role { text } + db.msgrel.attlist = + db.msgrel.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgrel.info = db._info.title.only + db.msgrel = + + ## A related component of a message in a message set + element msgrel { db.msgrel.attlist, db.msgrel.info, db.msgtext } +} +div { + db.msgtext.role.attribute = attribute role { text } + db.msgtext.attlist = + db.msgtext.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgtext = + + ## The actual text of a message component in a message set + element msgtext { db.msgtext.attlist, db.all.blocks+ } +} +div { + db.msginfo.role.attribute = attribute role { text } + db.msginfo.attlist = + db.msginfo.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msginfo = + + ## Information about a message in a message set + element msginfo { + db.msginfo.attlist, (db.msglevel | db.msgorig | db.msgaud)* + } +} +div { + db.msglevel.role.attribute = attribute role { text } + db.msglevel.attlist = + db.msglevel.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msglevel = + + ## The level of importance or severity of a message in a message set + element msglevel { db.msglevel.attlist, db._text } +} +div { + db.msgorig.role.attribute = attribute role { text } + db.msgorig.attlist = + db.msgorig.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgorig = + + ## The origin of a message in a message set + element msgorig { db.msgorig.attlist, db._text } +} +div { + db.msgaud.role.attribute = attribute role { text } + db.msgaud.attlist = + db.msgaud.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgaud = + + ## The audience to which a message in a message set is relevant + element msgaud { db.msgaud.attlist, db._text } +} +div { + db.msgexplan.role.attribute = attribute role { text } + db.msgexplan.attlist = + db.msgexplan.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.msgexplan.info = db._info.title.only + db.msgexplan = + + ## Explanatory material relating to a message in a message set + element msgexplan { + db.msgexplan.attlist, db.msgexplan.info, db.all.blocks+ + } +} +div { + db.qandaset.role.attribute = attribute role { text } + db.qandaset.defaultlabel.enumeration = + + ## No labels + "none" + | + ## Numeric labels + "number" + | + ## "Q:" and "A:" labels + "qanda" + db.qandaset.defaultlabel.attribute = + + ## Specifies the default labelling + attribute defaultlabel { db.qandaset.defaultlabel.enumeration } + db.qandaset.attlist = + db.qandaset.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.qandaset.defaultlabel.attribute? + db.qandaset.info = db._info.title.only + db.qandaset = + + ## A question-and-answer set + element qandaset { + db.qandaset.attlist, + db.qandaset.info, + db.all.blocks*, + (db.qandadiv+ | db.qandaentry+) + } +} +div { + db.qandadiv.role.attribute = attribute role { text } + db.qandadiv.attlist = + db.qandadiv.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.qandadiv.info = db._info.title.only + db.qandadiv = + + ## A titled division in a QandASet + element qandadiv { + db.qandadiv.attlist, + db.qandadiv.info, + db.all.blocks*, + (db.qandadiv+ | db.qandaentry+) + } +} +div { + db.qandaentry.role.attribute = attribute role { text } + db.qandaentry.attlist = + db.qandaentry.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.qandaentry.info = db._info.title.only + db.qandaentry = + + ## A question/answer set within a QandASet + element qandaentry { + db.qandaentry.attlist, db.qandaentry.info, db.question, db.answer* + } +} +div { + db.question.role.attribute = attribute role { text } + db.question.attlist = + db.question.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.question = + + ## A question in a QandASet + element question { db.question.attlist, db.label?, db.all.blocks+ } +} +div { + db.answer.role.attribute = attribute role { text } + db.answer.attlist = + db.answer.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.answer = + + ## An answer to a question posed in a QandASet + element answer { db.answer.attlist, db.label?, db.all.blocks+ } +} +div { + db.label.role.attribute = attribute role { text } + db.label.attlist = + db.label.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.label = + + ## A label on a Question or Answer + element label { db.label.attlist, db._text } +} +db.math.inlines = db.inlineequation +db.equation.content = (db.mediaobject+ | db.mathphrase+) | db._any.mml+ +db.inlineequation.content = db.inlinemediaobject+ | db.mathphrase+ +div { + db.equation.role.attribute = attribute role { text } + db.equation.label.attribute = db.label.attribute + db.equation.attlist = + db.equation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + & db.equation.label.attribute? + & db.pgwide.attribute? + & db.floatstyle.attribute? + db.equation.info = db._info.title.only + db.equation = + + ## A displayed mathematical equation + [ + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:example)" + "example must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:figure)" + "figure must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:table)" + "table must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:equation)" + "equation must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:caution)" + "caution must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:important)" + "important must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:note)" + "note must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:tip)" + "tip must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + s:pattern [ + name = "Element exclusion" + "\x{a}" ~ + " " + s:rule [ + context = "db:equation" + "\x{a}" ~ + " " + s:assert [ + test = "not(.//db:warning)" + "warning must not occur in the descendants of equation" + ] + "\x{a}" ~ + " " + ] + "\x{a}" ~ + " " + ] + ] + element equation { + db.equation.attlist, + db.equation.info, + db.alt?, + db.equation.content, + db.caption? + } +} +div { + db.informalequation.role.attribute = attribute role { text } + db.informalequation.attlist = + db.informalequation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.informalequation.info = db._info.title.forbidden + db.informalequation = + + ## A displayed mathematical equation without a title + element informalequation { + db.informalequation.attlist, + db.informalequation.info, + db.alt?, + db.equation.content, + db.caption? + } +} +div { + db.inlineequation.role.attribute = attribute role { text } + db.inlineequation.attlist = + db.inlineequation.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.inlineequation = + + ## A mathematical equation or expression occurring inline + element inlineequation { + db.inlineequation.attlist, db.alt?, db.inlineequation.content + } +} +div { + db.mathphrase.role.attribute = attribute role { text } + db.mathphrase.attlist = + db.mathphrase.role.attribute? + & db.common.attributes + & db.common.linking.attributes + db.mathphrase = + + ## A mathematical phrase, an expression that can be represented with ordinary text and a small amount of markup + element mathphrase { + db.mathphrase.attlist, + (db._text | db.ubiq.inlines | db._emphasis)* + } +} +div { + db.imagedata.mathml.role.attribute = attribute role { text } + db.imagedata.mathml.attlist = + db.imagedata.mathml.role.attribute? + & db.common.attributes + & + ## Specifies that the format of the data is MathML + attribute format { + + ## Specifies MathML. + "mathml" + }? + & db.imagedata.align.attribute? + & db.imagedata.valign.attribute? + & db.imagedata.width.attribute? + & db.imagedata.contentwidth.attribute? + & db.imagedata.scalefit.attribute? + & db.imagedata.scale.attribute? + & db.imagedata.depth.attribute? + & db.imagedata.contentdepth.attribute? + db.imagedata.mathml.info = db._info.title.forbidden + db.imagedata.mathml = + + ## A MathML expression in a media object + element imagedata { + db.imagedata.mathml.attlist, + db.imagedata.mathml.info, + db._any.mml+ + } +} +div { + db._any.mml = + + ## Any element from the MathML namespace + element mml:* { (db._any.attribute | text | db._any)* } +} +div { + db.imagedata.svg.role.attribute = attribute role { text } + db.imagedata.svg.attlist = + db.imagedata.svg.role.attribute? + & db.common.attributes + & + ## Specifies that the format of the data is SVG + attribute format { + + ## Specifies SVG. + "svg" + }? + & db.imagedata.align.attribute? + & db.imagedata.valign.attribute? + & db.imagedata.width.attribute? + & db.imagedata.contentwidth.attribute? + & db.imagedata.scalefit.attribute? + & db.imagedata.scale.attribute? + & db.imagedata.depth.attribute? + & db.imagedata.contentdepth.attribute? + db.imagedata.svg.info = db._info.title.forbidden + db.imagedata.svg = + + ## An SVG drawing in a media object + element imagedata { + db.imagedata.svg.attlist, db.imagedata.svg.info, db._any.svg+ + } +} +div { + db._any.svg = + + ## Any element from the SVG namespace + element svg:* { (db._any.attribute | text | db._any)* } +} diff --git a/plugins/relaxng/testData/parsing/psi/complex/Docbook.txt b/plugins/relaxng/testData/parsing/psi/complex/Docbook.txt new file mode 100644 index 000000000000..43095f609984 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/Docbook.txt @@ -0,0 +1,55100 @@ +RncFileImpl:Docbook.rnc + DOCUMENT + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('a') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://relaxng.org/ns/compatibility/annotations/1.0"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('ctrl') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://nwalsh.com/xmlns/schema-control/"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_DEFAULT)('default') + PsiWhiteSpace(' ') + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('db') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://docbook.org/ns/docbook"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('html') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/1999/xhtml"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('mml') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/1998/Math/MathML"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('rng') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://relaxng.org/ns/structure/1.0"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('s') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.ascc.net/xml/schematron"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('svg') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/2000/svg"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('xlink') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/1999/xlink"') + PsiWhiteSpace('\n') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:ns') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('prefix') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"a"') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('uri') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://relaxng.org/ns/compatibility/annotations/1.0"') + PsiWhiteSpace('\n') + PsiElement(])(']') + PsiWhiteSpace('\n') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:ns') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('prefix') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"ctrl"') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('uri') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://nwalsh.com/xmlns/schema-control/"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:ns') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('prefix') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db"') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('uri') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://docbook.org/ns/docbook"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:ns') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('prefix') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"dbx"') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('uri') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"http://sourceforge.net/projects/docbook/defguide/schema/extra-markup"') + PsiWhiteSpace('\n') + PsiElement(])(']') + PsiWhiteSpace('\n') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:ns') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('prefix') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"html"') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('uri') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/1999/xhtml"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:ns') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('prefix') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"mml"') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('uri') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/1998/Math/MathML"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:ns') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('prefix') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"rng"') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('uri') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://relaxng.org/ns/structure/1.0"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:ns') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('prefix') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"s"') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('uri') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.ascc.net/xml/schematron"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:ns') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('prefix') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"svg"') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('uri') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/2000/svg"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:ns') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('prefix') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"xlink"') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('uri') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/1999/xlink"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# DocBook V5.0CR5') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# See http://docbook.org/ns/docbook') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# This file is part of DocBook V5.0CR5') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Copyright 1992-2005 HaL Computer Systems, Inc.,') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Corporation, Norman Walsh, Sun Microsystems, Inc., and the') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Organization for the Advancement of Structured Information') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Standards (OASIS).') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Permission to use, copy, modify and distribute the DocBook schema') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# and its accompanying documentation for any purpose and without fee') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# is hereby granted in perpetuity, provided that the above copyright') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# notice and this paragraph appear in all copies. The copyright') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# holders make no representation about the suitability of the schema') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# for any purpose. It is provided "as is" without expressed or implied') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# warranty.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# If you modify the DocBook schema in any way, label your schema as a') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# variant of DocBook. See the reference documentation') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# (http://docbook.org/tdg5/en/html/ch05.html#s-notdocbook)') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# for more information.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Please direct all questions, bug reports, or suggestions for changes') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# to the docbook@lists.oasis-open.org mailing list. For more') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# information, see http://www.oasis-open.org/docbook/.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ======================================================================') + PsiWhiteSpace('\n') + GRAMMAR_PATTERN + START + PsiElement(KEYWORD_START)('start') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.set') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.book') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.divisions') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.components') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.section') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.para') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect1') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect2') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect3') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect4') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect5') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refentry') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsection') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect1') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect2') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect3') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.setindex') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db._any.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Any attribute including in any attribute in any namespace.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db._any') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Any element from almost any namespace') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(*)('*') + PsiWhiteSpace(' ') + EXCEPT_NAME_CLASS + PsiElement(-)('-') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(()('(') + NAME_CLASS_CHOICE + NAME_CLASS + NAME + PsiElement(PREFIX_STAR)('db:*') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIX_STAR)('html:*') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._any.attribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._any') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.arch.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Designates the computer or chip architecture to which the element applies') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('arch') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.audience.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Designates the intended audience to which the element applies, for example, system administrators, programmers, or new users.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('audience') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.condition.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## provides a standard place for application-specific effectivity') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('condition') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.conformance.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates standards conformance characteristics of the element') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('conformance') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.os.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates the operating system to which the element is applicable') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('os') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.revision.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates the editorial revision to which the element belongs') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('revision') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.security.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates something about the security level associated with the element to which it applies') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('security') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.userlevel.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates the level of user experience for which the element applies') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('userlevel') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.vendor.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates the computer vendor to which the element applies.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('vendor') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.wordsize.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates the word size (width in bits) of the computer architecture to which the element applies') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('wordsize') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.effectivity.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.arch.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.audience.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.condition.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.conformance.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.os.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.revision.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.security.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.userlevel.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.vendor.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.wordsize.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.endterm.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Points to the element whose content is to be used as the text of the link') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('endterm') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:IDREF') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.linkend.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Points to an internal link target by identifying the value of its xml:id attribute') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('linkend') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:IDREF') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.linkends.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Points to one or more internal link targets by identifying the value of their xml:id attributes') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('linkends') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:IDREFS') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xlink.href.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies a link target with a URI') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:href') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:anyURI') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xlink.type.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the XLink link type') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:type') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An XLink simple link') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"simple"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xlink.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the XLink role of the link') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:anyURI') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xlink.arcrole.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the XLink arcrole of the link') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:arcrole') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:anyURI') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xlink.title.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the XLink title of the link') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:title') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xlink.show.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An application traversing to the ending resource should load it in a new window, frame, pane, or other relevant presentation context.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"new"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An application traversing to the ending resource should load the resource in the same window, frame, pane, or other relevant presentation context in which the starting resource was loaded.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"replace"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An application traversing to the ending resource should load its presentation in place of the presentation of the starting resource.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"embed"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The behavior of an application traversing to the ending resource is unconstrained by XLink. The application should look for other markup present in the link to determine the appropriate behavior.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"other"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The behavior of an application traversing to the ending resource is unconstrained by this specification. No other markup is present to help the application determine the appropriate behavior.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"none"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xlink.show.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the XLink show behavior of the link') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:show') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.show.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xlink.actuate.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An application should traverse to the ending resource immediately on loading the starting resource.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"onLoad"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An application should traverse from the starting resource to the ending resource only on a post-loading event triggered for the purpose of traversal.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"onRequest"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The behavior of an application traversing to the ending resource is unconstrained by this specification. The application should look for other markup present in the link to determine the appropriate behavior.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"other"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The behavior of an application traversing to the ending resource is unconstrained by this specification. No other markup is present to help the application determine the appropriate behavior.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"none"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xlink.actuate.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the XLink actuate behavior of the link') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:actuate') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.actuate.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.href.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.href.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.type.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.arcrole.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.title.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.show.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.actuate.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xml.id.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the unique ID value of the element') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xml:id') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:ID') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.version.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the DocBook version of the element and its descendants') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('version') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xml.lang.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the natural language of the element and its descendants') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xml:lang') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xml.base.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the base URI of the element and its descendants') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xml:base') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:anyURI') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.remap.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Provides the name or similar semantic identifier assigned to the content in some previous markup scheme') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('remap') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xreflabel.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Provides the text that is to be generated for a cross reference to the element') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('xreflabel') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xrefstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies a keyword or keywords identifying additional style information') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('xrefstyle') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.revisionflag.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The element has been changed.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"changed"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The element is new (has been added to the document).') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"added"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The element has been deleted.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"deleted"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Explicitly turns off revision markup for this element.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"off"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.revisionflag.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the revision status of the element') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('revisionflag') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.revisionflag.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.dir.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Left-to-right text') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"ltr"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Right-to-left text') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"rtl"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Left-to-right override') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"lro"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Right-to-left override') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"rlo"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.dir.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the direction of text in an element') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('dir') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.dir.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.common.base.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.version.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xml.lang.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xml.base.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.remap.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xreflabel.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.revisionflag.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.dir.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.effectivity.attributes') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xml.id.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.base.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.annotations.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.common.idreq.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.xml.id.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.base.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.annotations.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + OPTIONAL + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkend.attribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.href.attributes') + PsiElement())(')') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.common.req.linking.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkend.attribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.href.attributes') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.common.data.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the format of the data') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('format') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + PsiWhiteSpace('\n ') + PsiComment(DOCUMENTATION)('## Indentifies the location of the data by URI') + PsiWhiteSpace('\n ') + CHOICE + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('fileref') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:anyURI') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Identifies the location of the data by external identifier (entity name)') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('entityref') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:ENTITY') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement())(')') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.verbatim.continuation.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Line numbering continues from the immediately preceding element with the same name.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"continues"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Line numbering restarts (begins at 1, usually).') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"restarts"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.verbatim.continuation.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Determines whether line numbering continues from the previous element or restarts.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('continuation') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.continuation.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.verbatim.linenumbering.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Lines are numbered.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"numbered"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Lines are not numbered.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"unnumbered"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.verbatim.linenumbering.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Determines whether lines are numbered.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('linenumbering') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.linenumbering.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.verbatim.startinglinenumber.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the initial line number.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('startinglinenumber') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:integer') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.verbatim.language.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the language (i.e. programming language) of the verbatim content.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('language') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.verbatim.xml.space.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Can be used to indicate explicitly that whitespace in the verbatim environment is preserved. Whitespace must always be preserved in verbatim environments whether this attribute is specified or not.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xml:space') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Whitespace must be preserved.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"preserve"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.verbatim.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.continuation.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.linenumbering.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.startinglinenumber.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.language.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.xml.space.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies an identifying string for presentation purposes') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('label') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.width.characters.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the width (in characters) of the element') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('width') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:nonNegativeInteger') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.spacing.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The spacing should be "compact".') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"compact"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The spacing should be "normal".') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"normal"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.spacing.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies (a hint about) the spacing of the content') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('spacing') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.spacing.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.pgwide.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The element should be rendered in the current text flow (with the flow column width).') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"0"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The element should be rendered across the full text page.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"1"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.pgwide.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates if the element is rendered across the column or the page') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('pgwide') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.pgwide.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.language.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the language (i.e. programming language) of the content.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('language') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.performance.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The content describes an optional step or steps.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"optional"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The content describes a required step or steps.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"required"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.performance.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies if the content is required or optional.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('performance') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.performance.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.floatstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies style information to be used when rendering the float') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('floatstyle') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.width.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the width of the element') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('width') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.depth.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the depth of the element') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('depth') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.contentwidth.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the width of the content rectangle') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('contentwidth') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.contentdepth.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the depth of the content rectangle') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('contentdepth') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.scalefit.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## False (do not scale-to-fit; anamorphic scaling may occur)') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"0"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## True (scale-to-fit; anamorphic scaling is forbidden)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"1"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.scale.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the scaling factor') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('scale') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:positiveInteger') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.halign.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Centered horizontally') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"center"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Aligned horizontally on the specified character') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"char"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Fully justified (left and right margins or edges)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"justify"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Left aligned') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"left"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Right aligned') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"right"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.valign.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Aligned on the bottom of the region') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"bottom"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Centered vertically') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"middle"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Aligned on the top of the region') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"top"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.biblio.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A document object identifier.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"doi"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An international standard book number.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"isbn"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An international standard technical report number (ISO 10444).') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"isrn"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An international standard serial number.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"issn"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A Library of Congress reference number.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"libraryofcongress"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A publication number (an internal number or possibly organizational standard).') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"pubsnumber"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A Uniform Resource Identifier') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"uri"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.biblio.class-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the kind of bibliographic identifier') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblio.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.biblio.class-other.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of the non-standard bibliographic identifier') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('otherclass') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.biblio.class-other.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the kind of bibliographic identifier') + PsiWhiteSpace('\n ') + INTERLEAVE + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates that the identifier is some 'other' kind.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"other"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblio.class-other.attribute') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.biblio.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblio.class-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblio.class-other.attributes') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.ubiq.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.inlinemediaobject') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.remark') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.superscript') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.subscript') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.link.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.alt') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.annotation') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.ubiq.inlines') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._phrase') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.replaceable') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db._title') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.title') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleabbrev') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.subtitle') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db._title.req') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.title') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleabbrev') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.subtitle') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db._title.only') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.title') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleabbrev') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db._title.onlyreq') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.title') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleabbrev') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db._info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db._title.req') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleforbidden.info') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.info') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db._title.req') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleforbidden.info') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.titlereq.info') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db._title.only') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleforbidden.info') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleonly.info') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db._info.title.onlyreq') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db._title.onlyreq') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleforbidden.info') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleonlyreq.info') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleforbidden.info') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.all.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.ubiq.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.general.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.domain.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.extension.inlines') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.general.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.publishing.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.product.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliography.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.graphic.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexing.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.link.inlines') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.domain.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.technical.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.error.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.os.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.programming.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.markup.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.gui.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keyboard.inlines') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.math.inlines') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.technical.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.replaceable') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.systemitem') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.option') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.optional') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.package') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.parameter') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.property') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.termdef') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.nonterminal') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.error.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.errorcode') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.errortext') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.errorname') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.errortype') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.oo.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.ooclass') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.ooexception') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.oointerface') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.programming.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.function') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.parameter') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.varname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.returnvalue') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.type') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.classname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.exceptionname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.interfacename') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.initializer') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.oo.inlines') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.product.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.productnumber') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.productname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.database') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.application') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.hardware') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.trademark') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.os.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.prompt') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.envar') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.filename') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.command') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.computeroutput') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.userinput') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.markup.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tag') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.markup') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.token') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.symbol') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.literal') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.code') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.constant') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.email') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.uri') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.bibliography.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.citation') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.citerefentry') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.citetitle') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.citebiblioid') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.author') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.person') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.personname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.org') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.editor') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.jobtitle') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.publishing.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.abbrev') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.acronym') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.date') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.emphasis') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.footnote') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.footnoteref') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.foreignphrase') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.phrase') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.quote') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.subscript') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.superscript') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.wordasword') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossary.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.coref') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.graphic.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.inlinemediaobject') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.indexing.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.gui.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.guiicon') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.guibutton') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.guimenuitem') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.guimenu') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.guisubmenu') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.guilabel') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.menuchoice') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.mousebutton') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.keyboard.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycombo') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycap') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycode') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keysym') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.shortcut') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.accel') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.link.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.xref') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.link') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.olink') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.anchor') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioref') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.extension.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.nopara.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.list.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.admonition.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.formal.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.informal.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.publishing.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.graphic.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.technical.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopsis.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bridgehead') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.remark') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.revhistory') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.para.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.anchor') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.para') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.formalpara') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.simpara') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.all.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.nopara.blocks') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.para.blocks') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.extension.blocks') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.annotation') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.formal.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.example') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.figure') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.table') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.equation') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.informal.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalexample') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalfigure') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.informaltable') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalequation') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.publishing.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sidebar') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.blockquote') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.address') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.epigraph') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.graphic.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.mediaobject') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.screenshot') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.technical.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.procedure') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.task') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.productionset') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.constraintdef') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgset') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.admonition.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.caution') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.important') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.note') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.tip') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.warning') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.list.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.itemizedlist') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orderedlist') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.procedure') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplelist') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.variablelist') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.segmentedlist') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.glosslist') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliolist') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.calloutlist') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandaset') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.verbatim.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.programlisting') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.screen') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.literallayout') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopsis') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.programlistingco') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.screenco') + PsiElement())(')') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.synopsis.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.cmdsynopsis') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcsynopsis') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.classsynopsis') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodsynopsis') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.constructorsynopsis') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.destructorsynopsis') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.fieldsynopsis') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.extension.blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.info.extension') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._any') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.info.elements') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.abstract') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.address') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.artpagenums') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.author') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.authorgroup') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.authorinitials') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliocoverage') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioid') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliosource') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.collab') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.confgroup') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.contractsponsor') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.contractnum') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.copyright') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.cover') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.date') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.edition') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.editor') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.issuenum') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keywordset') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.legalnotice') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.mediaobject') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.org') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.othercredit') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.pagenums') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.printhistory') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.productname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.productnumber') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.pubdate') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.publisher') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.publishername') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.releaseinfo') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.revhistory') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.seriesvolnums') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.subjectset') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.volumenum') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.info.extension') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.annotation') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.extendedlink') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliomisc') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliomset') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliorelation') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioset') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.itermset') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.bibliographic.elements') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.info.elements') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.publishing.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.citerefentry') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.citetitle') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.citebiblioid') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.person') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.personname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.subtitle') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.title') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.title.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.title.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.title.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.title') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The text of the title of a section of a document or of a formal block-level element') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('title') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.title.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titleabbrev.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titleabbrev.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleabbrev.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titleabbrev') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The abbreviation of a title') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('titleabbrev') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleabbrev.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subtitle.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subtitle.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.subtitle.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subtitle') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The subtitle of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('subtitle') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.subtitle.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.info.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.info.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.info.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for information about a component or other block') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('info') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.info.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db._title') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.info.elements') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titlereq.info.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titlereq.info.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titlereq.info.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titlereq.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for information about a component or other block with a required title') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('info') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.titlereq.info.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db._title.req') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.info.elements') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titleonly.info.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titleonly.info.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleonly.info.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titleonly.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for information about a component or other block with only a title') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('info') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleonly.info.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db._title.only') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.info.elements') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titleonlyreq.info.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titleonlyreq.info.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleonlyreq.info.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titleonlyreq.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for information about a component or other block with only a required title') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('info') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleonlyreq.info.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db._title.onlyreq') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.info.elements') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titleforbidden.info.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titleforbidden.info.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleforbidden.info.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.titleforbidden.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for information about a component or other block without a title') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('info') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.titleforbidden.info.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.info.elements') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subjectset.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subjectset.scheme.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the controlled vocabulary used by this set's terms') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('scheme') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subjectset.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.subjectset.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.subjectset.scheme.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subjectset') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A set of terms describing the subject matter of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('subjectset') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.subjectset.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.subject') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subject.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subject.weight.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies a ranking for this subject relative to other subjects in the same set') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('weight') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subject.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.subject.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.subject.weight.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subject') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## One of a group of terms describing the subject matter of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('subject') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.subject.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.subjectterm') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subjectterm.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subjectterm.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.subjectterm.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subjectterm') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A term in a group of terms describing the subject matter of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('subjectterm') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.subjectterm.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keywordset.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keywordset.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.keywordset.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keywordset') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A set of keywords describing the content of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('keywordset') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.keywordset.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.keyword') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keyword.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keyword.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.keyword.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keyword') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## One of a set of keywords describing the content of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('keyword') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.keyword.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.table.choice') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.table') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.table') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.informaltable.choice') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.informaltable') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.informaltable') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.table') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.table.choice') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.informaltable') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.informaltable.choice') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.procedure.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.procedure.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.procedure.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.procedure.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.procedure') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A list of operations to be performed in a well-defined sequence') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('procedure') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.procedure.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.procedure.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.step') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.step.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.step.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.step.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.performance.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.step.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + PsiComment(SINGLE_LINE_COMMENT)('# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # This content model is blocks*, step|stepalternatives, blocks* but') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # expressed this way it avoids UPA issues in XSD and DTD versions') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.step') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A unit of action in a procedure') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('step') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.step.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.step.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.substeps') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.stepalternatives') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement())(')') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.substeps') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.stepalternatives') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement())(')') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.stepalternatives.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.stepalternatives.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.stepalternatives.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.performance.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.stepalternatives.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.stepalternatives') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Alternative steps in a procedure') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('stepalternatives') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.stepalternatives.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.stepalternatives.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.step') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.substeps.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.substeps.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.substeps.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.performance.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.substeps') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for steps that occur within steps in a procedure') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('substeps') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.substeps.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.step') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sidebar.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sidebar.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sidebar.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sidebar.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sidebar') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A portion of a document that is isolated from the main narrative flow') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:sidebar"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:sidebar)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"sidebar must not occur in the descendants of sidebar"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('sidebar') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sidebar.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sidebar.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.abstract.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.abstract.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.abstract.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.abstract.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.abstract') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A summary') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('abstract') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.abstract.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.abstract.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.para.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.personblurb.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.personblurb.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.personblurb.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.personblurb.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.personblurb') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A short description or note about a person') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('personblurb') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.personblurb.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.personblurb.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.para.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.blockquote.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.blockquote.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.blockquote.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.blockquote.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.blockquote') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A quotation set off from the main text') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('blockquote') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.blockquote.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.blockquote.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.attribution') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.attribution.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.attribution.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.attribution.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.attribution') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The source of a block quote or epigraph') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('attribution') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.attribution.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.person') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.personname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.citetitle') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.citation') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bridgehead.renderas.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Render as a first-level section') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"sect1"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Render as a second-level section') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"sect2"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Render as a third-level section') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"sect3"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Render as a fourth-level section') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"sect4"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Render as a fifth-level section') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"sect5"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bridgehead.renderas-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates how the bridge head should be rendered') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('renderas') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bridgehead.renderas.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bridgehead.renderas-other.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of the non-standard rendering') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('otherrenderas') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bridgehead.renderas-other.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates how the bridge head should be rendered') + PsiWhiteSpace('\n ') + INTERLEAVE + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('renderas') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies a non-standard rendering') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"other"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bridgehead.renderas-other.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bridgehead.renderas.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bridgehead.renderas-enum.attribute') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bridgehead.renderas-other.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bridgehead.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bridgehead.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bridgehead.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bridgehead.renderas.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bridgehead') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A free-floating heading') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('bridgehead') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bridgehead.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.remark.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.remark.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.remark.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.remark') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A remark (or comment) intended for presentation in a draft manuscript') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('remark') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.remark.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.epigraph.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.epigraph.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.epigraph.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.epigraph.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.epigraph') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A short inscription at the beginning of a document or component') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('epigraph') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.epigraph.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.epigraph.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.attribution') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.para.blocks') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.literallayout') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.footnote.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.footnote.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the desired footnote mark') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('label') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.footnote.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.footnote.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.footnote.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.footnote') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A footnote') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:footnote)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"footnote must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:example)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"example must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:figure)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"figure must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:table)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"table must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:equation)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"equation must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:indexterm)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"indexterm must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:sidebar)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"sidebar must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:task)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"task must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnote"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:epigraph)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"epigraph must not occur in the descendants of footnote"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('footnote') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.footnote.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.formalpara.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.formalpara.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.formalpara.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.formalpara.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.onlyreq') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.formalpara') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A paragraph with a title') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('formalpara') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.formalpara.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.formalpara.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexing.inlines') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.para') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.para.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.para.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.para.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.para.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.para') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A paragraph') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:para"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('para') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.para.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.para.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.nopara.blocks') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simpara.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simpara.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.simpara.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simpara.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simpara') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A paragraph that contains only text and inline markup, no block elements') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('simpara') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simpara.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.simpara.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.admonition.contentmodel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.caution.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.caution.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.caution.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.caution') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A note of caution') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caution"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of caution"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caution"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of caution"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caution"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of caution"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caution"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of caution"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caution"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of caution"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('caution') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.caution.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.admonition.contentmodel') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.important.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.important.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.important.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.important') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An admonition set off from the text') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:important"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of important"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:important"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of important"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:important"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of important"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:important"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of important"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:important"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of important"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('important') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.important.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.admonition.contentmodel') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.note.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.note.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.note.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.note') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A message set off from the text') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:note"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of note"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:note"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of note"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:note"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of note"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:note"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of note"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:note"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of note"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('note') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.note.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.admonition.contentmodel') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tip.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tip.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tip.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tip') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A suggestion to the user, set off from the text') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:tip"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of tip"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:tip"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of tip"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:tip"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of tip"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:tip"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of tip"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:tip"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of tip"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tip') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tip.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.admonition.contentmodel') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.warning.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.warning.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.warning.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.warning') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An admonition set off from the text') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:warning"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of warning"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:warning"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of warning"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:warning"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of warning"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:warning"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of warning"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:warning"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of warning"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('warning') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.warning.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.admonition.contentmodel') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.itemizedlist.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.itemizedlist.mark.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the type of mark to be used on items in this list') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('mark') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.itemizedlist.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.itemizedlist.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.spacing.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.itemizedlist.mark.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.itemizedlist.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.itemizedlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A list in which each entry is marked with a bullet or other dingbat') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('itemizedlist') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.itemizedlist.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.itemizedlist.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.listitem') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orderedlist.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orderedlist.continuation.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies that numbering should begin where the preceding list left off') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"continues"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies that numbering should begin again at 1') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"restarts"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orderedlist.continuation.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates how list numbering should begin relative to the immediately preceding list') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('continuation') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orderedlist.continuation.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orderedlist.startingnumber.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the initial line number.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('startingnumber') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:integer') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orderedlist.inheritnum.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies that numbering should ignore list nesting') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"ignore"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies that numbering should inherit from outer-level lists') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"inherit"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orderedlist.inheritnum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates whether or not item numbering should be influenced by list nesting') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('inheritnum') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orderedlist.inheritnum.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orderedlist.numeration.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies Arabic numeration (1, 2, 3, …)') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"arabic"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies upper-case alphabetic numeration (A, B, C, …)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"upperalpha"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies lower-case alphabetic numeration (a, b, c, …)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"loweralpha"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies upper-case Roman numeration (I, II, III, …)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"upperroman"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies lower-case Roman numeration (i, ii, iii …)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"lowerroman"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orderedlist.numeration.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates the desired numeration') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('numeration') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orderedlist.numeration.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orderedlist.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.orderedlist.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.spacing.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.orderedlist.continuation.attribute') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orderedlist.startingnumber.attribute') + PsiElement())(')') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.orderedlist.inheritnum.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.orderedlist.numeration.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orderedlist.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orderedlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A list in which each entry is marked with a sequentially incremented label') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('orderedlist') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.orderedlist.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orderedlist.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.listitem') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.listitem.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.listitem.override.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the keyword for the type of mark that should be used on this') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## item, instead of the mark that would be used by default') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('override') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.listitem.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.listitem.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.listitem.override.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.listitem') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for the elements of a list item') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('listitem') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.listitem.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.segmentedlist.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.segmentedlist.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.segmentedlist.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.segmentedlist.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.segmentedlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A segmented list, a list of sets of elements') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('segmentedlist') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.segmentedlist.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.segmentedlist.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.segtitle') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seglistitem') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.segtitle.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.segtitle.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.segtitle.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.segtitle') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The title of an element of a list item in a segmented list') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('segtitle') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.segtitle.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seglistitem.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seglistitem.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.seglistitem.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seglistitem') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A list item in a segmented list') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Cardinality of segments and titles"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:seglistitem"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"count(db:seg) = count(../db:segtitle)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The number of seg elements must be the same as the number of segtitle elements in the parent segmentedlist"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('seglistitem') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seglistitem.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seg') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seg.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seg.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.seg.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seg') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An element of a list item in a segmented list') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('seg') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seg.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplelist.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplelist.type.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A tabular presentation in row-major order.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"horiz"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A tabular presentation in column-major order.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"vert"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An inline presentation, usually a comma-delimited list.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"inline"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplelist.type.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the type of list presentation.') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(PREFIXED_NAME)('a:defaultValue') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"vert"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('type') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplelist.type.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplelist.columns.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the number of columns for horizontal or vertical presentation') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('columns') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:integer') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplelist.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplelist.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplelist.type.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplelist.columns.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplelist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An undecorated list of single words or short phrases') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('simplelist') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplelist.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.member') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.member.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.member.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.member.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.member') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An element of a simple list') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('member') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.member.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.variablelist.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.variablelist.termlength.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates a length beyond which the presentation system may consider a term too long and select an alternate presentation for that term, item, or list') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('termlength') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.variablelist.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.variablelist.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.spacing.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.variablelist.termlength.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.variablelist.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.variablelist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A list in which each entry is composed of a set of one or more terms and an associated description') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('variablelist') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.variablelist.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.variablelist.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.varlistentry') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.varlistentry.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.varlistentry.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.varlistentry.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.varlistentry') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for a set of terms and the associated description in a variable list') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('varlistentry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.varlistentry.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.term') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.listitem') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.term.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.term.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.term.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.term') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The word or phrase being defined or described in a variable list') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('term') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.term.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.example.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.example.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.example.width.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.width.characters.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.example.pgwide.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.pgwide.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.example.floatstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.floatstyle.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.example.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.example.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.example.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.example.floatstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.example.width.attribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.example.pgwide.attribute') + PsiElement())(')') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.example.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.onlyreq') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.example') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A formal example, with a title') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:example"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:example)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"example must not occur in the descendants of example"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:example"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:figure)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"figure must not occur in the descendants of example"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:example"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:table)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"table must not occur in the descendants of example"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:example"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:equation)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"equation must not occur in the descendants of example"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:example"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of example"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:example"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of example"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:example"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of example"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:example"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of example"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:example"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of example"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('example') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.example.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.example.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.caption') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalexample.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalexample.width.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.width.characters.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalexample.floatstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.floatstyle.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalexample.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalexample.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalexample.floatstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalexample.width.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalexample.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalexample') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A displayed example without a title') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('informalexample') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalexample.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalexample.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.caption') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.verbatim.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.lineannotation') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.co') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.verbatim.contentmodel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.textobject') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.inlines') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.programlisting.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.programlisting.width.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.width.characters.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.programlisting.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.programlisting.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.programlisting.width.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.programlisting') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A literal listing of all or part of a program') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('programlisting') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.programlisting.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.contentmodel') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.literallayout.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.literallayout.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The literal layout should be formatted with a monospaced font') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"monospaced"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The literal layout should be formatted with the current font') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"normal"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.literallayout.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the class of literal layout') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.literallayout.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.literallayout.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.literallayout.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.literallayout.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.literallayout') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A block of text in which line breaks and white space are to be reproduced faithfully') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('literallayout') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.literallayout.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.contentmodel') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.screen.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.screen.width.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.width.characters.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.screen.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.screen.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.screen.width.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.screen') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Text that a user sees or might see on a computer screen') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('screen') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.screen.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.contentmodel') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.screenshot.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.screenshot.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.screenshot.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.screenshot.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.screenshot') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A representation of what the user sees or might see on a computer screen') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('screenshot') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.screenshot.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.screenshot.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.mediaobject') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.figure.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.figure.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.figure.pgwide.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.pgwide.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.figure.floatstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.floatstyle.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.figure.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.figure.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.figure.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.figure.pgwide.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.figure.floatstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.figure.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.onlyreq') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.figure') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A formal figure, generally an illustration, with a title') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:figure"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:example)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"example must not occur in the descendants of figure"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:figure"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:figure)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"figure must not occur in the descendants of figure"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:figure"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:table)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"table must not occur in the descendants of figure"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:figure"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:equation)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"equation must not occur in the descendants of figure"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:figure"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of figure"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:figure"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of figure"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:figure"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of figure"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:figure"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of figure"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:figure"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of figure"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('figure') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.figure.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.figure.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.caption') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalfigure.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalfigure.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalfigure.pgwide.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.pgwide.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalfigure.floatstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.floatstyle.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalfigure.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalfigure.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalfigure.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalfigure.pgwide.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalfigure.floatstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalfigure.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalfigure') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A untitled figure') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('informalfigure') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalfigure.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalfigure.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.caption') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.mediaobject.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.videoobject') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.audioobject') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imageobject') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.textobject') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imageobjectco') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.mediaobject.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.mediaobject.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.mediaobject.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.mediaobject.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.mediaobject') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A displayed media object (video, audio, image, etc.)') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('mediaobject') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.mediaobject.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.mediaobject.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.alt') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.mediaobject.content') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.caption') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.inlinemediaobject.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.inlinemediaobject.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.inlinemediaobject.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.inlinemediaobject.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.inlinemediaobject') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An inline media object (video, audio, image, and so on)') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('inlinemediaobject') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.inlinemediaobject.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.inlinemediaobject.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.alt') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.mediaobject.content') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videoobject.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videoobject.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.videoobject.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videoobject.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videoobject') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for video data and its associated meta-information') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('videoobject') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.videoobject.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.videoobject.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.audioobject.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.audioobject.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.audioobject.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.audioobject.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.audioobject') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for audio data and its associated meta-information') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('audioobject') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.audioobject.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.audioobject.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.audiodata') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.imageobject.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.mathml') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.svg') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imageobject.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imageobject.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imageobject.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imageobject.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imageobject') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for image data and its associated meta-information') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('imageobject') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.imageobject.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imageobject.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imageobject.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.textobject.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.textobject.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.textobject.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.textobject.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.textobject') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for a text description of an object and its associated meta-information') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('textobject') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.textobject.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.textobject.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.phrase') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.textdata') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.align.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.halign.enumeration') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.align.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the (horizontal) alignment of the video data') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('align') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.align.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.valign.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.valign.enumeration') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.valign.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the vertical alignment of the video data') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('valign') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.valign.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.width.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.width.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.depth.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.depth.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.contentwidth.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.contentwidth.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.contentdepth.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.contentdepth.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.scalefit.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.scalefit.enumeration') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.scalefit.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Determines if anamorphic scaling is forbidden') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('scalefit') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.scalefit.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.scale.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.scale.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.data.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.align.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.valign.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.width.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.contentwidth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.scalefit.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.scale.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.depth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.contentdepth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.videodata') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Pointer to external video data') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('videodata') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.videodata.info') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.audiodata.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.audiodata.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.audiodata.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.data.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.audiodata.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.audiodata') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Pointer to external audio data') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('audiodata') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.audiodata.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.audiodata.info') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.align.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.halign.enumeration') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.align.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the (horizontal) alignment of the image data') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('align') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.align.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.valign.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.valign.enumeration') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.valign.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the vertical alignment of the image data') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('valign') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.valign.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.width.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.width.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.depth.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.depth.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.contentwidth.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.contentwidth.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.contentdepth.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.contentdepth.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.scalefit.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.scalefit.enumeration') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.scalefit.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Determines if anamorphic scaling is forbidden') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('scalefit') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.scalefit.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.scale.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.scale.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.data.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.align.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.valign.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.width.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.contentwidth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.scalefit.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.scale.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.depth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.contentdepth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Pointer to external image data') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('imagedata') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.info') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.textdata.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.textdata.encoding.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the encoding of the text in the external file') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('encoding') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.textdata.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.textdata.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.data.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.textdata.encoding.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.textdata.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.textdata') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Pointer to external text data') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('textdata') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.textdata.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.textdata.info') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.caption.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.caption.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.caption.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.caption.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.caption') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A caption') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:example)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"example must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:figure)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"figure must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:table)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"table must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:equation)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"equation must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:sidebar)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"sidebar must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:task)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"task must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('caption') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.caption.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.caption.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.synopsis.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.synopsis.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.synopsis.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopsis.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopsis.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.synopsis') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A general-purpose element for representing the syntax of commands or functions') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('synopsis') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopsis.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.contentmodel') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cmdsynopsis.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cmdsynopsis.sepchar.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the character that should separate the command and its top-level arguments') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('sepchar') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cmdsynopsis.cmdlength.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates the displayed length of the command; this information may be used to intelligently indent command synopses which extend beyond one line') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('cmdlength') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cmdsynopsis.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cmdsynopsis.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cmdsynopsis.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cmdsynopsis.sepchar.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cmdsynopsis.cmdlength.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cmdsynopsis.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cmdsynopsis.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cmdsynopsis') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A syntax summary for a software command') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('cmdsynopsis') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.cmdsynopsis.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.cmdsynopsis.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.command') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.arg') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.group') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sbr') + PsiElement())(')') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopfragment') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.rep.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Can not be repeated.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"norepeat"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Can be repeated.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"repeat"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.rep.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates whether or not repetition is possible.') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(PREFIXED_NAME)('a:defaultValue') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"norepeat"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace(' ') + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('rep') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.rep.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.choice.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Formatted to indicate that it is optional.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"opt"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Formatted without indication.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"plain"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Formatted to indicate that it is required.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"req"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.choice.opt.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates optionality.') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(PREFIXED_NAME)('a:defaultValue') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"opt"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace(' ') + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('choice') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.choice.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.choice.req.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates optionality.') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(PREFIXED_NAME)('a:defaultValue') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"req"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace(' ') + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('choice') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.choice.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.arg.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.arg.rep.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.rep.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.arg.choice.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.choice.opt.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.arg.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.arg.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.arg.rep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.arg.choice.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.arg') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An argument in a CmdSynopsis') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('arg') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.arg.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.arg') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.group') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.option') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopfragmentref') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sbr') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.group.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.group.rep.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.rep.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.group.choice.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.choice.opt.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.group.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.group.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.group.rep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.group.choice.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.group') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A group of elements in a CmdSynopsis') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('group') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.group.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.arg') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.group') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.option') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopfragmentref') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.replaceable') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sbr') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sbr.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sbr.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sbr.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sbr') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An explicit line break in a command synopsis') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('sbr') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sbr.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.synopfragment.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.synopfragment.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopfragment.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.synopfragment') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A portion of a CmdSynopsis broken out from the main body of the synopsis') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('synopfragment') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopfragment.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.arg') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.group') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.synopfragmentref.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.synopfragmentref.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopfragmentref.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkend.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.synopfragmentref') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A reference to a fragment of a command synopsis') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Synopsis fragment type constraint"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:synopfragmentref"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"local-name(//*[@xml:id=current()/@linkend]) = 'synopfragment' and namespace-uri(//*[@xml:id=current()/@linkend]) = 'http://docbook.org/ns/docbook'"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"@linkend on synopfragmentref must point to a synopfragment."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('synopfragmentref') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopfragmentref.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcsynopsis.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcsynopsis.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcsynopsis.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.language.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcsynopsis.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcsynopsis') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The syntax summary for a function definition') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('funcsynopsis') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcsynopsis.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcsynopsis.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcsynopsisinfo') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcprototype') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcsynopsisinfo.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcsynopsisinfo.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcsynopsisinfo.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcsynopsisinfo') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Information supplementing the FuncDefs of a FuncSynopsis') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('funcsynopsisinfo') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcsynopsisinfo.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.contentmodel') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcprototype.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcprototype.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcprototype.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcprototype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The prototype of a function') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('funcprototype') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcprototype.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcdef') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.void') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.varargs') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.paramdef') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.varargs') + PsiElement(?)('?') + PsiElement())(')') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcdef.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcdef.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcdef.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcdef') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A function (subroutine) name and its return type') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('funcdef') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcdef.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.type') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.function') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.void.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.void.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.void.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.void') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An empty element in a function synopsis indicating that the function in question takes no arguments') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('void') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.void.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.varargs.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.varargs.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.varargs.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.varargs') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An empty element in a function synopsis indicating a variable number of arguments') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('varargs') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.varargs.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.paramdef.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.paramdef.choice.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Formatted to indicate that it is optional.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"opt"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Formatted to indicate that it is required.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"req"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.paramdef.choice.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates optionality.') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(PREFIXED_NAME)('a:defaultValue') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"opt"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('choice') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.paramdef.choice.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.paramdef.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.paramdef.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.paramdef.choice.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.paramdef') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Information about a function parameter in a programming language') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('paramdef') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.paramdef.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.initializer') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.type') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.parameter') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcparams') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcparams.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcparams.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcparams.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.funcparams') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Parameters for a function referenced through a function pointer in a synopsis') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('funcparams') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcparams.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.classsynopsis.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.classsynopsis.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## This is the synopsis of a class') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"class"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## This is the synopsis of an interface') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"interface"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.classsynopsis.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the nature of the synopsis') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.classsynopsis.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.classsynopsis.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.classsynopsis.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.language.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.classsynopsis.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.classsynopsis') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The syntax summary for a class definition') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('classsynopsis') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.classsynopsis.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.oo.inlines') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.classsynopsisinfo') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodsynopsis') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.constructorsynopsis') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.destructorsynopsis') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.fieldsynopsis') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.classsynopsisinfo.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.classsynopsisinfo.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.classsynopsisinfo.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.classsynopsisinfo') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Information supplementing the contents of a ClassSynopsis') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('classsynopsisinfo') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.classsynopsisinfo.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.contentmodel') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.ooclass.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.ooclass.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.ooclass.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.ooclass') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A class in an object-oriented programming language') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('ooclass') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.ooclass.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.package') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement())(')') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.classname') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.oointerface.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.oointerface.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.oointerface.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.oointerface') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An interface in an object-oriented programming language') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('oointerface') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.oointerface.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.package') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement())(')') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.interfacename') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.ooexception.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.ooexception.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.ooexception.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.ooexception') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An exception in an object-oriented programming language') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('ooexception') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.ooexception.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.package') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement())(')') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.exceptionname') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.modifier.xml.space.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Can be used to indicate that whitespace in the modifier should be preserved (for multi-line annotations, for example).') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xml:space') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Extra whitespace and line breaks must be preserved.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiComment(SINGLE_LINE_COMMENT)('# Ideally the definition of xml:space used on modifier would be') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # different from the definition used on the verbatim elements. The') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # verbatim elements forbid the use of xml:space="default" which') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # wouldn't be a problem on modifier. But doing that causes the') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # generated XSD schemas to be broken so I'm just reusing the existing') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # definition for now. It won't be backwards incompatible to fix this') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # problem in the future.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # | ## Extra whitespace and line breaks are not preserved.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # "default"') + PsiWhiteSpace('\n \n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"preserve"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.modifier.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.modifier.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier.xml.space.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.modifier') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Modifiers in a synopsis') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('modifier') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.interfacename.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.interfacename.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.interfacename.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.interfacename') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of an interface') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('interfacename') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.interfacename.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.exceptionname.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.exceptionname.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.exceptionname.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.exceptionname') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of an exception') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('exceptionname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.exceptionname.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.fieldsynopsis.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.fieldsynopsis.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.fieldsynopsis.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.language.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.fieldsynopsis') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a field in a class definition') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('fieldsynopsis') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.fieldsynopsis.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.type') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.varname') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.initializer') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.initializer.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.initializer.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.initializer.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.initializer') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The initializer for a FieldSynopsis') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('initializer') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.initializer.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constructorsynopsis.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constructorsynopsis.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.constructorsynopsis.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.language.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constructorsynopsis') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A syntax summary for a constructor') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('constructorsynopsis') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.constructorsynopsis.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodname') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodparam') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.void') + PsiElement(?)('?') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.exceptionname') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.destructorsynopsis.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.destructorsynopsis.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.destructorsynopsis.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.language.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.destructorsynopsis') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A syntax summary for a destructor') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('destructorsynopsis') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.destructorsynopsis.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodname') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodparam') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.void') + PsiElement(?)('?') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.exceptionname') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.methodsynopsis.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.methodsynopsis.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodsynopsis.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.language.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.methodsynopsis') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A syntax summary for a method') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('methodsynopsis') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodsynopsis.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.type') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.void') + PsiElement())(')') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodname') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodparam') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.void') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.exceptionname') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.methodname.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.methodname.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodname.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.methodname') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a method') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('methodname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodname.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.methodparam.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.methodparam.rep.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.rep.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.methodparam.choice.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.choice.req.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.methodparam.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodparam.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodparam.rep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodparam.choice.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.methodparam') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Parameters to a method') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('methodparam') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.methodparam.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.type') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.parameter') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.initializer') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.funcparams') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.modifier') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.address.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.address.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.address.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.address') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A real-world address, generally a postal address') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('address') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.address.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.personname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.pob') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.street') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.city') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.state') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.postcode') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.country') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.phone') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.fax') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.email') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.otheraddr') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.street.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.street.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.street.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.street') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A street address in an address') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('street') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.street.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.pob.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.pob.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.pob.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.pob') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A post office box in an address') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('pob') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.pob.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.postcode.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.postcode.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.postcode.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.postcode') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A postal code in an address') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('postcode') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.postcode.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.city.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.city.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.city.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.city') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a city in an address') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('city') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.city.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.state.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.state.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.state.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.state') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A state or province in an address') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('state') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.state.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.country.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.country.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.country.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.country') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a country') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('country') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.country.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.phone.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.phone.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.phone.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.phone') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A telephone number') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('phone') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.phone.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.fax.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.fax.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.fax.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.fax') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A fax number') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('fax') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.fax.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.otheraddr.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.otheraddr.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.otheraddr.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.otheraddr') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Uncategorized information in address') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('otheraddr') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.otheraddr.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.affiliation.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.affiliation.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.affiliation.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.affiliation') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The institutional affiliation of an individual') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('affiliation') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.affiliation.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.shortaffil') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.jobtitle') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.org') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgname') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgdiv') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.address') + PsiElement(*)('*') + PsiElement())(')') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.shortaffil.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.shortaffil.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.shortaffil.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.shortaffil') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A brief description of an affiliation') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('shortaffil') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.shortaffil.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.jobtitle.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.jobtitle.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.jobtitle.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.jobtitle') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The title of an individual in an organization') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('jobtitle') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.jobtitle.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orgname.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A consortium') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"consortium"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A corporation') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"corporation"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An informal organization') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"informal"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A non-profit organization') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"nonprofit"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orgname.class-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the nature of the organization') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgname.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orgname.class-other.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the nature of the organization') + PsiWhiteSpace('\n ') + SEQUENCE + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates a non-standard organization class') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"other"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(,)(',') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the non-standard nature of the organization') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('otherclass') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orgname.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgname.class-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgname.class-other.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orgname.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orgname.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgname.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgname.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orgname') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of an organization other than a corporation ') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('orgname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgname.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orgdiv.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orgdiv.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgdiv.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.orgdiv') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A division of an organization') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('orgdiv') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgdiv.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.artpagenums.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.artpagenums.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.artpagenums.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.artpagenums') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The page numbers of an article as published') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('artpagenums') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.artpagenums.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.personname.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.personname.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.personname.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.personname') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The personal name of an individual') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('personname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.personname.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.honorific') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.firstname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.surname') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.lineage') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.othername') + PsiElement())(')') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.person.author.contentmodel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.personname') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.personblurb') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.affiliation') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.email') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.address') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.contrib') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.org.author.contentmodel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgname') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgdiv') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.affiliation') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.email') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.address') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.contrib') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.credit.contentmodel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.person.author.contentmodel') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.org.author.contentmodel') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.author.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.author.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.author.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.author') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of an individual author') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('author') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.author.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.credit.contentmodel') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.authorgroup.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.authorgroup.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.authorgroup.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.authorgroup') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Wrapper for author information when a document has multiple authors or collabarators') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('authorgroup') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.authorgroup.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.author') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.editor') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.othercredit') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.collab.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.collab.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.collab.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.collab') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies a collaborator') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('collab') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.collab.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.person') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.personname') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.org') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgname') + PsiElement())(')') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.affiliation') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.authorinitials.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.authorinitials.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.authorinitials.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.authorinitials') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The initials or other short identifier for an author') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('authorinitials') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.authorinitials.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.person.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.person.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.person.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.person') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A person and associated metadata') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('person') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.person.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.personname') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.address') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.affiliation') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.email') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.personblurb') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.org.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.org.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.org.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.org') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An organization and associated metadata') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('org') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.org.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgname') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.address') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.affiliation') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.email') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.orgdiv') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.confgroup.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.confgroup.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.confgroup.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.confgroup') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for document meta-information about a conference') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('confgroup') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.confgroup.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.confdates') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.conftitle') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.confnum') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.confsponsor') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.address') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.confdates.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.confdates.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.confdates.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.confdates') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The dates of a conference for which a document was written') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('confdates') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.confdates.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.conftitle.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.conftitle.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.conftitle.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.conftitle') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The title of a conference for which a document was written') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('conftitle') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.conftitle.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.confnum.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.confnum.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.confnum.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.confnum') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An identifier, frequently numerical, associated with a conference for which a document was written') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('confnum') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.confnum.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.confsponsor.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.confsponsor.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.confsponsor.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.confsponsor') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The sponsor of a conference for which a document was written') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('confsponsor') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.confsponsor.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.contractnum.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.contractnum.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.contractnum.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.contractnum') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The contract number of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('contractnum') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.contractnum.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.contractsponsor.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.contractsponsor.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.contractsponsor.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.contractsponsor') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The sponsor of a contract') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('contractsponsor') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.contractsponsor.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.copyright.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.copyright.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.copyright.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.copyright') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Copyright information about a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('copyright') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.copyright.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.year') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.holder') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.year.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.year.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.year.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.year') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The year of publication of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('year') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.year.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.holder.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.holder.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.holder.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.holder') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of the individual or organization that holds a copyright') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('holder') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.holder.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.cover.contentmodel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.para.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.extension.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.list.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.informal.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.publishing.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.graphic.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.technical.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.verbatim.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bridgehead') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.synopsis.blocks') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.remark') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.revhistory') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cover.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cover.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cover.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cover') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Additional content for the cover of a publication') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('cover') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.cover.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.cover.contentmodel') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.date.contentmodel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:date') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:dateTime') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:gYearMonth') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:gYear') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.date.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.date.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.date.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.date') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The date of publication or revision of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('date') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.date.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.date.contentmodel') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.edition.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.edition.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.edition.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.edition') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name or number of an edition of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('edition') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.edition.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.editor.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.editor.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.editor.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.editor') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of the editor of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('editor') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.editor.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.credit.contentmodel') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioid.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioid.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioid.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblio.class.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioid') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An identifier for a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('biblioid') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioid.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citebiblioid.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citebiblioid.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.citebiblioid.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblio.class.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citebiblioid') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A citation of a bibliographic identifier') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('citebiblioid') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.citebiblioid.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliosource.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliosource.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliosource.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblio.class.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliosource') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The source of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('bibliosource') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliosource.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliorelation.type.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The described resource pre-existed the referenced resource, which is essentially the same intellectual content presented in another format') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"hasformat"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The described resource includes the referenced resource either physically or logically') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"haspart"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The described resource has a version, edition, or adaptation, namely, the referenced resource') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"hasversion"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The described resource is the same intellectual content of the referenced resource, but presented in another format') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"isformatof"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The described resource is a physical or logical part of the referenced resource') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"ispartof"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The described resource is referenced, cited, or otherwise pointed to by the referenced resource') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"isreferencedby"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The described resource is supplanted, displaced, or superceded by the referenced resource') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"isreplacedby"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The described resource is required by the referenced resource, either physically or logically') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"isrequiredby"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The described resource is a version, edition, or adaptation of the referenced resource; changes in version imply substantive changes in content rather than differences in format') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"isversionof"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The described resource references, cites, or otherwise points to the referenced resource') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"references"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The described resource supplants, displaces, or supersedes the referenced resource') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"replaces"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The described resource requires the referenced resource to support its function, delivery, or coherence of content') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"requires"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliorelation.type-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the type of relationship') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('type') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliorelation.type.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliorelation.type-other.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the type of relationship') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('type') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The described resource has a non-standard relationship with the referenced resource') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"othertype"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A keyword that identififes the type of the non-standard relationship') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('othertype') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliorelation.type.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliorelation.type-enum.attribute') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliorelation.type-other.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliorelation.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliorelation.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliorelation.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblio.class.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliorelation.type.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliorelation') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The relationship of a document to another') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('bibliorelation') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliorelation.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliocoverage.spacial.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The DCMI Point identifies a point in space using its geographic coordinates') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"dcmipoint"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## ISO 3166 Codes for the representation of names of countries') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"iso3166"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The DCMI Box identifies a region of space using its geographic limits') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"dcmibox"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The Getty Thesaurus of Geographic Names') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"tgn"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliocoverage.spatial-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the type of spatial coverage') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('spatial') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliocoverage.spacial.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliocoverage.spatial-other.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the type of spatial coverage') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('spatial') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies a non-standard type of coverage') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"otherspatial"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A keyword that identifies the type of non-standard coverage') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('otherspatial') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliocoverage.spatial.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliocoverage.spatial-enum.attribute') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliocoverage.spatial-other.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliocoverage.temporal.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A specification of the limits of a time interval') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"dcmiperiod"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## W3C Encoding rules for dates and times—a profile based on ISO 8601') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"w3c-dtf"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliocoverage.temporal-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the type of temporal coverage') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('temporal') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliocoverage.temporal.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliocoverage.temporal-other.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the type of temporal coverage') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('temporal') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies a non-standard type of coverage') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"othertemporal"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A keyword that identifies the type of non-standard coverage') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('othertemporal') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliocoverage.temporal.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliocoverage.temporal-enum.attribute') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliocoverage.temporal-other.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliocoverage.coverage.attrib') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliocoverage.spatial.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliocoverage.temporal.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliocoverage.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliocoverage.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliocoverage.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliocoverage.coverage.attrib') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliocoverage') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The spatial or temporal coverage of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('bibliocoverage') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliocoverage.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.legalnotice.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.legalnotice.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.legalnotice.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.legalnotice.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.legalnotice') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A statement of legal obligations or requirements') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('legalnotice') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.legalnotice.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.legalnotice.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.othercredit.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A copy editor') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"copyeditor"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A graphic designer') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"graphicdesigner"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Some other contributor') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"other"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A production editor') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"productioneditor"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A technical editor') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"technicaleditor"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A translator') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"translator"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.othercredit.class-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of the contributor') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.othercredit.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.othercredit.class-other.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of the non-standard contribution') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('otherclass') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.othercredit.class-other.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of the contributor') + PsiWhiteSpace('\n ') + INTERLEAVE + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies a non-standard contribution') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"other"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.othercredit.class-other.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.othercredit.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.othercredit.class-enum.attribute') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.othercredit.class-other.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.othercredit.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.othercredit.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.othercredit.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.othercredit.class.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.othercredit') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A person or entity, other than an author or editor, credited in a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('othercredit') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.othercredit.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.credit.contentmodel') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.pagenums.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.pagenums.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.pagenums.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.pagenums') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The numbers of the pages in a book, for use in a bibliographic entry') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('pagenums') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.pagenums.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.contrib.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.contrib.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.contrib.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.contrib') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A summary of the contributions made to a document by a credited source') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('contrib') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.contrib.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.honorific.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.honorific.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.honorific.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.honorific') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The title of a person') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('honorific') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.honorific.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.firstname.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.firstname.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.firstname.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.firstname') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The first name of a person') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('firstname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.firstname.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.surname.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.surname.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.surname.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.surname') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A family name; in western cultures the last name') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('surname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.surname.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.lineage.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.lineage.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.lineage.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.lineage') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The portion of a person's name indicating a relationship to ancestors') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('lineage') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.lineage.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.othername.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.othername.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.othername.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.othername') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A component of a persons name that is not a first name, surname, or lineage') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('othername') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.othername.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.printhistory.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.printhistory.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.printhistory.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.printhistory') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The printing history of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('printhistory') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.printhistory.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.para.blocks') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productname.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productname.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A name with a copyright') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"copyright"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A name with a registered copyright') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"registered"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A name of a service') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"service"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A name which is trademarked') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"trade"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productname.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the class of product name') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.productname.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productname.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.productname.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.productname.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productname') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The formal name of a product') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('productname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.productname.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productnumber.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productnumber.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.productnumber.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productnumber') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A number assigned to a product') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('productnumber') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.productnumber.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.pubdate.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.pubdate.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.pubdate.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.pubdate') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The date of publication of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('pubdate') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.pubdate.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.date.contentmodel') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.publisher.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.publisher.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.publisher.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.publisher') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The publisher of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('publisher') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.publisher.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.publishername') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.address') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.publishername.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.publishername.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.publishername.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.publishername') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of the publisher of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('publishername') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.publishername.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.releaseinfo.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.releaseinfo.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.releaseinfo.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.releaseinfo') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Information about a particular release of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('releaseinfo') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.releaseinfo.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revhistory.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revhistory.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.revhistory.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revhistory.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revhistory') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A history of the revisions to a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('revhistory') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.revhistory.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.revhistory.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.revision') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revision.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revision.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.revision.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revision') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An entry describing a single revision in the history of the revisions to a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('revision') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.revision.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.revnumber') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.date') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.authorinitials') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.author') + PsiElement())(')') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.revremark') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.revdescription') + PsiElement())(')') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revnumber.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revnumber.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.revnumber.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revnumber') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A document revision number') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('revnumber') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.revnumber.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revremark.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revremark.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.revremark.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revremark') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A description of a revision to a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('revremark') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.revremark.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revdescription.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revdescription.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.revdescription.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.revdescription') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A extended description of a revision to a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('revdescription') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.revdescription.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seriesvolnums.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seriesvolnums.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.seriesvolnums.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seriesvolnums') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Numbers of the volumes in a series of books') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('seriesvolnums') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seriesvolnums.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.volumenum.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.volumenum.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.volumenum.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.volumenum') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The volume number of a document in a set (as of books in a set or articles in a journal)') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('volumenum') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.volumenum.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.issuenum.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.issuenum.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.issuenum.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.issuenum') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The number of an issue of a journal') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('issuenum') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.issuenum.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.accel.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.accel.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.accel.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.accel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A graphical user interface (GUI) keyboard shortcut') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('accel') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.accel.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.application.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A hardware application') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"hardware"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A software application') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"software"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.application.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the class of application') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.application.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.application.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.application.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.application.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.application.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.application') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a software program') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('application') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.application.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.package.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.package.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.package.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.package') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A software or application package') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('package') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.package.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.classname.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.classname.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.classname.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.classname') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a class, in the object-oriented programming sense') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('classname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.classname.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.command.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.command.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.command.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.command') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of an executable program or other software command') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('command') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.command.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.computeroutput.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.ubiq.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.os.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.technical.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.markup.inlines') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.co') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.computeroutput.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.computeroutput.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.computeroutput.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.computeroutput') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Data, generally text, displayed or presented by a computer') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('computeroutput') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.computeroutput.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.computeroutput.inlines') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.database.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An alternate or secondary key') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"altkey"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A constraint') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"constraint"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A data type') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"datatype"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A field') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"field"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A foreign key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"foreignkey"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A group') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"group"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An index') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"index"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The first or primary key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"key1"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An alternate or secondary key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"key2"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A name') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"name"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The primary key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"primarykey"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A (stored) procedure') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"procedure"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A record') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"record"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A rule') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"rule"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The secondary key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"secondarykey"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A table') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"table"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A user') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"user"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A view') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"view"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.database.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the class of database artifact') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.database.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.database.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.database.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.database.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.database.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.database') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a database, or part of a database') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('database') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.database.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.email.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.email.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.email.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.email') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An email address') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('email') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.email.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.envar.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.envar.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.envar.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.envar') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A software environment variable') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('envar') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.envar.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.errorcode.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.errorcode.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.errorcode.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.errorcode') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An error code') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('errorcode') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.errorcode.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.errorname.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.errorname.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.errorname.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.errorname') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An error name') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('errorname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.errorname.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.errortext.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.errortext.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.errortext.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.errortext') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An error message.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('errortext') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.errortext.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.errortype.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.errortype.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.errortype.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.errortype') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The classification of an error message') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('errortype') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.errortype.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.filename.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A device') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"devicefile"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A directory') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"directory"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A filename extension') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"extension"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A header file (as for a programming language)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"headerfile"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A library file') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"libraryfile"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A partition (as of a hard disk)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"partition"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A symbolic link') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"symlink"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.filename.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the class of filename') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.filename.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.filename.path.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the path of the filename') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('path') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.filename.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.filename.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.filename.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.filename.path.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.filename.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.filename') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a file') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('filename') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.filename.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.function.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.function.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.function.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.function') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a function or subroutine, as in a programming language') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('function') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.function.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guibutton.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guibutton.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.guibutton.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guibutton') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The text on a button in a GUI') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('guibutton') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.guibutton.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.accel') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.superscript') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.subscript') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guiicon.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guiicon.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.guiicon.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guiicon') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Graphic and/or text appearing as a icon in a GUI') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('guiicon') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.guiicon.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.accel') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.superscript') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.subscript') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guilabel.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guilabel.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.guilabel.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guilabel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The text of a label in a GUI') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('guilabel') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.guilabel.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.accel') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.superscript') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.subscript') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guimenu.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guimenu.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.guimenu.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guimenu') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a menu in a GUI') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('guimenu') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.guimenu.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.accel') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.superscript') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.subscript') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guimenuitem.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guimenuitem.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.guimenuitem.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guimenuitem') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a terminal menu item in a GUI') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('guimenuitem') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.guimenuitem.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.accel') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.superscript') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.subscript') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guisubmenu.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guisubmenu.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.guisubmenu.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.guisubmenu') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a submenu in a GUI') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('guisubmenu') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.guisubmenu.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.accel') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.superscript') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.subscript') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.hardware.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.hardware.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.hardware.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.hardware') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A physical part of a computer system') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('hardware') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.hardware.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycap.function.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The "Alt" key') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"alt"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "Backspace" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"backspace"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "Command" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"command"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "Control" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"control"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "Delete" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"delete"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The down arrow') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"down"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "End" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"end"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "Enter" or "Return" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"enter"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "Escape" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"escape"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "Home" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"home"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "Insert" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"insert"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The left arrow') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"left"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "Meta" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"meta"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "Option" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"option"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The page down key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"pagedown"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The page up key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"pageup"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The right arrow') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"right"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "Shift" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"shift"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The spacebar') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"space"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The "Tab" key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"tab"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The up arrow') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"up"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycap.function-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the function key') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('function') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycap.function.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycap.function-other.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the function key') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('function') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates a non-standard function key') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"other"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies a keyword that identifies the non-standard key') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('otherfunction') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycap.function.attrib') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycap.function-enum.attribute') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycap.function-other.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycap.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycap.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycap.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycap.function.attrib') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycap') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The text printed on a key on a keyboard') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('keycap') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycap.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycode.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycode.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycode.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycode') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The internal, frequently numeric, identifier for a key on a keyboard') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('keycode') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycode.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycombo.action.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A (single) mouse click.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"click"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A double mouse click.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"double-click"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A mouse or key press.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"press"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Sequential clicks or presses.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"seq"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Simultaneous clicks or presses.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"simul"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycombo.action-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of the action taken. If keycombo') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## contains more than one element, simul') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## is the default, otherwise there is no default.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('action') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycombo.action.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycombo.action-other.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of the action taken') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('action') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates a non-standard action') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"other"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the non-standard action in some unspecified way.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('otheraction') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycombo.action.attrib') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycombo.action-enum.attribute') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycombo.action-other.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycombo.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycombo.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycombo.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycombo.action.attrib') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keycombo') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A combination of input actions') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('keycombo') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycombo.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycap') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycombo') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keysym') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.mousebutton') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keysym.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keysym.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.keysym.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.keysym') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The symbolic name of a key on a keyboard') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('keysym') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.keysym.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.lineannotation.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.lineannotation.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.lineannotation.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.lineannotation') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A comment on a line in a verbatim listing') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('lineannotation') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.lineannotation.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.literal.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.literal.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.literal.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.literal') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Inline text that is some literal value') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('literal') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.literal.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('code.language.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the (computer) language of the code fragment') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('language') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.code.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.code.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.code.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('code.language.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.code') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An inline code fragment') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('code') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.code.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.programming.inlines') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constant.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the class of constant') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The value is a limit of some kind') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"limit"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constant.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constant.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.constant.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.constant.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constant') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A programming or system constant') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('constant') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.constant.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.varname.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.varname.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.varname.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.varname') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of a variable') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('varname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.varname.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.markup.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.markup.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.markup.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.markup') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A string of formatting markup in text that is to be represented literally') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('markup') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.markup.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.menuchoice.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.menuchoice.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.menuchoice.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.menuchoice') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A selection or series of selections from a menu') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('menuchoice') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.menuchoice.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.shortcut') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.guibutton') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.guiicon') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.guilabel') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.guimenu') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.guimenuitem') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.guisubmenu') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.shortcut.action.attrib') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycombo.action.attrib') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.shortcut.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.shortcut.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.shortcut.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.shortcut.action.attrib') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.shortcut') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A key combination for an action that is also accessible through a menu') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('shortcut') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.shortcut.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycap') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keycombo') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.keysym') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.mousebutton') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.mousebutton.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.mousebutton.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.mousebutton.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.mousebutton') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The conventional name of a mouse button') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('mousebutton') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.mousebutton.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.option.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.option.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.option.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.option') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An option for a software command') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('option') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.option.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.optional.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.optional.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.optional.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.optional') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Optional information') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('optional') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.optional.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.property.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.property.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.property.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.property') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A unit of data associated with some part of a computer system') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('property') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.property.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.parameter.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A command') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"command"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A function') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"function"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An option') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"option"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.parameter.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the class of parameter') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.parameter.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.parameter.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.parameter.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.parameter.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.parameter.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.parameter') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A value or a symbolic reference to a value') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('parameter') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.parameter.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.prompt.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.co') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.prompt.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.prompt.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.prompt.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.prompt') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A character or string indicating the start of an input field in a computer display') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('prompt') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.prompt.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.prompt.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.replaceable.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.co') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.replaceable.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A command') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"command"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A function') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"function"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An option') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"option"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A parameter') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"parameter"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.replaceable.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of the replaceable text') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.replaceable.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.replaceable.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.replaceable.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.replaceable.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.replaceable.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.replaceable') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Content that may or must be replaced by the user') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('replaceable') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.replaceable.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.replaceable.inlines') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.returnvalue.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.returnvalue.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.returnvalue.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.returnvalue') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The value returned by a function') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('returnvalue') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.returnvalue.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tag.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tag.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An attribute') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"attribute"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An attribute value') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"attvalue"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An element') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"element"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An empty element tag') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"emptytag"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An end tag') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"endtag"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A general entity') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"genentity"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The local name part of a qualified name') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"localname"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A namespace') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"namespace"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A numeric character reference') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"numcharref"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A parameter entity') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"paramentity"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A processing instruction') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"pi"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The prefix part of a qualified name') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"prefix"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An SGML comment') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"comment"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A start tag') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"starttag"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An XML processing instruction') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"xmlpi"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tag.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of the tag content') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.tag.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tag.namespace.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the namespace of the tag content') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:anyURI') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tag.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tag.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tag.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tag.namespace.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tag') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A component of XML (or SGML) markup') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tag') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tag.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.symbol.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the class of symbol') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The value is a limit of some kind') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"limit"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.symbol.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.symbol.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.symbol.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.symbol.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.symbol') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A name that is replaced by a value before processing') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('symbol') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.symbol.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.systemitem.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.co') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.systemitem.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A daemon or other system process (syslogd)') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"daemon"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A domain name (example.com)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"domainname"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An ethernet address (00:05:4E:49:FD:8E)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"etheraddress"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An event of some sort (SIGHUP)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"event"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An event handler of some sort (hangup)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"eventhandler"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A filesystem (ext3)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"filesystem"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A fully qualified domain name (my.example.com)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"fqdomainname"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A group name (wheel)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"groupname"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An IP address (127.0.0.1)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"ipaddress"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A library (libncurses)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"library"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A macro') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"macro"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A netmask (255.255.255.192)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"netmask"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A newsgroup (comp.text.xml)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"newsgroup"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An operating system name (Hurd)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"osname"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A process (gnome-cups-icon)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"process"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A protocol (ftp)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"protocol"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A resource') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"resource"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A server (mail.example.com)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"server"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A service (ppp)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"service"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A system name (hephaistos)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"systemname"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A user name (ndw)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"username"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.systemitem.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of the system item') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.systemitem.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.systemitem.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.systemitem.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.systemitem.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.systemitem.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.systemitem') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A system-related item or term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('systemitem') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.systemitem.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.systemitem.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.uri.type.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the type of URI specified') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('type') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.uri.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.uri.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.uri.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.uri.type.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.uri') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A Uniform Resource Identifier') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('uri') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.uri.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.token.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.token.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.token.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.token') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A unit of information') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(KEYWORD_TOKEN)('token') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.token.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.type.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.type.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.type.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.type') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The classification of a value') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('type') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.type.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.userinput.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.ubiq.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.os.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.technical.inlines') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.markup.inlines') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.co') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.userinput.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.userinput.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.userinput.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.userinput') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Data entered by the user') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('userinput') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.userinput.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.userinput.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.abbrev.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.abbrev.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.abbrev.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.abbrev') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An abbreviation, especially one followed by a period') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('abbrev') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.abbrev.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.superscript') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.subscript') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.trademark') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.acronym.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.acronym.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.acronym.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.acronym') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An often pronounceable word made from the initial (or selected) letters of a name or phrase') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('acronym') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.acronym.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.superscript') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.subscript') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.trademark') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citation.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citation.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.citation.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citation') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An inline bibliographic reference to another published work') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('citation') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.citation.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citerefentry.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citerefentry.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.citerefentry.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citerefentry') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A citation to a reference page') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('citerefentry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.citerefentry.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refentrytitle') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.manvolnum') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refentrytitle.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refentrytitle.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refentrytitle.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refentrytitle') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The title of a reference page') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refentrytitle') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refentrytitle.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.manvolnum.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.manvolnum.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.manvolnum.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.manvolnum') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A reference volume number') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('manvolnum') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.manvolnum.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citetitle.pubwork.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An article') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"article"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A bulletin board system') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"bbs"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A book') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"book"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A CD-ROM') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"cdrom"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A chapter (as of a book)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"chapter"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A DVD') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"dvd"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An email message') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"emailmessage"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A gopher page') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"gopher"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A journal') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"journal"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A manuscript') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"manuscript"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A posting to a newsgroup') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"newsposting"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A part (as of a book)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"part"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A reference entry') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"refentry"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A section (as of a book or article)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"section"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A series') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"series"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A set (as of books)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"set"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A web page') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"webpage"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A wiki page') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"wiki"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citetitle.pubwork.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of the publication being cited') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('pubwork') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.citetitle.pubwork.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citetitle.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citetitle.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.citetitle.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.citetitle.pubwork.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.citetitle') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The title of a cited work') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('citetitle') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.citetitle.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.emphasis.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.emphasis.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.emphasis.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.emphasis') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Emphasized text') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('emphasis') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.emphasis.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db._emphasis') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A limited span of emphasized text') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('emphasis') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.emphasis.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._emphasis') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.foreignphrase.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.foreignphrase.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.foreignphrase.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.foreignphrase') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A word or phrase in a language other than the primary language of the document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('foreignphrase') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.foreignphrase.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.general.inlines') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.phrase.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.phrase.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.phrase.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.phrase') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A span of text') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('phrase') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.phrase.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db._phrase') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A limited span of text') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('phrase') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.phrase.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.quote.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.quote.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.quote.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.quote') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An inline quotation') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('quote') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.quote.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subscript.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subscript.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.subscript.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.subscript') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A subscript (as in H2') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## O, the molecular formula for water)') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('subscript') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.subscript.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.superscript.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.superscript.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.superscript.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.superscript') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A superscript (as in x^2, the mathematical notation for x multiplied by itself)') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('superscript') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.superscript.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.trademark.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A copyright') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"copyright"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A registered copyright') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"registered"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A service') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"service"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A trademark') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"trade"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.trademark.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the class of trade mark') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.trademark.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.trademark.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.trademark.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.trademark.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.trademark.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.trademark') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A trademark') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('trademark') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.trademark.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.wordasword.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.wordasword.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.wordasword.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.wordasword') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A word meant specifically as a word and not representing anything else') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('wordasword') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.wordasword.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.footnoteref.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.footnoteref.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.footnoteref.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.footnoteref.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkend.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.footnoteref.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.footnoteref') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A cross reference to a footnote (a footnote mark)') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Footnote reference type constraint"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:footnoteref"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"local-name(//*[@xml:id=current()/@linkend]) = 'footnote' and namespace-uri(//*[@xml:id=current()/@linkend]) = 'http://docbook.org/ns/docbook'"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"@linkend on footnoteref must point to a footnote."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('footnoteref') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.footnoteref.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.xref.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.xref.xrefstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.xrefstyle.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.xref.endterm.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.endterm.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.xref.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xref.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.req.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xref.xrefstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xref.endterm.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.xref') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A cross reference to another part of the document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('xref') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.xref.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.link.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.link.xrefstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.xrefstyle.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.link.endterm.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.endterm.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.link.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.link.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.req.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.link.xrefstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.link.endterm.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.link') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A hypertext link') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('link') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.link.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.olink.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.olink.xrefstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.xrefstyle.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.olink.localinfo.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Holds additional information that may be used by the applicatoin when resolving the link') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('localinfo') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.olink.targetdoc.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the URI of the document in which the link target appears') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('targetdoc') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:anyURI') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.olink.targetptr.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the location of the link target in the document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('targetptr') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.olink.type.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies application-specific customization of the link behavior') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('type') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.olink.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.olink.targetdoc.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.olink.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.olink.xrefstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.olink.localinfo.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.olink.targetptr.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.olink.type.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.olink') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A link that addresses its target indirectly') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('olink') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.olink.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.anchor.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.anchor.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.anchor.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.idreq.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.anchor') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A spot in the document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('anchor') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.anchor.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.alt.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.alt.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.alt.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.alt') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A text-only annotation, often used for accessibility') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('alt') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.alt.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.inlinemediaobject') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.annotations.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies one or more annotations that apply to this element') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('annotations') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.annotation.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.annotation.annotates.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies one ore more elements to which this annotation applies') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('annotates') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.annotation.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.annotation.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.annotation.annotates.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.annotation.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.annotation') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An annotation') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:annotation"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:annotation)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"annotation must not occur in the descendants of annotation"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('annotation') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.annotation.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.annotation.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xlink.from.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the XLink traversal-from') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:from') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xlink.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the XLink label') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:label') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.xlink.to.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the XLink traversal-to') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:to') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.extendedlink.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.extendedlink.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.extendedlink.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Identifies the XLink link type ') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(PREFIXED_NAME)('a:defaultValue') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"extended"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:type') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An XLink extended link') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"extended"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.title.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.extendedlink') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An XLink extended link') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('extendedlink') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.extendedlink.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.locator') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.arc') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.locator.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.locator.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.locator.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Identifies the XLink link type ') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(PREFIXED_NAME)('a:defaultValue') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"locator"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:type') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An XLink locator link') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"locator"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.href.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.title.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.locator') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An XLink locator in an extendedlink') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('locator') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.locator.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.arc.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.arc.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.arc.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Identifies the XLink link type ') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace(' ') + PsiElement(PREFIXED_NAME)('a:defaultValue') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"arc"') + PsiWhiteSpace(' ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('xlink:type') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An XLink arc link') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"arc"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.arcrole.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.title.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.show.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.actuate.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.from.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.xlink.to.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.arc') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An XLink arc in an extendedlink') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('arc') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.arc.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the editorial or publication status of the element on which it occurs') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('status') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.toplevel.sections') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.section') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect1') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refentry') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.toplevel.blocks.or.sections') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.toplevel.sections') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.toplevel.sections') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.recursive.sections') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.section') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refentry') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.recursive.blocks.or.sections') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.recursive.sections') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.recursive.sections') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.divisions') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.part') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.reference') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.components') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.dedication') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.acknowledgements') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.preface') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.chapter') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.appendix') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.article') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.colophon') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.navigation.components') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossary') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliography') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.index') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.toc') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.component.contentmodel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.toplevel.blocks.or.sections') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiElement(*)('*') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.setindex.components') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.setindex') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.toc.components') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.toc') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.set.components') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.set') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.book') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.set.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.set.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.set.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.set.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.set.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.set.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.set') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A collection of books') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:set"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('set') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.set.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.set.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.toc.components') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.set.components') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.setindex.components') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.book.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.book.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.book.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.book.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.book.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.book.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.book') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A book') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:book"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('book') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.book.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.book.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.components') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.divisions') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.dedication.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.dedication.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.dedication.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.dedication.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.dedication.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.dedication.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.dedication') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The dedication of a book or other component') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:dedication"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('dedication') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.dedication.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.dedication.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.acknowledgements.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.acknowledgements.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.acknowledgements.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.acknowledgements.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.acknowledgements.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.acknowledgements.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.acknowledgements') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Acknowledgements of a book or other component') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:acknowledgements"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('acknowledgements') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.acknowledgements.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.acknowledgements.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.colophon.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.colophon.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.colophon.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colophon.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colophon.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.colophon.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.colophon') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Text at the back of a book describing facts about its production') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:colophon"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('colophon') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.colophon.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.colophon.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.appendix.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.appendix.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.appendix.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.appendix.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.appendix.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.appendix.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.appendix') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An appendix in a Book or Article') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:appendix"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('appendix') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.appendix.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.appendix.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.component.contentmodel') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.chapter.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.chapter.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.chapter.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.chapter.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.chapter.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.chapter.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.chapter') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A chapter, as of a book') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:chapter"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('chapter') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.chapter.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.chapter.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.component.contentmodel') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.part.components') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.components') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refentry') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.reference') + PsiElement())(')') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.part.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.part.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.part.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.part.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.part.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.part.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.part') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A division in a book') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:part"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('part') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.part.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.part.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.partintro') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.part.components') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.preface.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.preface.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.preface.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.preface.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.preface.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.preface.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.preface') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Introductory matter preceding the first chapter of a book') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:preface"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('preface') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.preface.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.preface.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.component.contentmodel') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.partintro.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.partintro.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.partintro.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.partintro.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.partintro.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.partintro.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.partintro') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An introduction to the contents of a part') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('partintro') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.partintro.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.partintro.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.toplevel.blocks.or.sections') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.section.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.section.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.section.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.section.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.section.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.section.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.section') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A recursive section') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:section"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('section') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.section.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.section.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.recursive.blocks.or.sections') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplesect.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplesect.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplesect.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplesect.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplesect') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A section of a document with no subdivisions') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('simplesect') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.article.components') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.toplevel.sections') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.article.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.article.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A collection of frequently asked questions.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"faq"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## An article in a journal or other periodical.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"journalarticle"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A description of a product.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"productsheet"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A specification.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"specification"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A technical report.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"techreport"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## A white paper.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"whitepaper"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.article.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of the article') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.article.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.article.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.article.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.article.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.article.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.article.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.article.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.article') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An article') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:article"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('article') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.article.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.article.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.appendix') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.acknowledgements') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.colophon') + PsiElement())(')') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.article.components') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.article.components') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.appendix') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.acknowledgements') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.colophon') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.sect1.sections') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect2') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect1.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect1.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect1.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect1.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect1.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect1.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect1') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A top-level section of document') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:sect1"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('sect1') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect1.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect1.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect1.sections') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect1.sections') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.sect2.sections') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect3') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect2.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect2.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect2.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect2.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect2.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect2.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect2') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A subsection within a Sect1') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:sect2"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('sect2') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect2.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect2.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect2.sections') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect2.sections') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.sect3.sections') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect4') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect3.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect3.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect3.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect3.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect3.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect3.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect3') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A subsection within a Sect2') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:sect3"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('sect3') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect3.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect3.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect3.sections') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect3.sections') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.sect4.sections') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect5') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect4.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect4.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect4.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect4.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect4.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect4.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect4') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A subsection within a Sect3') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:sect4"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('sect4') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect4.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect4.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect4.sections') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect4.sections') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.sect5.sections') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplesect') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect5.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect5.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect5.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect5.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect5.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect5.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.sect5') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A subsection within a Sect4') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:sect5"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('sect5') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect5.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect5.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect5.sections') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sect5.sections') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.navigation.components') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.toplevel.refsection') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsection') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect1') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.secondlevel.refsection') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsection') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect2') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.reference.components') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refentry') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.reference.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.reference.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.reference.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.reference.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.reference') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A collection of reference entries') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:reference"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('reference') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.reference.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.reference.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.partintro') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.reference.components') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refentry.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refentry.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refentry.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refentry.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refentry') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A reference page (originally a UNIX man-style reference page)') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:refentry"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refentry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refentry.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refentry.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refmeta') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refnamediv') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsynopsisdiv') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.toplevel.refsection') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refmeta.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refmeta.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refmeta.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refmeta') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Meta-information for a reference entry') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refmeta') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refmeta.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refentrytitle') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.manvolnum') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refmiscinfo') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.refmiscinfo.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of the software product or component to which this topic applies') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"source"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The version of the software product or component to which this topic applies') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"version"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The section title of the reference page (e.g., User Commands)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"manual"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The section title of the reference page (believed synonymous with "manual" but in wide use)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"sectdesc"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The name of the software product or component to which this topic applies (e.g., SunOS x.y; believed synonymous with "source" but in wide use)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"software"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.refmiscinfo.class-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the kind of miscellaneous information') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refmiscinfo.class.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.refmiscinfo.class-other.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the nature of non-standard miscellaneous information') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('otherclass') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.refmiscinfo.class-other.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the kind of miscellaneious information') + PsiWhiteSpace('\n ') + INTERLEAVE + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates that the information is some 'other' kind.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"other"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refmiscinfo.class-other.attribute') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.refmiscinfo.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refmiscinfo.class-enum.attribute') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refmiscinfo.class-other.attributes') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refmiscinfo.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refmiscinfo.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refmiscinfo.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refmiscinfo.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refmiscinfo') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Meta-information for a reference entry other than the title and volume number') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refmiscinfo') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refmiscinfo.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refnamediv.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refnamediv.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refnamediv.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refnamediv') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name, purpose, and classification of a reference page') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refnamediv') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refnamediv.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refdescriptor') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refname') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refpurpose') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refclass') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refdescriptor.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refdescriptor.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refdescriptor.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refdescriptor') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A description of the topic of a reference page') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refdescriptor') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refdescriptor.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refname.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refname.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refname.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refname') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The name of (one of) the subject(s) of a reference page') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refname.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refpurpose.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refpurpose.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refpurpose.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refpurpose') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A short (one sentence) synopsis of the topic of a reference page') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refpurpose') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refpurpose.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refclass.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refclass.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refclass.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refclass') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The scope or other indication of applicability of a reference entry') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refclass') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refclass.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.application') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsynopsisdiv.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsynopsisdiv.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsynopsisdiv.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsynopsisdiv.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsynopsisdiv') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A syntactic synopsis of the subject of the reference page') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refsynopsisdiv') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsynopsisdiv.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsynopsisdiv.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.secondlevel.refsection') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.secondlevel.refsection') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsection.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsection.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsection.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsection.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsection') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A recursive section in a refentry') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:refsection"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refsection') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsection.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsection.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsection') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsection') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.refsect1.sections') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect2') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect1.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect1.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect1.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect1.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect1.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect1.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect1') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A major subsection of a reference entry') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:refsect1"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refsect1') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect1.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect1.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect1.sections') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect1.sections') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.refsect2.sections') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect3') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect2.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect2.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect2.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect2.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect2.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect2.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect2') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A subsection of a refsect1') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:refsect2"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refsect2') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect2.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect2.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect2.sections') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect2.sections') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect3.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect3.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect3.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect3.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect3.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect3.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.refsect3') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A subsection of a refsect2') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:refsect3"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('refsect3') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect3.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.refsect3.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.glossary.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.firstterm') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossterm') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.baseform.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the base form of the term, the one that appears in the glossary. This allows adjectival, plural, and other variations of the term to appear in the element. The element content is the default base form.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('baseform') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glosslist.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glosslist.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glosslist.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glosslist.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glosslist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for a list of glossary entries') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('glosslist') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glosslist.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glosslist.info') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossentry') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossentry.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossentry.sortas.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the string by which the element's content is to be sorted; if unspecified, the content is used') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('sortas') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossentry.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossentry.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossentry.sortas.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossentry') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An entry in a Glossary or GlossList') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('glossentry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossentry.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossterm') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.acronym') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.abbrev') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glosssee') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossdef') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossdef.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossdef.subject.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies a list of keywords for the definition') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('subject') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossdef.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossdef.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossdef.subject.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossdef') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A definition in a GlossEntry') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('glossdef') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossdef.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossseealso') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glosssee.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glosssee.otherterm.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the other term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('otherterm') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:IDREF') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glosssee.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glosssee.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glosssee.otherterm.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glosssee') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A cross-reference from one glossentry') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## to another') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Glosssary 'see' type constraint"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:glosssee[@otherterm]"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"local-name(//*[@xml:id=current()/@otherterm]) = 'glossentry' and namespace-uri(//*[@xml:id=current()/@otherterm]) = 'http://docbook.org/ns/docbook'"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"@otherterm on glosssee must point to a glossentry."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('glosssee') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glosssee.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossseealso.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossseealso.otherterm.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the other term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('otherterm') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:IDREF') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossseealso.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossseealso.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossseealso.otherterm.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossseealso') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A cross-reference from one GlossEntry to another') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Glossary 'seealso' type constraint"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:glossseealso[@otherterm]"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"local-name(//*[@xml:id=current()/@otherterm]) = 'glossentry' and namespace-uri(//*[@xml:id=current()/@otherterm]) = 'http://docbook.org/ns/docbook'"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"@otherterm on glossseealso must point to a glossentry."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('glossseealso') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossseealso.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.firstterm.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.firstterm.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.firstterm.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.baseform.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.firstterm') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The first occurrence of a term') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Glossary 'firstterm' type constraint"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:firstterm[@linkend]"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"local-name(//*[@xml:id=current()/@linkend]) = 'glossentry' and namespace-uri(//*[@xml:id=current()/@linkend]) = 'http://docbook.org/ns/docbook'"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"@linkend on firstterm must point to a glossentry."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('firstterm') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.firstterm.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossterm.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossterm.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossterm.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.baseform.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossterm') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A glossary term') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Glossary 'glossterm' type constraint"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:glossterm[@linkend]"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"local-name(//*[@xml:id=current()/@linkend]) = 'glossentry' and namespace-uri(//*[@xml:id=current()/@linkend]) = 'http://docbook.org/ns/docbook'"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"@linkend on glossterm must point to a glossentry."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('glossterm') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossterm.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossary.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossary.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossary.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossary.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossary.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossary.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossary') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A glossary') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:glossary"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('glossary') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossary.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossary.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossdiv') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossentry') + PsiElement(*)('*') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliography') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossdiv.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossdiv.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossdiv.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossdiv.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossdiv.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossdiv.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.glossdiv') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A division in a Glossary') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('glossdiv') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossdiv.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossdiv.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossentry') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.termdef.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.termdef.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.termdef.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.glossentry.sortas.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.baseform.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.termdef') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An inline definition of a term') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Glossary term definition constraint"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:termdef"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"count(db:firstterm) = 1"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"A termdef must contain exactly one firstterm"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('termdef') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.termdef.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.relation.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the relationship between the bibliographic elemnts') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('relation') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioentry.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioentry.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioentry.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioentry') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An entry in a Bibliography') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('biblioentry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioentry.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliographic.elements') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliomixed.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliomixed.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliomixed.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliomixed') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An entry in a Bibliography') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('bibliomixed') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliomixed.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliographic.elements') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioset.relation.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.relation.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioset.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioset.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioset.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioset.relation.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioset') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A raw container for related bibliographic information') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('biblioset') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioset.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliographic.elements') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliomset.relation.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.relation.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliomset.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliomset.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliomset.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliomset.relation.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliomset') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A cooked container for related bibliographic information') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('bibliomset') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliomset.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliographic.elements') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliomisc.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliomisc.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliomisc.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliomisc') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Untyped bibliographic information') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('bibliomisc') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliomisc.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliography.status.attrib') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliography.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliography.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliography.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliography.status.attrib') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliography.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliography') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A bibliography') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:bibliography"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('bibliography') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliography.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliography.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliodiv') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioentry') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliomixed') + PsiElement())(')') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliodiv.status.attrib') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliodiv.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliodiv.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliodiv.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliodiv.status.attrib') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliodiv.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliodiv') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A section of a Bibliography') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('bibliodiv') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliodiv.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliodiv.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioentry') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliomixed') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliolist.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliolist.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliolist.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliolist.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.bibliolist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for a list of bibliography entries') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('bibliolist') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliolist.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliolist.info') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioentry') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.bibliomixed') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioref.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioref.xrefstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.xrefstyle.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioref.endterm.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.endterm.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioref.units.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The units (for example, pages) used to identify the beginning and ending of a reference.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('units') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:token') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioref.begin.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the beginning of a reference; the location within the work that is being referenced.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('begin') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:token') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioref.end.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the end of a reference.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('end') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:token') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioref.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioref.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.req.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioref.xrefstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioref.endterm.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioref.units.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioref.begin.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioref.end.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.biblioref') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A cross-reference to a bibliographic entry') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('biblioref') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.biblioref.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.significance.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Normal') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"normal"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Preferred') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"preferred"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.significance.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the significance of the term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('significance') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.significance.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.zone.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the IDs of the elements to which this term applies') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('zone') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:IDREFS') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.pagenum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates the page on which this index term occurs in some version of the printed document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('pagenum') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.scope.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## All indexes') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"all"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The global index (as for a combined index of a set of box)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"global"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The local index (the index for this document only)') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"local"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.scope.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the scope of the index term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('scope') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.scope.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.sortas.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the string by which the term is to be sorted; if unspecified, the term content is used') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('sortas') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.index.type.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the target index for this term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('type') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.itermset.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.itermset.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.itermset.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.itermset') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A set of index terms in the meta-information of a document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('itermset') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.itermset.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.singular') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.contentmodel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.primary') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.secondary') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + GROUP_PATTERN + PsiElement(()('(') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tertiary') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.see') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seealso') + PsiElement(+)('+') + PsiElement())(')') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.see') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seealso') + PsiElement(+)('+') + PsiElement())(')') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.see') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seealso') + PsiElement(+)('+') + PsiElement())(')') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.singular.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.singular.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the class of index term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A singular index term') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"singular"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.singular.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.singular.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.significance.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.zone.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.pagenum.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.scope.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.index.type.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.singular.class.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.singular') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for an indexed term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('indexterm') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.singular.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.contentmodel') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.startofrange.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.startofrange.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the class of index term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The start of a range') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"startofrange"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.startofrange.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.startofrange.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.significance.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.zone.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.pagenum.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.scope.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.index.type.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.startofrange.class.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.startofrange') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for an indexed term that covers a range') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('indexterm') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.startofrange.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.contentmodel') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.endofrange.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.endofrange.class.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the class of index term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The end of a range') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"endofrange"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.endofrange.startref.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Points to the start of the range') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('startref') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:IDREF') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.endofrange.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.endofrange.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.endofrange.class.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.endofrange.startref.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm.endofrange') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the end of a range associated with an indexed term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('indexterm') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.endofrange.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexterm') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.singular') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.startofrange') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexterm.endofrange') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.primary.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.primary.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.primary.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sortas.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.primary') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The primary word or phrase under which an index term should be sorted') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('primary') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.primary.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.secondary.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.secondary.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.secondary.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sortas.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.secondary') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A secondary word or phrase in an index term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('secondary') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.secondary.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tertiary.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tertiary.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tertiary.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.sortas.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tertiary') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A tertiary word or phrase in an index term') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tertiary') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tertiary.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.see.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.see.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.see.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.see') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Part of an index term directing the reader instead to another entry in the index') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('see') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.see.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seealso.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seealso.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.seealso.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seealso') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Part of an index term directing the reader also to another entry in the index') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('seealso') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seealso.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.index.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.index.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.index.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.index.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.index.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.index.type.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.index.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info') + PsiWhiteSpace('\n ') + PsiComment(SINGLE_LINE_COMMENT)('# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # Yes, db.indexdiv* and db.indexentry*; that way an is valid.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # Authors can use an empty index to indicate where a generated index should') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # appear.') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.index') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An index to a book or part of a book') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:index"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('index') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.index.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.index.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexdiv') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexentry') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.segmentedlist') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.setindex.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.setindex.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.setindex.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.setindex.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.setindex.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.index.type.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.setindex.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.setindex') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An index to a set of books') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:setindex"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('setindex') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.setindex.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.setindex.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexdiv') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexentry') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexdiv.status.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.status.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexdiv.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexdiv.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexdiv.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexdiv.status.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexdiv.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexdiv') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A division in an index') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('indexdiv') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexdiv.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexdiv.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexentry') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.segmentedlist') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexentry.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexentry.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexentry.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.indexentry') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An entry in an index') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('indexentry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexentry.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.primaryie') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seeie') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.seealsoie') + PsiElement())(')') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.secondaryie') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seeie') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.seealsoie') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.tertiaryie') + PsiElement())(')') + PsiElement(*)('*') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.primaryie.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.primaryie.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.primaryie.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkends.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.primaryie') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A primary term in an index entry, not in the text') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('primaryie') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.primaryie.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.secondaryie.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.secondaryie.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.secondaryie.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkends.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.secondaryie') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A secondary term in an index entry, rather than in the text') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('secondaryie') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.secondaryie.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tertiaryie.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tertiaryie.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tertiaryie.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkends.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tertiaryie') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A tertiary term in an index entry, rather than in the text') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tertiaryie') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tertiaryie.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seeie.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seeie.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.seeie.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkend.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seeie') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A See') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## entry in an index, rather than in the text') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('seeie') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seeie.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seealsoie.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seealsoie.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.seealsoie.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkends.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.seealsoie') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A See also') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## entry in an index, rather than in the text') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('seealsoie') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.seealsoie.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.toc.pagenum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates the page on which this element occurs in some version of the printed document') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('pagenum') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.toc.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.toc.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.toc.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.toc.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.toc') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A table of contents') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Root must have version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"/db:toc"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"@version"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"The root element must have a version attribute."') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('toc') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.toc.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.toc.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tocdiv') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.tocentry') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tocdiv.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tocdiv.pagenum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.toc.pagenum.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tocdiv.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tocdiv.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tocdiv.pagenum.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkend.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tocdiv.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tocdiv') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A division in a table of contents') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tocdiv') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tocdiv.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.tocdiv.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tocdiv') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.tocentry') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tocentry.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tocentry.pagenum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.toc.pagenum.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tocentry.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tocentry.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tocentry.pagenum.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkend.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tocentry') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A component title in a table of contents') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tocentry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tocentry.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.task.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.req') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.task.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.task.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.task.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.task') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A task to be completed') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('task') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.task.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.task.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tasksummary') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.taskprerequisites') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.procedure') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.example') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.taskrelated') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tasksummary.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tasksummary.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tasksummary.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tasksummary.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tasksummary') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A summary of a task') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tasksummary') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tasksummary.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.tasksummary.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.taskprerequisites.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.taskprerequisites.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.taskprerequisites.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.taskprerequisites.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.taskprerequisites') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The prerequisites for a task') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('taskprerequisites') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.taskprerequisites.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.taskprerequisites.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.taskrelated.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.taskrelated.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.taskrelated.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.taskrelated.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.taskrelated') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Information related to a task') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('taskrelated') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.taskrelated.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.taskrelated.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.area.units.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Coordinates expressed as a pair of CALS graphic coordinates.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"calspair"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Coordinates expressed as a line and column.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"linecolumn"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Coordinates expressed as a pair of lines and columns.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"linecolumnpair"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Coordinates expressed as a line range.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"linerange"') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.area.units-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the units used in the coords attribute The default units vary according to the type of callout specified: calspair') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## for graphics and linecolumn') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## for line-oriented elements.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('units') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.units.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.area.units-other.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates that non-standard units are used for this area') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## . In this case otherunits') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## must be specified.') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('units') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Coordinates expressed in some non-standard units.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"other"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the units used in the coords') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## attribute when the units') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## attribute is other') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## . This attribute is forbidden otherwise.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('otherunits') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NMTOKEN') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.area.units.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.units-enum.attribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.units-other.attributes') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.calloutlist.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.calloutlist.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.calloutlist.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.calloutlist.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.calloutlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A list of callout') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## s') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('calloutlist') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.calloutlist.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.calloutlist.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.callout') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.callout.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.callout.arearefs.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Identifies the areas described by this callout.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('arearefs') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:IDREFS') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.callout.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.callout.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.callout.arearefs.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.callout') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A called out') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## description of a marked Area') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('callout') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.callout.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.programlistingco.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.programlistingco.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.programlistingco.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.programlistingco.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.programlistingco') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A program listing with associated areas used in callouts') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('programlistingco') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.programlistingco.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.programlistingco.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.areaspec') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.programlisting') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.calloutlist') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.areaspec.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.areaspec.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.areaspec.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.units.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.areaspec') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A collection of regions in a graphic or code example') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('areaspec') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.areaspec.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.area') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.areaset') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.area.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.area.linkends.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Point to the callout') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## s which refer to this area. (This provides bidirectional linking which may be useful in online presentation.)') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('linkends') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:IDREFS') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.area.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies an identifying number or string that may be used in presentation. The area label might be drawn on top of the figure, for example, at the position indicated by the coords attribute.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('label') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.area.coords.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Provides the coordinates of the area. The coordinates must be interpreted using the units') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## specified.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('coords') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.area.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.idreq.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.units.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.linkends.attribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.href.attributes') + PsiElement())(')') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.coords.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.area') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A region defined for a Callout in a graphic or code example') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('area') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.alt') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + PsiComment(SINGLE_LINE_COMMENT)('# The only difference is that xml:id is optional') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.area.inareaset.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.units.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.linkends.attribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.href.attributes') + PsiElement())(')') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.coords.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.area.inareaset') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A region defined for a Callout in a graphic or code example') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('area') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.inareaset.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.alt') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.areaset.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.areaset.linkends.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkends.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.areaset.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.areaset.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.areaset.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.idreq.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.units.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.areaset.linkends.attribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.href.attributes') + PsiElement())(')') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.areaset.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.areaset') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A set of related areas in a graphic or code example') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('areaset') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.areaset.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.area.inareaset') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.screenco.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.screenco.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.screenco.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.screenco.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.screenco') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A screen with associated areas used in callouts') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('screenco') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.screenco.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.screenco.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.areaspec') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.screen') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.calloutlist') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imageobjectco.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imageobjectco.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imageobjectco.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imageobjectco.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imageobjectco') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for an image object with callouts') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('imageobjectco') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.imageobjectco.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imageobjectco.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.areaspec') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.imageobject') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.calloutlist') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.co.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.co.linkends.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkends.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.co.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.co.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.co.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.idreq.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.co.linkends.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.co.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.co') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The location of a callout embedded in text') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('co') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.co.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.coref.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.coref.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.coref.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.coref.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.linkend.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.coref.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.coref') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A cross reference to a co') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('coref') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.coref.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productionset.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productionset.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.productionset.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productionset.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productionset') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A set of EBNF productions') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('productionset') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.productionset.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.productionset.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.production') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.productionrecap') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.production.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.production.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.production.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.idreq.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.production') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A production in a set of EBNF productions') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('production') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.production.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.lhs') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.rhs') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.constraint') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.lhs.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.lhs.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.lhs.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.lhs') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The left-hand side of an EBNF production') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('lhs') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.lhs.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.rhs.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.rhs.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.rhs.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.rhs') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The right-hand side of an EBNF production') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('rhs') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.rhs.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.nonterminal') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.lineannotation') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.sbr') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.nonterminal.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.nonterminal.def.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies a URI that points to a production') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## where the nonterminal') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## is defined') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('def') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:anyURI') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.nonterminal.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.nonterminal.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.nonterminal.def.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.nonterminal') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A non-terminal in an EBNF production') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('nonterminal') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.nonterminal.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constraint.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constraint.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.constraint.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.req.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constraint') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A constraint in an EBNF production') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('constraint') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.constraint.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productionrecap.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productionrecap.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.productionrecap.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.req.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.productionrecap') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A cross-reference to an EBNF production') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('productionrecap') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.productionrecap.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constraintdef.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constraintdef.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.constraintdef.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constraintdef.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.constraintdef') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The definition of a constraint in an EBNF production') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('constraintdef') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.constraintdef.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.constraintdef.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.char.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the alignment character when align') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## is set to char') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## .') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('char') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.charoff.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the percentage of the column's total width that should appear to the left of the first occurance of the character identified in char') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## when align') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## is set to char') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## .') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('charoff') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:decimal') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('minExclusive') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"0"') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('maxExclusive') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"100"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.frame.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies how the table is to be framed. Note that there is no way to obtain a border on only the starting edge (left, in left-to-right writing systems) of the table.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('frame') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Frame all four sides of the table. In some environments with limited control over table border formatting, such as HTML, this may imply additional borders.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"all"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Frame only the bottom of the table.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"bottom"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Place no border on the table. In some environments with limited control over table border formatting, such as HTML, this may disable other borders as well.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"none"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Frame the left and right sides of the table.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"sides"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Frame the top of the table.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"top"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Frame the top and bottom of the table.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"topbot"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.colsep.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the presence or absence of the column separator') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('colsep') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## No column separator rule.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"0"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Provide a column separator rule on the right') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"1"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.rowsep.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the presence or absence of the row separator') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('rowsep') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## No row separator rule.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"0"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Provide a row separator rule below') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"1"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.orient.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the orientation of the table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('orient') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## 90 degrees counter-clockwise from the rest of the text flow.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"land"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The same orientation as the rest of the text flow.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"port"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.tabstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the table style') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tabstyle') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.rowheader.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates whether or not the entries in the first column should be considered row headers') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('rowheader') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates that entries in the first column of the table are functionally row headers (analogous to the way that a thead provides column headers).') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"firstcol"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Indicates that entries in the first column have no special significance with respect to column headers.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"norowheader"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.align.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the horizontal alignment of text in an entry.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('align') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Centered.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"center"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Aligned on a particular character.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"char"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Left and right justified.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"justify"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Left justified.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"left"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Right justified.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"right"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.valign.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the vertical alignment of text in an entry.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('valign') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Aligned on the bottom of the entry.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"bottom"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Aligned in the middle.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"middle"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Aligned at the top of the entry.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"top"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.specify-col-by-colname.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies a column specification by name.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('colname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.specify-col-by-namest.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies a starting column by name.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('namest') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.specify-span-by-spanspec.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies a span by name.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('spanname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.specify-span-directly.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies a starting column by name.') + PsiWhiteSpace('\n ') + INTERLEAVE + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('namest') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies an ending column by name.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('nameend') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.column-spec.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.specify-col-by-colname.attributes') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.specify-col-by-namest.attributes') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.specify-span-by-spanspec.attributes') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.specify-span-directly.attributes') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.colname.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Provides a name for a column specification.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('colname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.spanname.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Provides a name for a span specification.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('spanname') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tgroup.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tgroup.tgroupstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Additional style information for downstream processing; typically the name of a style.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tgroupstyle') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tgroup.cols.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The number of columns in the table. Must be an integer greater than zero.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('cols') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:positiveInteger') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tgroup.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tgroup.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.char.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.charoff.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tgroup.tgroupstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.tgroup.cols.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.rowsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.align.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.tgroup') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for the main content of a table, or part of a table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tgroup') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tgroup.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.colspec') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.spanspec') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.thead') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.tfoot') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.tbody') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.colspec.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.colspec.colnum.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The number of the column to which this specification applies. Must be greater than any preceding column number. Defaults to one more than the number of the preceding column, if there is one, or one.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('colnum') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:positiveInteger') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.colspec.colwidth.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the width of the column.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('colwidth') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.colspec.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colspec.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colspec.colnum.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.char.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colspec.colwidth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.charoff.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colname.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.rowsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.align.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.colspec') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifications for a column in a table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('colspec') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.colspec.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.spanspec.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.spanspec.namest.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies a starting column by name.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('namest') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.spanspec.nameend.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies an ending column by name.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('nameend') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.spanspec.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.spanspec.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.spanname.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.spanspec.namest.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.spanspec.nameend.attribute') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.char.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.charoff.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.rowsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.align.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.spanspec') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Formatting information for a spanned column in a table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('spanspec') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.spanspec.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.thead.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.thead.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.thead.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.valign.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.thead') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A table header consisting of one or more rows') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('thead') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.thead.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.colspec') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.row') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.tfoot.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.tfoot.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.tfoot.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.valign.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.tfoot') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A table footer consisting of one or more rows') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tfoot') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.tfoot.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.colspec') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.row') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.tbody.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.tbody.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.tbody.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.valign.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.tbody') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for the rows of a table or informal table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tbody') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.tbody.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.row') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.row.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.row.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.row.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.rowsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.valign.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.row') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A row in a table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('row') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.row.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.entry') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.entrytbl') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entry.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entry.morerows.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the number of additional rows which this entry occupies. Defaults to zero.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('morerows') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:integer') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entry.rotate.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the rotation of this entry. A value of 1 (true) rotates the cell 90 degrees counter-clockwise. A value of 0 (false) leaves the cell unrotated.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('rotate') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Do not rotate the cell.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"0"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Rotate the cell 90 degrees counter-clockwise.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"1"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entry.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.entry.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.valign.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.char.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.charoff.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.entry.morerows.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.column-spec.attributes') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.rowsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.entry.rotate.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.align.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entry') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A cell in a table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('entry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.entry.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entrytbl.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entrytbl.tgroupstyle.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Additional style information for downstream processing; typically the name of a style.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tgroupstyle') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entrytbl.cols.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The number of columns in the entry table. Must be an integer greater than zero.') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('cols') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:positiveInteger') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entrytbl.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.entrytbl.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.char.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.charoff.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.column-spec.attributes') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.entrytbl.tgroupstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.entrytbl.cols.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.rowsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.align.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entrytbl') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A subtable appearing in place of an Entry in a table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('entrytbl') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.entrytbl.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.colspec') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.spanspec') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.entrytbl.thead') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.entrytbl.tbody') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.entrytbl.thead.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.entrytbl.thead.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.entrytbl.thead.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.valign.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.entrytbl.thead') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A table header consisting of one or more rows') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('thead') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.entrytbl.thead.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.colspec') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.entrytbl.row') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.entrytbl.tbody.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.entrytbl.tbody.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.entrytbl.tbody.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.valign.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.entrytbl.tbody') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for the rows of a table or informal table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tbody') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.entrytbl.tbody.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.entrytbl.row') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entrytbl.row.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entrytbl.row.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.entrytbl.row.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.rowsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.valign.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.entrytbl.row') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A row in a table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('row') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.entrytbl.row.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.entry') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.table.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.table.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.table.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.table.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.table.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tabstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.floatstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.orient.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.rowsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.frame.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.pgwide.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Indicates if the short or long title should be used in a List of Tables') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('shortentry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates that the full title should be used.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"0"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Indicates that the short short title (titleabbrev) should be used.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"1"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Indicates if the table should appear in a List of Tables') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tocentry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Indicates that the table should not occur in the List of Tables.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"0"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Indicates that the table should appear in the List of Tables.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"1"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.rowheader.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.table.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.onlyreq') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.table') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A formal table in a document') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:example)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"example must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:figure)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"figure must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:equation)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"equation must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:informaltable)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"informaltable must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('table') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.table.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.table.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.alt') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexing.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.textobject') + PsiElement(*)('*') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.mediaobject') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tgroup') + PsiElement(+)('+') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.caption') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.informaltable.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.informaltable.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.informaltable.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tabstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.floatstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.orient.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.colsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.rowsep.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.frame.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.pgwide.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.rowheader.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.informaltable.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.cals.informaltable') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A table without a title') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('informaltable') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.informaltable.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.cals.informaltable.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.alt') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.indexing.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.textobject') + PsiElement(*)('*') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.mediaobject') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.tgroup') + PsiElement(+)('+') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.caption') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.html.coreattrs') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## This attribute assigns a class name or set of class names to an element. Any number of elements may be assigned the same class name or names. Multiple class names must be separated by white space characters.') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('class') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## This attribute specifies style information for the current element.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('style') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## This attribute offers advisory information about the element for which it is set.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('title') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.html.i18n') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## This attribute specifies the base language of an element's attribute values and text content. The default value of this attribute is unknown.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('lang') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.html.events') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Occurs when the pointing device button is clicked over an element.') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('onclick') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Occurs when the pointing device button is double clicked over an element.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('ondblclick') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Occurs when the pointing device button is pressed over an element.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('onmousedown') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Occurs when the pointing device button is released over an element.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('onmouseup') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Occurs when the pointing device is moved onto an element.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('onmouseover') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Occurs when the pointing device is moved while it is over an element.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('onmousemove') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Occurs when the pointing device is moved away from an element.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('onmouseout') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Occurs when a key is pressed and released over an element.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('onkeypress') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Occurs when a key is pressed down over an element.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('onkeydown') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Occurs when a key is released over an element.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('onkeyup') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.html.attrs') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.coreattrs') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.i18n') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.events') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.html.cellhalign') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the alignment of data and the justification of text in a cell.') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('align') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Left-flush data/Left-justify text. This is the default value for table data.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"left"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Center data/Center-justify text. This is the default value for table headers.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"center"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Right-flush data/Right-justify text.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"right"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Double-justify text.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"justify"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Align text around a specific character. If a user agent doesn't support character alignment, behavior in the presence of this value is unspecified.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"char"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## This attribute specifies a single character within a text fragment to act as an axis for alignment. The default value for this attribute is the decimal point character for the current language as set by the lang attribute (e.g., the period in English and the comma in French). User agents are not required to support this attribute.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('char') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## When present, this attribute specifies the offset to the first occurrence of the alignment character on each line. If a line doesn't include the alignment character, it should be horizontally shifted to end at the alignment position. When charoff is used to set the offset of an alignment character, the direction of offset is determined by the current text direction (set by the dir attribute). In left-to-right texts (the default), offset is from the left margin. In right-to-left texts, offset is from the right margin. User agents are not required to support this attribute.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('charoff') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:integer') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"[0-9]+%"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.html.cellvalign') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the vertical position of data within a cell.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('valign') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Cell data is flush with the top of the cell.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"top"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Cell data is centered vertically within the cell. This is the default value.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"middle"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Cell data is flush with the bottom of the cell.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"bottom"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## All cells in the same row as a cell whose valign attribute has this value should have their textual data positioned so that the first text line occurs on a baseline common to all cells in the row. This constraint does not apply to subsequent text lines in these cells.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"baseline"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.html.table.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Provides a summary of the table's purpose and structure for user agents rendering to non-visual media such as speech and Braille.') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('summary') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies the desired width of the entire table and is intended for visual user agents. When the value is a percentage value, the value is relative to the user agent's available horizontal space. In the absence of any width specification, table width is determined by the user agent.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('width') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:integer') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"[0-9]+%"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies the width (in pixels only) of the frame around a table.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('border') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:nonNegativeInteger') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies which sides of the frame surrounding a table will be visible.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('frame') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## No sides. This is the default value.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"void"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The top side only.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"above"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The bottom side only.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"below"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The top and bottom sides only.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"hsides"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The left-hand side only.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"lhs"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The right-hand side only.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"rhs"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The right and left sides only.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"vsides"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## All four sides.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"box"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## All four sides.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"border"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies which rules will appear between cells within a table. The rendering of rules is user agent dependent.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('rules') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## No rules. This is the default value.') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"none"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Rules will appear between row groups (see thead, tfoot, and tbody) and column groups (see colgroup and col) only.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"groups"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Rules will appear between rows only.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"rows"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Rules will appear between columns only.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"cols"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Rules will appear between all rows and columns.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"all"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies how much space the user agent should leave between the left side of the table and the left-hand side of the leftmost column, the top of the table and the top side of the topmost row, and so on for the right and bottom of the table. The attribute also specifies the amount of space to leave between cells.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('cellspacing') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:integer') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"[0-9]+%"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies the amount of space between the border of the cell and its contents. If the value of this attribute is a pixel length, all four margins should be this distance from the contents. If the value of the attribute is a percentage length, the top and bottom margins should be equally separated from the content based on a percentage of the available vertical space, and the left and right margins should be equally separated from the content based on a percentage of the available horizontal space.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('cellpadding') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:integer') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + PARAM + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"[0-9]+%"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.html.tablecell.attributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Provides an abbreviated form of the cell's content and may be rendered by user agents when appropriate in place of the cell's content. Abbreviated names should be short since user agents may render them repeatedly. For instance, speech synthesizers may render the abbreviated headers relating to a particular cell before rendering that cell's content.') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('abbr') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## This attribute may be used to place a cell into conceptual categories that can be considered to form axes in an n-dimensional space. User agents may give users access to these categories (e.g., the user may query the user agent for all cells that belong to certain categories, the user agent may present a table in the form of a table of contents, etc.). Please consult an HTML reference for more details.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('axis') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies the list of header cells that provide header information for the current data cell. The value of this attribute is a space-separated list of cell names; those cells must be named by setting their id attribute. Authors generally use the headers attribute to help non-visual user agents render header information about data cells (e.g., header information is spoken prior to the cell data), but the attribute may also be used in conjunction with style sheets.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('headers') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies the set of data cells for which the current header cell provides header information. This attribute may be used in place of the headers attribute, particularly for simple tables.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('scope') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The current cell provides header information for the rest of the row that contains it') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"row"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The current cell provides header information for the rest of the column that contains it.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"col"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The header cell provides header information for the rest of the row group that contains it.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"rowgroup"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## The header cell provides header information for the rest of the column group that contains it.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"colgroup"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies the number of rows spanned by the current cell. The default value of this attribute is one (1') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## ). The value zero (0') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## ) means that the cell spans all rows from the current row to the last row of the table section (thead') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## , tbody') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## , or tfoot') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## ) in which the cell is defined.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('rowspan') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:nonNegativeInteger') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies the number of columns spanned by the current cell. The default value of this attribute is one (1') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## ). The value zero (0') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## ) means that the cell spans all columns from the current column to the last column of the column group (colgroup') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## ) in which the cell is defined.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('colspan') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:nonNegativeInteger') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.html.table.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.html.table.model') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.table.info') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.caption') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.col') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.colgroup') + PsiElement(*)('*') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.thead') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tfoot') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tbody') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tr') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.html.informaltable.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.html.informaltable.model') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.informaltable.info') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.col') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.colgroup') + PsiElement(*)('*') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.thead') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tfoot') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tbody') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tr') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.table.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.table.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.table.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.attrs') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.table.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.table.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.table.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.orient.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.pgwide.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.tabstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.floatstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.table') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A formal (captioned) HTML table in a document') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:example)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"example must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:figure)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"figure must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:equation)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"equation must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:table"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:informaltable)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"informaltable must not occur in the descendants of table"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('table') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.table.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.table.model') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.informaltable.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.attrs') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.table.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.informaltable') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An HTML table without a title') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('informaltable') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.informaltable.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.informaltable.model') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.caption.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.attrs') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.caption') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An HTML table caption') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:example)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"example must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:figure)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"figure must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:table)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"table must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:equation)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"equation must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:sidebar)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"sidebar must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:caption"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:task)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"task must not occur in the descendants of caption"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('caption') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.caption.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.col.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.attrs') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## This attribute, whose value must be an integer > 0, specifies the number of columns spanned') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## by the col') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## element; the col') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## element shares its attributes with all the columns it spans. The default value for this attribute is 1 (i.e., a single column). If the span attribute is set to N > 1, the current col') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## element shares its attributes with the next N-1 columns.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('span') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:nonNegativeInteger') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies a default width for each column spanned by the current col') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## element. It has the same meaning as the width') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## attribute for the colgroup') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## element and overrides it.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('width') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellhalign') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellvalign') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.col') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifications for a column in an HTML table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('col') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.col.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.colgroup.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.attrs') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## This attribute, which must be an integer > 0, specifies the number of columns in a column group. In the absence of a span attribute, each colgroup') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## defines a column group containing one column. If the span attribute is set to N > 0, the current colgroup') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## element defines a column group containing N columns. User agents must ignore this attribute if the colgroup') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## element contains one or more col') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## elements.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('span') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:nonNegativeInteger') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## This attribute specifies a default width for each column in the current column group. In addition to the standard pixel, percentage, and relative values, this attribute allows the special form 0*') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## (zero asterisk) which means that the width of the each column in the group should be the minimum width necessary to hold the column's contents. This implies that a column's entire contents must be known before its width may be correctly computed. Authors should be aware that specifying 0*') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## will prevent visual user agents from rendering a table incrementally. This attribute is overridden for any column in the column group whose width is specified via a col') + PsiComment(DOCUMENTATION_CONTINUE)('\n ## element.') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('width') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellhalign') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellvalign') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.colgroup') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A group of columns in an HTML table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('colgroup') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.colgroup.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.col') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.thead.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.attrs') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellhalign') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellvalign') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.thead') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A table header consisting of one or more rows in an HTML table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('thead') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.thead.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tr') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.tfoot.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.attrs') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellhalign') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellvalign') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.tfoot') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A table footer consisting of one or more rows in an HTML table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tfoot') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tfoot.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tr') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.tbody.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.attrs') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellhalign') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellvalign') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.tbody') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for the rows of an HTML table or informal HTML table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tbody') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tbody.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tr') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.tr.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.attrs') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellhalign') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellvalign') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.tr') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A row in an HTML table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('tr') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tr.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.th') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.td') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.th.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.attrs') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tablecell.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellhalign') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellvalign') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.th') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A table header entry in an HTML table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('th') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.th.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.td.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.attrs') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.tablecell.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellhalign') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.cellvalign') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.html.td') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A table entry in an HTML table') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('td') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.html.td.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.inlines') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgset.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgset.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgset.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgset.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgset') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A detailed set of messages, usually error messages') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msgset') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgset.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgset.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgentry') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplemsgentry') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgentry.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgentry.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgentry.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgentry') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for an entry in a message set') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msgentry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgentry.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msg') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msginfo') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgexplan') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplemsgentry.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplemsgentry.msgaud.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The audience to which the message relevant') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msgaud') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplemsgentry.msgorig.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The origin of the message') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msgorig') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplemsgentry.msglevel.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The level of importance or severity of a message') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msglevel') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplemsgentry.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplemsgentry.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplemsgentry.msgaud.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplemsgentry.msgorig.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplemsgentry.msglevel.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.simplemsgentry') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A wrapper for a simpler entry in a message set') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('simplemsgentry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.simplemsgentry.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgtext') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgexplan') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msg.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msg.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msg.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msg.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msg') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A message in a message set') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msg') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msg.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msg.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgmain') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgsub') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgrel') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgmain.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgmain.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgmain.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgmain.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgmain') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The primary component of a message in a message set ') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msgmain') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgmain.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgmain.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgtext') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgsub.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgsub.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgsub.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgsub.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgsub') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A subcomponent of a message in a message set') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msgsub') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgsub.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgsub.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgtext') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgrel.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgrel.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgrel.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgrel.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgrel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A related component of a message in a message set') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msgrel') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgrel.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgrel.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgtext') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgtext.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgtext.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgtext.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgtext') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The actual text of a message component in a message set') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msgtext') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgtext.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msginfo.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msginfo.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msginfo.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msginfo') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Information about a message in a message set') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msginfo') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msginfo.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msglevel') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgorig') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgaud') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msglevel.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msglevel.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msglevel.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msglevel') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The level of importance or severity of a message in a message set') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msglevel') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msglevel.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgorig.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgorig.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgorig.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgorig') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The origin of a message in a message set') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msgorig') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgorig.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgaud.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgaud.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgaud.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgaud') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## The audience to which a message in a message set is relevant') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msgaud') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgaud.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgexplan.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgexplan.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgexplan.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgexplan.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.msgexplan') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Explanatory material relating to a message in a message set') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('msgexplan') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgexplan.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.msgexplan.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandaset.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandaset.defaultlabel.enumeration') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## No labels') + PsiWhiteSpace('\n ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"none"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Numeric labels') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"number"') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## "Q:" and "A:" labels') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"qanda"') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandaset.defaultlabel.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies the default labelling') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('defaultlabel') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandaset.defaultlabel.enumeration') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandaset.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandaset.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandaset.defaultlabel.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandaset.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandaset') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A question-and-answer set') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('qandaset') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandaset.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandaset.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandadiv') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandaentry') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandadiv.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandadiv.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandadiv.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandadiv.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandadiv') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A titled division in a QandASet') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('qandadiv') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandadiv.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandadiv.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandadiv') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandaentry') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandaentry.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandaentry.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandaentry.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandaentry.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.qandaentry') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A question/answer set within a QandASet') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('qandaentry') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandaentry.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.qandaentry.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.question') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.answer') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.question.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.question.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.question.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.question') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A question in a QandASet') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('question') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.question.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.answer.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.answer.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.answer.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.answer') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An answer to a question posed in a QandASet') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('answer') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.answer.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.all.blocks') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.label.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.label.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.label') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A label on a Question or Answer') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('label') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.math.inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.inlineequation') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.equation.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.mediaobject') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.mathphrase') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db._any.mml') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('db.inlineequation.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.inlinemediaobject') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db.mathphrase') + PsiElement(+)('+') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.equation.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.equation.label.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.label.attribute') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.equation.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.equation.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.equation.label.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.pgwide.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.floatstyle.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.equation.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.only') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.equation') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A displayed mathematical equation') + PsiWhiteSpace('\n ') + PATTERN + ANNOTATION + PsiElement([)('[') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:equation"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:example)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"example must not occur in the descendants of equation"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:equation"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:figure)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"figure must not occur in the descendants of equation"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:equation"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:table)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"table must not occur in the descendants of equation"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:equation"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:equation)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"equation must not occur in the descendants of equation"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:equation"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:caution)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"caution must not occur in the descendants of equation"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:equation"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:important)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"important must not occur in the descendants of equation"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:equation"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:note)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"note must not occur in the descendants of equation"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:equation"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:tip)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"tip must not occur in the descendants of equation"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:pattern') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"Element exclusion"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:rule') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('context') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"db:equation"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + ANNOTATION_ELEMENT + NAME + PsiElement(PREFIXED_NAME)('s:assert') + PsiWhiteSpace(' ') + PsiElement([)('[') + PsiWhiteSpace('\n ') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"not(.//db:warning)"') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"warning must not occur in the descendants of equation"') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('"\x{a}"') + PsiWhiteSpace(' ') + PsiElement(~)('~') + PsiWhiteSpace('\n ') + PsiElement(LITERAL)('" "') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(])(']') + PsiWhiteSpace('\n ') + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('equation') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.equation.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.equation.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.alt') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.equation.content') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.caption') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalequation.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalequation.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalequation.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalequation.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.informalequation') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A displayed mathematical equation without a title') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('informalequation') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalequation.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.informalequation.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.alt') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.equation.content') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.caption') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.inlineequation.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.inlineequation.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.inlineequation.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.inlineequation') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A mathematical equation or expression occurring inline') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('inlineequation') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.inlineequation.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.alt') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.inlineequation.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.mathphrase.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.mathphrase.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.mathphrase.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.linking.attributes') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.mathphrase') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A mathematical phrase, an expression that can be represented with ordinary text and a small amount of markup') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('mathphrase') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.mathphrase.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.ubiq.inlines') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._emphasis') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.mathml.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.mathml.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.mathml.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies that the format of the data is MathML') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('format') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies MathML.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"mathml"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.align.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.valign.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.width.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.contentwidth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.scalefit.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.scale.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.depth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.contentdepth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.mathml.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.mathml') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## A MathML expression in a media object') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('imagedata') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.mathml.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.mathml.info') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db._any.mml') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db._any.mml') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Any element from the MathML namespace') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIX_STAR)('mml:*') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._any.attribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._any') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.svg.role.attribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('role') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.svg.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + INTERLEAVE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.svg.role.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.common.attributes') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' \n ') + PsiComment(DOCUMENTATION)('## Specifies that the format of the data is SVG') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('format') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Specifies SVG.') + PsiWhiteSpace('\n ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"svg"') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.align.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.valign.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.width.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.contentwidth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.scalefit.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.scale.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.depth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.contentdepth.attribute') + PsiElement(?)('?') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.svg.info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._info.title.forbidden') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db.imagedata.svg') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## An SVG drawing in a media object') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('imagedata') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.svg.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db.imagedata.svg.info') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('db._any.svg') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n') + DIV + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('db._any.svg') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n \n ') + PsiComment(DOCUMENTATION)('## Any element from the SVG namespace') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIX_STAR)('svg:*') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('db._any.attribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('db._any') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/complex/Elements.rnc b/plugins/relaxng/testData/parsing/psi/complex/Elements.rnc new file mode 100644 index 000000000000..327b49970afe --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/Elements.rnc @@ -0,0 +1,554 @@ +# ========================================================= +# +# (c) 2004, RenderX +# +# Author: Alexander Peshkov +# +# Permission is granted to use this document, copy and +# modify free of charge, provided that every derived work +# bear a reference to the present document. +# +# This document contains a computer program written in +# XSL Transformations Language. It is published with no +# warranty of any kind about its usability, as a mere +# example of XSL technology. RenderX shall not be +# considered liable for any damage or loss of data caused +# by use of this program. +# +# ========================================================= + +namespace local = "" +default namespace fo = "http://www.w3.org/1999/XSL/Format" +namespace rx = "http://www.renderx.com/XSL/Extensions" + +include "properties.rnc" + +# **************************************************************************************** +# Common content models used by content-bearing elements +# **************************************************************************************** +very-basic-inlines = + character + | external-graphic + | instream-foreign-object + | inline-container + | leader + | page-number + | page-number-citation + | multi-toggle #MEMO: To be strict, we have to control that this element is a descendant of an fo:multi-case. + | page-index + | begin-index-range + | end-index-range + +#NOTE: An absolute-container can be treated both as block and as outline. +basic-blocks = + block | block-container | table-and-caption | table | list-block + +#NOTE: Unlike other out-of-lines fo:footnote can be used only in the context where inlines are permitted +out-of-lines-block = before-float | side-float | absolute-container +out-of-lines = footnote | out-of-lines-block + +# As a compromise for intricated inline content model prescribed by XSL FO spec +# we define two types of inline content: +# first as restrictive as required by spec for descendants of an fo:leader or of an fo:inline +# child of an fo:footnote (and for some other cases where we believe it is reasonable), +# it permits inline level elements only, except for descendants of fo:inline-container; +# second as loose as prescribed by spec for the general cases +basic-inlines-inline = very-basic-inlines | basic-link-inline | inline-inline | bidi-override-inline +basic-inlines = very-basic-inlines | basic-link | inline | bidi-override + +# We have three content models for wrappers: +# first one allows inline content only (based on basic-inlines-inline described above); +# second one requires block-level elements to be at the top of it; +# third one is for mixed content (general case); +wrappers-inline = + multi-switch-inline | multi-properties-inline | wrapper-inline | retrieve-marker +wrappers-block = + multi-switch-block | multi-properties-block | wrapper-block | retrieve-marker +wrappers = + multi-switch | multi-properties | wrapper | retrieve-marker + +# We have two extended content models for inlines: +# first one is stricter, with inline elements only (exception for fo:inline-container descendants) +# and with no outlines (actually they are bared in main.rnc anyway); +# second one is loose, with all possible inlines and outlines. +# In general those content models corresponds very well with two possible contexts: +# block context and inline context +inlines-inline = text | basic-inlines-inline | wrappers-inline +inlines = text | basic-inlines | out-of-lines | wrappers + +# Content model for blocks including block-level outlines +blocks = basic-blocks | wrappers-block | out-of-lines-block +# Mixed content model - broadest one +mix = inlines | basic-blocks + +# **************************************************************************************** +# Element structure for content-bearing elements +# **************************************************************************************** +# =============================================================== +# Block is the base element for all content areas. +# =============================================================== +block = + element fo:block { + block.attlist, block.content + } +block.content = marker*, ( initial-property-set | mix )* + +# =============================================================== +# Block container +# =============================================================== +#MEMO: We are forced to create separate element 'absolute-container' in order +# to satisfy XSL FO spec requirements. Note that this is the *only* place where +# properties really interfer with element-level structure (well, actually fo:float is the second place). +# A separate fo:absolute-container is clearly necessary. +# Absolutely possitioned block-container cannot contain markers and and outlines. +# It's behaviour is quite similar to the outline elements such as float. +# 'Folint' do not control absolutely positioned container restriction +# (due to expressions that can result in absolute position) +# 'Folint' also permits empty block-containers, that is against the spec. +# Spec defines fo:block-container content as (%block;)+ + +absolute-container = notAllowed +absolute-container-real = + element fo:block-container { absolute-container.attlist, absolute-container.content } +absolute-container.content = blocks+ + +block-container = + element fo:block-container { block-container.attlist, block-container.content } +block-container.content = marker*, blocks+ + +# **************************************************************************************** +# Inline elements +# **************************************************************************************** +# =============================================================== +# Unicode bidi-override +# =============================================================== +#MEMO: According to spec this element CAN have block level children except for the cases listed below: +# XSL> An fo:bidi-override that is a descendant of an fo:leader or of an fo:inline child +# XSL> of an fo:footnote may not have block-level children, unless it has a nearer ancestor +# XSL> that is an fo:inline-container. +# NOTE: This is contradictory to the description of fo:leader element (6.6.9. fo:leader) that +# prohibits (some) block-level elements/outlines to be fo:leader descendants +# no matter if they wrapped in any fo:inline-containers and fo:bidi-override. +# We have two models: +# first (restrictive) used by descendants of an fo:title, fo:leader or of an fo:inline child of an fo:footnote; +# second (loose) as prescribed by spec for the general cases +# 'Folint' believes that no block level elements should be allowed in this element in either way. +bidi-override-inline = + element fo:bidi-override { bidi-override.attlist, bidi-override-inline.content } +bidi-override-inline.content = marker*, inlines-inline* + +bidi-override = + element fo:bidi-override { bidi-override.attlist, bidi-override.content } +bidi-override.content = marker*, mix* + +# =============================================================== +# Single character +# =============================================================== +character = element fo:character { character.attlist, empty } + +# =============================================================== +# Initial property set specifies properties for one or more lines +# =============================================================== +initial-property-set = + element fo:initial-property-set { + initial-property-set.attlist, empty + } + +# =============================================================== +# External graphic +# =============================================================== +external-graphic = + element fo:external-graphic { external-graphic.attlist, empty } + +# =============================================================== +# In-stream graphic +# =============================================================== +instream-foreign-object = + element fo:instream-foreign-object { + instream-foreign-object.attlist, any + } + +# =============================================================== +# Inline +# =============================================================== +#MEMO: This element used by content model that consists of inlines only +# with exception for descendants of inline-container +inline-inline = element fo:inline { inline.attlist, inline-inline.content } +inline-inline.content = marker*, inlines-inline* + +inline = element fo:inline { inline.attlist, inline.content } +inline.content = marker*, mix* + +# XSL> An fo:inline that is a child of an fo:footnote may not have block-level children. +# XSL> An fo:inline that is a descendant of an fo:leader or of the fo:inline child of +# XSL> an fo:footnote may not have block-level children, unless it has a nearer +# XSL> ancestor that is an fo:inline-container. +#NOTE: This definition is contradictory to the one of the fo:leader since latter prohibits +# fo:inline-container as a descendant. But it's the definition of fo:leader that should be fixed +# since content model described above is the only sane content model in the inline context. +# It should be the same for fo:bidi-override. However definition must be adjasted +# in order to mention fo:title since this element is a typical inline. +# +# 'Folint' believes that block elements are allowed here and thoroughly tests for +# all those tricky exceptions. This behavior seems to be quite inconsisten with the +# one regarding fo:bidi-override treatment. + +# =============================================================== +# Inline container +# =============================================================== +inline-container = + element fo:inline-container { inline-container.attlist, inline-container.content } +inline-container.content = marker*, blocks* + +# =============================================================== +# Leader +# =============================================================== +leader = element fo:leader { leader.attlist, leader.content } +leader.content = inlines-inline* +#MEMO: Following two lines used together with tricky redefinition in main.rnc +# in order to prevent fo:leader nesting. +#leader.content = notAllowed +#leader.content-real = inlines-inline* + +#MEMO: We use inline content model here which is consistent with +# such elements as fo:inline child of fo:footnote. It allows blocks/outlines, but only as a +# descendant of inline-container. XSL FO spec is quite uneven at this point (and should be fixed). +# According to spec, this element can contain inline level elements and text, but +# XSL> The content must not contain an fo:leader, fo:inline-container, fo:block-container, +# XSL> fo:float, fo:footnote, or fo:marker either as a direct child or as a descendant. +# NOTE: XSL FO spec DO NOT prohibit blocks or tables as descendants of fo:leader! +# NOTE: fo:leader constraints are contradictory to those of fo:inline since section "6.6.7. fo:inline" +# states implicitly that there could be an fo:inline-container that is a descendent of fo:leader. +# +# 'Folint' respects these constraints partially: it prohibits fo:block-container as a descendant, +# but permits fo:marker, fo:leader, fo:inline-container, fo:float, fo:footnote. +# It also prohibits use of fo:block as descendant. + +# =============================================================== +# Page Number +# =============================================================== +page-number = element fo:page-number { page-number.attlist, empty } + +# =============================================================== +# Page number citation +# =============================================================== +page-number-citation = + element fo:page-number-citation { + page-number-citation.attlist, empty + } + +# =============================================================== +# Atomic elements for index ranges markup +# =============================================================== +begin-index-range = + element rx:begin-index-range { begin-index-range.attlist, empty } + +end-index-range = + element rx:end-index-range { end-index-range.attlist, empty } + +# =============================================================== +# Page number list - index entry +# =============================================================== +page-index = element rx:page-index { page-index.attlist, page-index.content } +#MEMO: Currently page-index must contain at least one rx:index-item element, +# empty content is allowed for backward compatibility. +page-index.content = index-item* + +index-item = element rx:index-item { index-item.attlist, empty } + +# **************************************************************************************** +# Formatting objects for tables. +# **************************************************************************************** + +# =============================================================== +# Table & Caption is a wrapper to all the stuff pertinent to a +# given table. It generates a block consisting of two subblocks: +# one for the caption, another one for the table itself. The +# placement of these two blocks is controlled by the +# 'caption-side' property: if caption-side="before"|"after" (or +# their absolute orientation equivalents), the two blocks are +# drawn one after another; if it is "start"|"end", then the +# caption is displayed on the correspondent side of the table. +# In this case, the relative alignment of the two blocks is given +# by the 'relative-align'/'display-align' property. +# +# =============================================================== +table-and-caption = + element fo:table-and-caption { + table-and-caption.attlist, + table-and-caption.content + } +table-and-caption.content = marker*, table-caption?, table + +# =============================================================== +# Table caption is an area container. +# =============================================================== +table-caption = + element fo:table-caption { table-caption.attlist, table-caption.content } +table-caption.content = marker*, blocks+ + +# =============================================================== +# fo:table is the basic element for all tables. All the contents +# placed inside it is distributed over a single rectangular grid +# of rows and columns. +# =============================================================== +table = + element fo:table { + table.attlist, + table.content + } +table.content = + marker*, + table-column*, + table-header?, + table-footer?, + table-body+ + +# =============================================================== +# Table column specifies common properties to ascribe to all +# cells in a column *or a group of columns*. Note that, if both +# 'number-columns-repeated' and 'number-columns-spanned' exceed +# 1, the column counter is increased by 'number-columns-spanned'. +# it means that you only set properties for columns: +# 'column-number' +# 'column-number' + 'number-columns-spanned' +# 'column-number' + 2 * 'number-columns-spanned' +# and so on, leaving default properties for intermediate columns. +# =============================================================== +table-column = element fo:table-column { table-column.attlist, empty } + +# =============================================================== +# Table header, table footer, and table body are wrappers for +# groups of rows. They contain either one or more fo:table-rows, +# or one or more fo:table-cells; in the latter case, row breaks +# are specified in the cells by 'starts-row'/'ends-row'. +# All these elements are identical both in the content structure +# and in the attributes. +# =============================================================== +row-group = marker*, (table-row+ | table-cell+) +table-header = + element fo:table-header { table-header.attlist, table-header.content } +table-header.content = row-group + +table-footer = + element fo:table-footer { table-footer.attlist, table-footer.content } +table-footer.content = row-group + +table-body = element fo:table-body { table-body.attlist, table-body.content } +table-body.content = row-group + +# =============================================================== +# Table row. +# =============================================================== +table-row = element fo:table-row { table-row.attlist, table-row.content } +table-row.content = table-cell+ +#MEMO: We are more strict here, so this note is about 'Folint': +# 'Folint' permits empty fo:table-row, that is against the spec. +# XSL FO spec defines fo:table-row content as (table-cell+) + +# =============================================================== +# Table cell. +# =============================================================== +table-cell = element fo:table-cell { table-cell.attlist, table-cell.content } +table-cell.content = marker*, blocks+ +#MEMO: We are more strict here, so this note is about 'Folint': +# 'Folint' permits empty table-cells that is against the spec. Spec defines fo:table-cell +# content as (%block;)+ +# Note that 'Folint' is quite consistent regarding this matter - it simillary allows empty +# block-containers and table-rows + +# **************************************************************************************** +# Formatting objects for lists. +# **************************************************************************************** +# =============================================================== +# List block is a block, with some extra features to control the +# disposition of list items. +# =============================================================== +list-block = element fo:list-block { list-block.attlist, list-block.content } +list-block.content = marker*, list-item+ + +# =============================================================== +# List item is a coupling of item label and item body. +# =============================================================== +list-item = + element fo:list-item { + list-item.attlist, + list-item.content + } +list-item.content = marker*, list-item-label, list-item-body + +# =============================================================== +# List item label and list item body +# =============================================================== +list-item-label = + element fo:list-item-label { list-item-label.attlist, list-item-label.content } +list-item-label.content = marker*, blocks+ + +list-item-body = + element fo:list-item-body { list-item-body.attlist, list-item-body.content } +list-item-body.content = marker*, blocks+ +#MEMO: We are more strict here, so this note is about 'Folint': +# 'Folint' permits empty fo:list-item-label/body, that is clearly the spec. +# Spec defines fo:list-item-label/body content as (%block;)+ + +#**************************************************************************************** +# Out-of-lines. +#**************************************************************************************** +# =============================================================== +# Floats and footnotes resemble containers. Accordingly, we treat +# them as block sequences. +# =============================================================== +#MEMO: We do not allows absolutely positioned container as an outline descendant. +# 'Folint' is loose here - it do not check this condition. +#MEMO: We are forced to create two types of floats: side-floats and before-floats +# because they have different restrictions (side-floats can appear in static content, +# before-floats can't bear 'clear' property) +# NOTE: 'Folint' does not allows any floats inside absolutely positioned containers too. +side-float = notAllowed +side-float-real = element fo:float { side-float.attlist, float.content } +before-float = notAllowed +before-float-real = element fo:float { before-float.attlist, float.content } +float.content = blocks+ + +# XSL> It is an error if the fo:footnote occurs as a descendant of a flow that is not assigned +# XSL> to a region-body, or of an fo:block-container that generates absolutely positioned areas. +footnote = notAllowed +footnote-real = + element fo:footnote { footnote.attlist, footnote.content } +# XSL> An fo:inline that is a child of an fo:footnote may not have block-level children. +# XSL> An fo:inline that is a descendant of an fo:leader or of the fo:inline child of +# XSL> an fo:footnote may not have block-level children, unless it has a nearer +# XSL> ancestor that is an fo:inline-container. +# We do check here that first inline have no block-level children/descendants unlless +# they are wrapped into an inline-container. +# 'Folint' does the same. +footnote.content = inline-inline, footnote-body + +footnote-body = + element fo:footnote-body { footnote-body.attlist, footnote-body.content } +footnote-body.content = blocks+ + +# =============================================================== +# Simple link. From the formatting point of view, it's nothing +# but a regular inline sequence. +# =============================================================== +# This elment is for separate 'inline' content model +basic-link-inline = element fo:basic-link { basic-link.attlist, basic-link-inline.content } +basic-link-inline.content = marker*, inlines-inline* + +basic-link = element fo:basic-link { basic-link.attlist, basic-link.content } +basic-link.content = marker*, mix* + +# **************************************************************************************** +# Wrappers and Markers. +# **************************************************************************************** +# =============================================================== +# Wrapper. This may be useful but it seriously complicates validation of +# content models for blocks and inlines. +# =============================================================== +#There are 3 different kind of wrappers for different contexts +wrapper-inline = element fo:wrapper { wrapper.attlist, wrapper-inline.content } +wrapper-inline.content = marker*, inlines-inline* + +wrapper-block = element fo:wrapper { wrapper.attlist, wrapper-block.content } +wrapper-block.content = marker*, blocks* + +wrapper = element fo:wrapper { wrapper.attlist, wrapper.content } +wrapper.content = marker*, mix* + +# =============================================================== +# Marker. +# =============================================================== +marker = notAllowed +marker-real = element fo:marker { marker.attlist, marker.content } +marker.content = mix* + +# =============================================================== +# Marker retrieval. +# We are more strict here making retrieve-class-name attribute a mandatory, +# but marker with no retrieve-class-name is meaningless. +# =============================================================== +retrieve-marker = notAllowed +retrieve-marker-real = element fo:retrieve-marker { retrieve-marker.attlist, empty } + +# **************************************************************************************** +# Multistate stuff. +# All those elements are practically unused and XSL content model invloved is +# intricated. Therefor validation is not absolutely strict here. +# **************************************************************************************** +# =============================================================== +# Switch. This is a pure logical operator; no formatting may be +# conveyed through it. +# =============================================================== +#Thera are 3 different kind of multi-switch (because there are 3 kinds of multi-case) +multi-switch-inline = + element fo:multi-switch { multi-switch.attlist, multi-switch-inline.content } +multi-switch-inline.content = multi-case-inline+ + +multi-switch-block = + element fo:multi-switch { multi-switch.attlist, multi-switch-block.content } +multi-switch-block.content = multi-case-block+ + +multi-switch = + element fo:multi-switch { multi-switch.attlist, multi-switch.content } +multi-switch.content = multi-case+ + +# =============================================================== +# Single case. Block-level formatting may be conveyed. +# =============================================================== +#Thera are 3 different kind of multi-case (similar to fo:wrapper) +multi-case-inline = element fo:multi-case { multi-case.attlist, multi-case-inline.content } +multi-case-inline.content = inlines-inline* + +multi-case-block = element fo:multi-case { multi-case.attlist, multi-case-block.content } +multi-case-block.content = blocks* + +multi-case = element fo:multi-case { multi-case.attlist, multi-case.content } +multi-case.content = mix* + +# =============================================================== +# Toggle. This is a typical inline. +# =============================================================== +#MEMO: This element is only permitted as a descendant of an fo:multi-case. +multi-toggle = + element fo:multi-toggle { multi-toggle.attlist, multi-toggle.content } +multi-toggle.content = mix* + +# =============================================================== +# Multi-properties. +# =============================================================== +#Thera are 3 different kind of multi-properties (similar to fo:wrapper) +multi-properties-inline = + element fo:multi-properties { + multi-properties.attlist, multi-properties-inline.content + } +multi-properties-inline.content = multi-property-set+, wrapper-inline + +multi-properties-block = + element fo:multi-properties { + multi-properties.attlist, multi-properties-block.content + } +multi-properties-block.content = multi-property-set+, wrapper-block + +multi-properties = + element fo:multi-properties { + multi-properties.attlist, multi-properties.content + } +multi-properties.content = multi-property-set+, wrapper + +# =============================================================== +# Multi property set. +# =============================================================== +multi-property-set = + element fo:multi-property-set { multi-property-set.attlist, empty } + +# =============================================================== +# "Match anything" definition, used by fo:instream-foreign-object +# =============================================================== +#MEMO: Should we exclude elements which belongs to fo: namespace? +any = + (element * { + attribute * { text }*, + any + } + | text)* diff --git a/plugins/relaxng/testData/parsing/psi/complex/Elements.txt b/plugins/relaxng/testData/parsing/psi/complex/Elements.txt new file mode 100644 index 000000000000..d5352b5d2034 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/Elements.txt @@ -0,0 +1,2713 @@ +RncFileImpl:Elements.rnc + PsiComment(SINGLE_LINE_COMMENT)('# =========================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# (c) 2004, RenderX ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Author: Alexander Peshkov ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Permission is granted to use this document, copy and ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# modify free of charge, provided that every derived work ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# bear a reference to the present document. ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# This document contains a computer program written in ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL Transformations Language. It is published with no ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# warranty of any kind about its usability, as a mere ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# example of XSL technology. RenderX shall not be ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# considered liable for any damage or loss of data caused ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# by use of this program. ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# =========================================================') + PsiWhiteSpace('\n\n') + DOCUMENT + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('local') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('""') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_DEFAULT)('default') + PsiWhiteSpace(' ') + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('fo') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/1999/XSL/Format"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('rx') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.renderx.com/XSL/Extensions"') + PsiWhiteSpace('\n\n') + GRAMMAR_PATTERN + INCLUDE + PsiElement(KEYWORD_INCLUDE)('include') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"properties.rnc"') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Common content models used by content-bearing elements') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ****************************************************************************************') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('very-basic-inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('character') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('external-graphic') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('instream-foreign-object') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('inline-container') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('leader') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('page-number') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('page-number-citation') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-toggle') + PsiWhiteSpace(' ') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: To be strict, we have to control that this element is a descendant of an fo:multi-case.') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('page-index') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('begin-index-range') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('end-index-range') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('#NOTE: An absolute-container can be treated both as block and as outline.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('basic-blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('block') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('block-container') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('table-and-caption') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('table') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('list-block') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('#NOTE: Unlike other out-of-lines fo:footnote can be used only in the context where inlines are permitted') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('out-of-lines-block') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('before-float') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('side-float') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('absolute-container') + PsiWhiteSpace(' \n') + DEFINE + PsiElement(IDENTIFIER)('out-of-lines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('footnote') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('out-of-lines-block') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# As a compromise for intricated inline content model prescribed by XSL FO spec') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# we define two types of inline content:') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# first as restrictive as required by spec for descendants of an fo:leader or of an fo:inline') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# child of an fo:footnote (and for some other cases where we believe it is reasonable),') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# it permits inline level elements only, except for descendants of fo:inline-container;') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# second as loose as prescribed by spec for the general cases') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('basic-inlines-inline') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('very-basic-inlines') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('basic-link-inline') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('inline-inline') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('bidi-override-inline') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('basic-inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('very-basic-inlines') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('basic-link') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('inline') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('bidi-override') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# We have three content models for wrappers:') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# first one allows inline content only (based on basic-inlines-inline described above);') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# second one requires block-level elements to be at the top of it;') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# third one is for mixed content (general case);') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('wrappers-inline') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-switch-inline') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-properties-inline') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('wrapper-inline') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('retrieve-marker') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('wrappers-block') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-switch-block') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-properties-block') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('wrapper-block') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('retrieve-marker') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('wrappers') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-switch') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-properties') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('wrapper') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('retrieve-marker') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# We have two extended content models for inlines:') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# first one is stricter, with inline elements only (exception for fo:inline-container descendants)') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# and with no outlines (actually they are bared in main.rnc anyway);') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# second one is loose, with all possible inlines and outlines.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# In general those content models corresponds very well with two possible contexts:') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# block context and inline context') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('inlines-inline') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('basic-inlines-inline') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('wrappers-inline') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('inlines') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('basic-inlines') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('out-of-lines') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('wrappers') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# Content model for blocks including block-level outlines') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('blocks') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('basic-blocks') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('wrappers-block') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('out-of-lines-block') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('# Mixed content model - broadest one') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('mix') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('inlines') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('basic-blocks') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Element structure for content-bearing elements') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Block is the base element for all content areas. ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('block') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:block') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('block.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('block.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('block.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + PsiWhiteSpace(' ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('initial-property-set') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('mix') + PsiWhiteSpace(' ') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Block container') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: We are forced to create separate element 'absolute-container' in order ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# to satisfy XSL FO spec requirements. Note that this is the *only* place where ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# properties really interfer with element-level structure (well, actually fo:float is the second place). ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# A separate fo:absolute-container is clearly necessary.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Absolutely possitioned block-container cannot contain markers and and outlines.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# It's behaviour is quite similar to the outline elements such as float.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' do not control absolutely positioned container restriction ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# (due to expressions that can result in absolute position)') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' also permits empty block-containers, that is against the spec.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Spec defines fo:block-container content as (%block;)+') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('absolute-container') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('absolute-container-real') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:block-container') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('absolute-container.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('absolute-container.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('absolute-container.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('block-container') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:block-container') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('block-container.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('block-container.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('block-container.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Inline elements') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Unicode bidi-override') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: According to spec this element CAN have block level children except for the cases listed below:') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> An fo:bidi-override that is a descendant of an fo:leader or of an fo:inline child ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> of an fo:footnote may not have block-level children, unless it has a nearer ancestor') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> that is an fo:inline-container.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# NOTE: This is contradictory to the description of fo:leader element (6.6.9. fo:leader) that ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# prohibits (some) block-level elements/outlines to be fo:leader descendants') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# no matter if they wrapped in any fo:inline-containers and fo:bidi-override.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# We have two models:') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# first (restrictive) used by descendants of an fo:title, fo:leader or of an fo:inline child of an fo:footnote;') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# second (loose) as prescribed by spec for the general cases') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' believes that no block level elements should be allowed in this element in either way. ') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('bidi-override-inline') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:bidi-override') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('bidi-override.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('bidi-override-inline.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('bidi-override-inline.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('inlines-inline') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('bidi-override') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:bidi-override') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('bidi-override.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('bidi-override.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('bidi-override.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('mix') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Single character') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('character') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:character') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('character.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Initial property set specifies properties for one or more lines') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('initial-property-set') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:initial-property-set') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('initial-property-set.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' \n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# External graphic') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('external-graphic') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:external-graphic') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('external-graphic.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# In-stream graphic') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('instream-foreign-object') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:instream-foreign-object') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('instream-foreign-object.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('any') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Inline') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: This element used by content model that consists of inlines only') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# with exception for descendants of inline-container') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('inline-inline') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:inline') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('inline.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('inline-inline.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('inline-inline.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('inlines-inline') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('inline') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:inline') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('inline.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('inline.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('inline.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('mix') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# XSL> An fo:inline that is a child of an fo:footnote may not have block-level children.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> An fo:inline that is a descendant of an fo:leader or of the fo:inline child of ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> an fo:footnote may not have block-level children, unless it has a nearer ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> ancestor that is an fo:inline-container.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#NOTE: This definition is contradictory to the one of the fo:leader since latter prohibits') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# fo:inline-container as a descendant. But it's the definition of fo:leader that should be fixed') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# since content model described above is the only sane content model in the inline context.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# It should be the same for fo:bidi-override. However definition must be adjasted ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# in order to mention fo:title since this element is a typical inline. ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' believes that block elements are allowed here and thoroughly tests for ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# all those tricky exceptions. This behavior seems to be quite inconsisten with the ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# one regarding fo:bidi-override treatment.') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Inline container') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('inline-container') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:inline-container') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('inline-container.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('inline-container.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('inline-container.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Leader') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('leader') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:leader') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('leader.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('leader.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('leader.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('inlines-inline') + PsiElement(*)('*') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Following two lines used together with tricky redefinition in main.rnc ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# in order to prevent fo:leader nesting.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#leader.content = notAllowed') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#leader.content-real = inlines-inline*') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: We use inline content model here which is consistent with ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# such elements as fo:inline child of fo:footnote. It allows blocks/outlines, but only as a ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# descendant of inline-container. XSL FO spec is quite uneven at this point (and should be fixed).') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# According to spec, this element can contain inline level elements and text, but') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> The content must not contain an fo:leader, fo:inline-container, fo:block-container,') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> fo:float, fo:footnote, or fo:marker either as a direct child or as a descendant.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# NOTE: XSL FO spec DO NOT prohibit blocks or tables as descendants of fo:leader!') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# NOTE: fo:leader constraints are contradictory to those of fo:inline since section "6.6.7. fo:inline" ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# states implicitly that there could be an fo:inline-container that is a descendent of fo:leader.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' respects these constraints partially: it prohibits fo:block-container as a descendant,') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# but permits fo:marker, fo:leader, fo:inline-container, fo:float, fo:footnote.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# It also prohibits use of fo:block as descendant.') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Page Number') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-number') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:page-number') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('page-number.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Page number citation') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-number-citation') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:page-number-citation') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('page-number-citation.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' \n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Atomic elements for index ranges markup') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('begin-index-range') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('rx:begin-index-range') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('begin-index-range.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('end-index-range') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('rx:end-index-range') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('end-index-range.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Page number list - index entry') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-index') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('rx:page-index') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('page-index.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('page-index.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Currently page-index must contain at least one rx:index-item element, ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# empty content is allowed for backward compatibility.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-index.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('index-item') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('index-item') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('rx:index-item') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('index-item.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Formatting objects for tables.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ****************************************************************************************') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Table & Caption is a wrapper to all the stuff pertinent to a') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# given table. It generates a block consisting of two subblocks:') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# one for the caption, another one for the table itself. The') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# placement of these two blocks is controlled by the') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'caption-side' property: if caption-side="before"|"after" (or') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# their absolute orientation equivalents), the two blocks are') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# drawn one after another; if it is "start"|"end", then the') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# caption is displayed on the correspondent side of the table.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# In this case, the relative alignment of the two blocks is given') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# by the 'relative-align'/'display-align' property.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-and-caption') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:table-and-caption') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('table-and-caption.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' \n ') + REF_PATTERN + PsiElement(IDENTIFIER)('table-and-caption.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-and-caption.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('table-caption') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('table') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Table caption is an area container.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-caption') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:table-caption') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('table-caption.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('table-caption.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-caption.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(+)('+') + PsiWhiteSpace(' \n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# fo:table is the basic element for all tables. All the contents') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# placed inside it is distributed over a single rectangular grid') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# of rows and columns.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:table') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('table.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('table.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('table-column') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('table-header') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('table-footer') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('table-body') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Table column specifies common properties to ascribe to all') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# cells in a column *or a group of columns*. Note that, if both') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'number-columns-repeated' and 'number-columns-spanned' exceed') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 1, the column counter is increased by 'number-columns-spanned'.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# it means that you only set properties for columns:') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'column-number'') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'column-number' + 'number-columns-spanned'') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'column-number' + 2 * 'number-columns-spanned'') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# and so on, leaving default properties for intermediate columns.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-column') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:table-column') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('table-column.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Table header, table footer, and table body are wrappers for') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# groups of rows. They contain either one or more fo:table-rows,') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# or one or more fo:table-cells; in the latter case, row breaks') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# are specified in the cells by 'starts-row'/'ends-row'.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# All these elements are identical both in the content structure') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# and in the attributes.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('row-group') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + CHOICE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('table-row') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('table-cell') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-header') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:table-header') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('table-header.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('table-header.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-header.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('row-group') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('table-footer') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:table-footer') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('table-footer.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('table-footer.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-footer.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('row-group') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('table-body') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:table-body') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('table-body.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('table-body.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-body.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('row-group') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Table row.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-row') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:table-row') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('table-row.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('table-row.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-row.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('table-cell') + PsiElement(+)('+') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: We are more strict here, so this note is about 'Folint': ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' permits empty fo:table-row, that is against the spec.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL FO spec defines fo:table-row content as (table-cell+)') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Table cell.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-cell') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:table-cell') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('table-cell.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('table-cell.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-cell.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: We are more strict here, so this note is about 'Folint':') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' permits empty table-cells that is against the spec. Spec defines fo:table-cell') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# content as (%block;)+') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Note that 'Folint' is quite consistent regarding this matter - it simillary allows empty ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# block-containers and table-rows') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Formatting objects for lists.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# List block is a block, with some extra features to control the') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# disposition of list items.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('list-block') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:list-block') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('list-block.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('list-block.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('list-block.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('list-item') + PsiElement(+)('+') + PsiWhiteSpace(' \n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# List item is a coupling of item label and item body.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('list-item') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:list-item') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('list-item.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' \n ') + REF_PATTERN + PsiElement(IDENTIFIER)('list-item.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('list-item.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('list-item-label') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('list-item-body') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# List item label and list item body') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('list-item-label') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:list-item-label') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('list-item-label.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('list-item-label.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('list-item-label.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('list-item-body') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:list-item-body') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('list-item-body.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('list-item-body.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('list-item-body.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: We are more strict here, so this note is about 'Folint':') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' permits empty fo:list-item-label/body, that is clearly the spec.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Spec defines fo:list-item-label/body content as (%block;)+') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('#****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Out-of-lines.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Floats and footnotes resemble containers. Accordingly, we treat') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# them as block sequences.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: We do not allows absolutely positioned container as an outline descendant.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' is loose here - it do not check this condition.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: We are forced to create two types of floats: side-floats and before-floats') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# because they have different restrictions (side-floats can appear in static content, ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# before-floats can't bear 'clear' property)') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# NOTE: 'Folint' does not allows any floats inside absolutely positioned containers too.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('side-float') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('side-float-real') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:float') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('side-float.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('float.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('before-float') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('before-float-real') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:float') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('before-float.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('float.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('float.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# XSL> It is an error if the fo:footnote occurs as a descendant of a flow that is not assigned') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> to a region-body, or of an fo:block-container that generates absolutely positioned areas.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('footnote') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('footnote-real') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:footnote') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('footnote.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('footnote.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('# XSL> An fo:inline that is a child of an fo:footnote may not have block-level children.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> An fo:inline that is a descendant of an fo:leader or of the fo:inline child of ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> an fo:footnote may not have block-level children, unless it has a nearer ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> ancestor that is an fo:inline-container.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# We do check here that first inline have no block-level children/descendants unlless ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# they are wrapped into an inline-container.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' does the same.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('footnote.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('inline-inline') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('footnote-body') + PsiWhiteSpace(' \n\n') + DEFINE + PsiElement(IDENTIFIER)('footnote-body') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:footnote-body') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('footnote-body.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('footnote-body.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('footnote-body.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Simple link. From the formatting point of view, it's nothing') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# but a regular inline sequence.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# This elment is for separate 'inline' content model') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('basic-link-inline') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:basic-link') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('basic-link.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('basic-link-inline.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('basic-link-inline.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('inlines-inline') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('basic-link') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:basic-link') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('basic-link.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('basic-link.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('basic-link.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('mix') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Wrappers and Markers.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Wrapper. This may be useful but it seriously complicates validation of') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# content models for blocks and inlines.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#There are 3 different kind of wrappers for different contexts') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('wrapper-inline') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:wrapper') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('wrapper.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('wrapper-inline.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('wrapper-inline.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('inlines-inline') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('wrapper-block') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:wrapper') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('wrapper.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('wrapper-block.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('wrapper-block.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('wrapper') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:wrapper') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('wrapper.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('wrapper.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('wrapper.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('mix') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Marker.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('marker') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('marker-real') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:marker') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('marker.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('marker.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('marker.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('mix') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Marker retrieval.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# We are more strict here making retrieve-class-name attribute a mandatory, ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# but marker with no retrieve-class-name is meaningless.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('retrieve-marker') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + NOT_ALLOWED_PATTERN + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('retrieve-marker-real') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:retrieve-marker') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('retrieve-marker.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Multistate stuff.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# All those elements are practically unused and XSL content model invloved is ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# intricated. Therefor validation is not absolutely strict here.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Switch. This is a pure logical operator; no formatting may be') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# conveyed through it.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#Thera are 3 different kind of multi-switch (because there are 3 kinds of multi-case)') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-switch-inline') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:multi-switch') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-switch.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-switch-inline.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-switch-inline.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-case-inline') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('multi-switch-block') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:multi-switch') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-switch.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-switch-block.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-switch-block.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-case-block') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('multi-switch') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:multi-switch') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-switch.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-switch.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-switch.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-case') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Single case. Block-level formatting may be conveyed.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#Thera are 3 different kind of multi-case (similar to fo:wrapper)') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-case-inline') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:multi-case') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-case.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-case-inline.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-case-inline.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('inlines-inline') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('multi-case-block') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:multi-case') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-case.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-case-block.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-case-block.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('multi-case') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:multi-case') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-case.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-case.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-case.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('mix') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Toggle. This is a typical inline.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: This element is only permitted as a descendant of an fo:multi-case.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-toggle') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:multi-toggle') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-toggle.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-toggle.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-toggle.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('mix') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Multi-properties.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#Thera are 3 different kind of multi-properties (similar to fo:wrapper)') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-properties-inline') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:multi-properties') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-properties.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-properties-inline.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-properties-inline.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-property-set') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('wrapper-inline') + PsiWhiteSpace(' \n\n') + DEFINE + PsiElement(IDENTIFIER)('multi-properties-block') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:multi-properties') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-properties.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-properties-block.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-properties-block.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-property-set') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('wrapper-block') + PsiWhiteSpace(' \n\n') + DEFINE + PsiElement(IDENTIFIER)('multi-properties') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:multi-properties') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-properties.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('multi-properties.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-properties.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-property-set') + PsiElement(+)('+') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('wrapper') + PsiWhiteSpace(' \n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Multi property set.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-property-set') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:multi-property-set') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('multi-property-set.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# "Match anything" definition, used by fo:instream-foreign-object') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: Should we exclude elements which belongs to fo: namespace?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('any') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + ZERO_OR_MORE + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('any') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiElement())(')') + PsiElement(*)('*') \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/complex/Main.rnc b/plugins/relaxng/testData/parsing/psi/complex/Main.rnc new file mode 100644 index 000000000000..2232854032a1 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/Main.rnc @@ -0,0 +1,239 @@ +# ========================================================= +# +# (c) 2004, RenderX +# +# Author: Alexander Peshkov +# +# Permission is granted to use this document, copy and +# modify free of charge, provided that every derived work +# bear a reference to the present document. +# +# This document contains a computer program written in +# XSL Transformations Language. It is published with no +# warranty of any kind about its usability, as a mere +# example of XSL technology. RenderX shall not be +# considered liable for any damage or loss of data caused +# by use of this program. +# +# ========================================================= + +namespace local = "" +default namespace fo = "http://www.w3.org/1999/XSL/Format" +namespace rx = "http://www.renderx.com/XSL/Extensions" + +include "elements.rnc" + +start = root + +# **************************************************************************************** +# Element structure for top-level elements +# **************************************************************************************** +# =============================================================== +# Root element. Contains everything, generates nothing. It has an +# id, a FO namespace prefix declaration, and other namespace +# declarations if used. +# =============================================================== +root = element fo:root { root.attlist, root.content } +root.content = + meta-info?, + layout-master-set, + declarations?, + outline?, + page-sequence+ + +# =============================================================== +# Document meta information - RenderX extension +# =============================================================== +meta-info = element rx:meta-info { meta-info.attlist, meta-info.content } +meta-info.content = meta-field+ + +meta-field = element rx:meta-field { meta-field.attlist, empty } + +# =============================================================== +# Color profile declarations +# =============================================================== +declarations = element fo:declarations { declarations.attlist, declarations.content } +declarations.content = color-profile+ + +color-profile = element fo:color-profile { color-profile.attlist, empty } + +# =============================================================== +# Bookmarks - RenderX extension +# =============================================================== +outline = element rx:outline { outline.attlist, outline.content } +outline.content = bookmark+ + +bookmark = element rx:bookmark { bookmark.attlist, bookmark.content } +bookmark.content = bookmark-label, bookmark* + +bookmark-label = element rx:bookmark-label { bookmark-label.attlist, bookmark-label.content } +bookmark-label.content = text + +# =============================================================== +# Layout-master-set. Contains a set of page-masters. +# Content model made more strict than in the spec, to enforce +# that a page-sequence-master be always accompanied by at least +# one simple-page-master. +# =============================================================== +layout-master-set = element fo:layout-master-set { layout-master-set.attlist, layout-master-set.content } +layout-master-set.content = page-sequence-master* & simple-page-master+ + +# =============================================================== +# Page sequence master +# =============================================================== +page-sequence-master = + element fo:page-sequence-master { + page-sequence-master.attlist, page-sequence-master.content + } +page-sequence-master.content = + (single-page-master-reference + | repeatable-page-master-reference + | repeatable-page-master-alternatives)+ + +# =============================================================== +# Sequence specifiers are predefined sequences of page masters +# that are used by page sequence master to construct a desired +# page collection. +# =============================================================== +single-page-master-reference = + element fo:single-page-master-reference { + single-page-master-reference.attlist, empty + } + +repeatable-page-master-reference = + element fo:repeatable-page-master-reference { + repeatable-page-master-reference.attlist, empty + } + +repeatable-page-master-alternatives = + element fo:repeatable-page-master-alternatives { + repeatable-page-master-alternatives.attlist, repeatable-page-master-alternatives.content + } +repeatable-page-master-alternatives.content = conditional-page-master-reference+ + +conditional-page-master-reference = + element fo:conditional-page-master-reference { + conditional-page-master-reference.attlist, empty + } + +# =============================================================== +# Simple page master defines a page layout. It does not +# explicitly generate any content. +# =============================================================== +simple-page-master = + element fo:simple-page-master { + simple-page-master.attlist, + simple-page-master.content + } +simple-page-master.content = + region-body, + region-before?, + region-after?, + region-start?, + region-end? + +# =============================================================== +# Regions. The page instance is divided into subareas, whose +# properties are described by the five region-* elements. These +# elements by themselves do not generate any content. +# =============================================================== + +# =============================================================== +# Body region: middle of the page. +# =============================================================== +region-body = element fo:region-body { region-body.attlist, empty } + +# =============================================================== +# Side regions: page edges. +# =============================================================== + +region-before = element fo:region-before { region-before.attlist, empty } +region-after = element fo:region-after { region-after.attlist, empty } +region-start = element fo:region-start { region-start.attlist, empty } +region-end = element fo:region-end { region-end.attlist, empty } + +# =============================================================== +# Page sequence defines the order of choosing page masters to +# accomodate all the contents generated by its fo:flow and +# fo:static-content children, and the way of numbering them. +# =============================================================== +page-sequence = element fo:page-sequence { page-sequence.attlist, page-sequence.content } +page-sequence.content = title?, static-content*, flow + +# =============================================================== +# Title. May not contain out-of-lines. +# =============================================================== +#MEMO: Spec states: +# XSL> Additionally, an fo:title is not permitted to have as a descendant an fo:block-container +# XSL> that generates an absolutely positioned area. +# We prohibit block-level descendants except for those descendats of fo:inline-container. +# This content model shared by fo:leader and fo:inline child of an fo:footnote. +title = element fo:title { title.attlist, title.content } +title.content = inlines-inline* + +# =============================================================== +# Flows. They are just sequences of blocks. 'flow-name' feature +# defines linkage of the flow to a region in the page master. +# =============================================================== +# =============================================================== +# An extension element, rx:flow-section, has been added in order +# to overcome limitations on multicolumn layout imposed by XSL FO +# =============================================================== +#NOTE: We use tricks with nested grammar in order control marker/retrieve-marker +#and outlines appearance inside fo:static-content and fo:flow +#MEMO: We forcedly prohibit side-floats as descendants of ablsoutely positioned +# block-containers. This problem appears due to the 'half-outline' behavior of +# an absolute-container - it cannot contain outlines except for side-float and it cannot +# be nested into any other outlines. +#NOTE: 'Folint' prohibits use of side-floats in static-content that is against the spec. +static-content = element fo:static-content { static-content.attlist, static-content.content } +static-content.content = grammar { + start = blocks+ + include "elements.rnc" { + retrieve-marker = retrieve-marker-real + absolute-container = absolute-container-real + absolute-container.content = parent absolute-container.content + side-float = side-float-real + float.content = parent float.content + leader.content = parent leader.content + } +} + +flow = element fo:flow { flow.attlist, flow.content } +flow.content = grammar { + start =marker*, (blocks | flow-section)+ + include "elements.rnc" { + absolute-container = absolute-container-real + #MEMO: We have two options here: + # * use parent content model which is too strict (side-floats descendants not allowed); + # * use current content model which is too loose (all outline descendants are allowed). + # We prefer stricter mode. + absolute-container.content = parent absolute-container.content + marker = marker-real + marker.content = parent marker.content + side-float = side-float-real + before-float = before-float-real + float.content = parent float.content + footnote = footnote-real + footnote.content = parent footnote.content + #NOTE: fo:leader can't have outlines and marker descendants + leader.content = parent leader.content + } + # Extension element. Acts like a top-level block with multiple columns. + flow-section = element rx:flow-section { flow-section.attlist, flow-section.content } + flow-section.content = blocks+ +} + +#MEMO: Spec prohibits use of fo:leader as a descendant of itself. +# We find this constraint somewhat abusive so we do not enforce it. +# 'Folint' also does not controll this constraint +# However following trick can be used to prevent fo:leader to appear as it's own child. +# (to make it work we have to set leader.content to be notAllowed and move +# actual content into leader.content-real in elements.rnc) +#leader.content |= grammar { +# start = leader.content-real +# include "elements.rnc" { +# leader = notAllowed +# } +#} + diff --git a/plugins/relaxng/testData/parsing/psi/complex/Main.txt b/plugins/relaxng/testData/parsing/psi/complex/Main.txt new file mode 100644 index 000000000000..021c46d5cc11 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/Main.txt @@ -0,0 +1,1206 @@ +RncFileImpl:Main.rnc + PsiComment(SINGLE_LINE_COMMENT)('# =========================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# (c) 2004, RenderX ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Author: Alexander Peshkov ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Permission is granted to use this document, copy and ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# modify free of charge, provided that every derived work ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# bear a reference to the present document. ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# This document contains a computer program written in ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL Transformations Language. It is published with no ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# warranty of any kind about its usability, as a mere ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# example of XSL technology. RenderX shall not be ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# considered liable for any damage or loss of data caused ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# by use of this program. ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# =========================================================') + PsiWhiteSpace('\n\n') + DOCUMENT + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('local') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('""') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_DEFAULT)('default') + PsiWhiteSpace(' ') + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('fo') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/1999/XSL/Format"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('rx') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.renderx.com/XSL/Extensions"') + PsiWhiteSpace('\n\n') + GRAMMAR_PATTERN + INCLUDE + PsiElement(KEYWORD_INCLUDE)('include') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"elements.rnc"') + PsiWhiteSpace('\n\n') + START + PsiElement(KEYWORD_START)('start') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('root') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Element structure for top-level elements') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Root element. Contains everything, generates nothing. It has an') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# id, a FO namespace prefix declaration, and other namespace') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# declarations if used.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('root') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:root') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('root.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('root.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('root.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('meta-info') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('layout-master-set') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('declarations') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('outline') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('page-sequence') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Document meta information - RenderX extension') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('meta-info') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('rx:meta-info') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('meta-info.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('meta-info.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('meta-info.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('meta-field') + PsiElement(+)('+') + PsiWhiteSpace(' \n\n') + DEFINE + PsiElement(IDENTIFIER)('meta-field') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('rx:meta-field') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('meta-field.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Color profile declarations') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('declarations') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:declarations') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('declarations.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('declarations.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('declarations.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('color-profile') + PsiElement(+)('+') + PsiWhiteSpace(' \n\n') + DEFINE + PsiElement(IDENTIFIER)('color-profile') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:color-profile') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('color-profile.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Bookmarks - RenderX extension') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('outline') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('rx:outline') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('outline.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('outline.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('outline.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('bookmark') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('bookmark') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('rx:bookmark') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('bookmark.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('bookmark.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('bookmark.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('bookmark-label') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('bookmark') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('bookmark-label') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('rx:bookmark-label') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('bookmark-label.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('bookmark-label.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('bookmark-label.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Layout-master-set. Contains a set of page-masters.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Content model made more strict than in the spec, to enforce') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# that a page-sequence-master be always accompanied by at least') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# one simple-page-master.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('layout-master-set') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:layout-master-set') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('layout-master-set.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('layout-master-set.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('layout-master-set.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + INTERLEAVE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('page-sequence-master') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('simple-page-master') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Page sequence master') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-sequence-master') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:page-sequence-master') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('page-sequence-master.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('page-sequence-master.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-sequence-master.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('single-page-master-reference') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('repeatable-page-master-reference') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('repeatable-page-master-alternatives') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Sequence specifiers are predefined sequences of page masters') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# that are used by page sequence master to construct a desired') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# page collection.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('single-page-master-reference') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:single-page-master-reference') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('single-page-master-reference.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('repeatable-page-master-reference') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:repeatable-page-master-reference') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('repeatable-page-master-reference.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('repeatable-page-master-alternatives') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:repeatable-page-master-alternatives') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('repeatable-page-master-alternatives.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('repeatable-page-master-alternatives.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('repeatable-page-master-alternatives.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('conditional-page-master-reference') + PsiElement(+)('+') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('conditional-page-master-reference') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:conditional-page-master-reference') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('conditional-page-master-reference.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Simple page master defines a page layout. It does not') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# explicitly generate any content.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('simple-page-master') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:simple-page-master') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('simple-page-master.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('simple-page-master.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('simple-page-master.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('region-body') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('region-before') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('region-after') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('region-start') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('region-end') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Regions. The page instance is divided into subareas, whose') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# properties are described by the five region-* elements. These') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# elements by themselves do not generate any content.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Body region: middle of the page.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('region-body') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:region-body') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('region-body.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Side regions: page edges.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('region-before') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:region-before') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('region-before.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('region-after') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:region-after') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('region-after.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('region-start') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:region-start') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('region-start.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('region-end') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:region-end') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('region-end.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Page sequence defines the order of choosing page masters to') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# accomodate all the contents generated by its fo:flow and') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# fo:static-content children, and the way of numbering them.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-sequence') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:page-sequence') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('page-sequence.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('page-sequence.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-sequence.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('title') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('static-content') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('flow') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Title. May not contain out-of-lines.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: Spec states:') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> Additionally, an fo:title is not permitted to have as a descendant an fo:block-container') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL> that generates an absolutely positioned area.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# We prohibit block-level descendants except for those descendats of fo:inline-container.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# This content model shared by fo:leader and fo:inline child of an fo:footnote.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('title') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:title') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('title.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('title.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('title.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('inlines-inline') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Flows. They are just sequences of blocks. 'flow-name' feature') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# defines linkage of the flow to a region in the page master.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# An extension element, rx:flow-section, has been added in order') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# to overcome limitations on multicolumn layout imposed by XSL FO') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#NOTE: We use tricks with nested grammar in order control marker/retrieve-marker ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#and outlines appearance inside fo:static-content and fo:flow') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: We forcedly prohibit side-floats as descendants of ablsoutely positioned') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# block-containers. This problem appears due to the 'half-outline' behavior of') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# an absolute-container - it cannot contain outlines except for side-float and it cannot') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# be nested into any other outlines.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#NOTE: 'Folint' prohibits use of side-floats in static-content that is against the spec.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('static-content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:static-content') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('static-content.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('static-content.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('static-content.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + GRAMMAR_PATTERN + PsiElement(KEYWORD_GRAMMAR)('grammar') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + START + PsiElement(KEYWORD_START)('start') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + INCLUDE + PsiElement(KEYWORD_INCLUDE)('include') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"elements.rnc"') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('retrieve-marker') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('retrieve-marker-real') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('absolute-container') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('absolute-container-real') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('absolute-container.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PARENT_REF + PsiElement(KEYWORD_PARENT)('parent') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('absolute-container.content') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('side-float') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('side-float-real') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('float.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PARENT_REF + PsiElement(KEYWORD_PARENT)('parent') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('float.content') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('leader.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PARENT_REF + PsiElement(KEYWORD_PARENT)('parent') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('leader.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('flow') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('fo:flow') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('flow.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('flow.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('flow.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + GRAMMAR_PATTERN + PsiElement(KEYWORD_GRAMMAR)('grammar') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + START + PsiElement(KEYWORD_START)('start') + PsiWhiteSpace(' ') + PsiElement(=)('=') + SEQUENCE + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('marker') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ONE_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('flow-section') + PsiElement())(')') + PsiElement(+)('+') + PsiWhiteSpace('\n ') + INCLUDE + PsiElement(KEYWORD_INCLUDE)('include') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"elements.rnc"') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('absolute-container') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('absolute-container-real') + PsiWhiteSpace('\n ') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: We have two options here:') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # * use parent content model which is too strict (side-floats descendants not allowed);') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # * use current content model which is too loose (all outline descendants are allowed).') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # We prefer stricter mode.') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('absolute-container.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PARENT_REF + PsiElement(KEYWORD_PARENT)('parent') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('absolute-container.content') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('marker') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('marker-real') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('marker.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PARENT_REF + PsiElement(KEYWORD_PARENT)('parent') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('marker.content') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('side-float') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('side-float-real') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('before-float') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('before-float-real') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('float.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PARENT_REF + PsiElement(KEYWORD_PARENT)('parent') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('float.content') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('footnote') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('footnote-real') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('footnote.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PARENT_REF + PsiElement(KEYWORD_PARENT)('parent') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('footnote.content') + PsiWhiteSpace('\n ') + PsiComment(SINGLE_LINE_COMMENT)('#NOTE: fo:leader can't have outlines and marker descendants') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('leader.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PARENT_REF + PsiElement(KEYWORD_PARENT)('parent') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('leader.content') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiComment(SINGLE_LINE_COMMENT)('# Extension element. Acts like a top-level block with multiple columns.') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('flow-section') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIXED_NAME)('rx:flow-section') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('flow-section.attlist') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('flow-section.content') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + DEFINE + PsiElement(IDENTIFIER)('flow-section.content') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('blocks') + PsiElement(+)('+') + PsiWhiteSpace('\n') + PsiElement(})('}') + PsiWhiteSpace(' \n\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Spec prohibits use of fo:leader as a descendant of itself.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# We find this constraint somewhat abusive so we do not enforce it.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' also does not controll this constraint') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# However following trick can be used to prevent fo:leader to appear as it's own child.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# (to make it work we have to set leader.content to be notAllowed and move') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# actual content into leader.content-real in elements.rnc)') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#leader.content |= grammar {') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# start = leader.content-real') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# include "elements.rnc" {') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# leader = notAllowed ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# }') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#}') \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/complex/Properties.rnc b/plugins/relaxng/testData/parsing/psi/complex/Properties.rnc new file mode 100644 index 000000000000..1e4825bd0e3b --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/Properties.rnc @@ -0,0 +1,659 @@ +# ========================================================= +# +# (c) 2004, RenderX +# +# Author: Alexander Peshkov +# +# Permission is granted to use this document, copy and +# modify free of charge, provided that every derived work +# bear a reference to the present document. +# +# This document contains a computer program written in +# XSL Transformations Language. It is published with no +# warranty of any kind about its usability, as a mere +# example of XSL technology. RenderX shall not be +# considered liable for any damage or loss of data caused +# by use of this program. +# +# ========================================================= + +namespace local = "" +default namespace fo = "http://www.w3.org/1999/XSL/Format" +namespace rx = "http://www.renderx.com/XSL/Extensions" + +include "properties_groups.rnc" + +# **************************************************************************************** +# Properties used by top-level elements +# **************************************************************************************** +# =============================================================== +# Root element can bear inheritable properties, passed further to +# fo:flows/fo:static-contents. Inheritable properties from fo:layout-master-set +# are banned in this version of schema. +# =============================================================== +root.attlist = + media-usage.attr?, + inheritable-properties + +# =============================================================== +# Document meta information - RenderX extension +# =============================================================== +meta-info.attlist = empty + +# lknl klkj kjk +meta-field.attlist = + name.attr, + value.attr + +# =============================================================== +# Color profile declarations +# =============================================================== +declarations.attlist = empty + +color-profile.attlist = + src.attr, + color-profile-name.attr, + rendering-intent.attr? + +# =============================================================== +# Bookmarks - RenderX extension +# =============================================================== +outline.attlist = empty + +bookmark.attlist = + (internal-destination.attr | external-destination.attr), + collapse-subtree.attr? + +bookmark-label.attlist = empty + +# =============================================================== +# Layout-master-set contains a set of page-masters. Neither of +# its descendants generates any area, so no inherited elements +# can be specified on it or on its children. +# =============================================================== +layout-master-set.attlist = empty + +# =============================================================== +# Page sequence master +# =============================================================== +page-sequence-master.attlist = master-name.attr + +# =============================================================== +# Sequence specifiers. +# =============================================================== +single-page-master-reference.attlist = master-reference.attr + +repeatable-page-master-reference.attlist = + master-reference.attr, + maximum-repeats.attr? + +repeatable-page-master-alternatives.attlist = maximum-repeats.attr? + +conditional-page-master-reference.attlist = + master-reference.attr, + page-position.attr?, + odd-or-even.attr?, + blank-or-not-blank.attr? + +# =============================================================== +# Simple page master defines a page layout. It does not +# explicitly generate any content. Most of its properties are +# local except for writing-mode and reference-orientation that +# are inherited by the underlying region-* objects. +# =============================================================== +# NOTE. We could think about a common background/padding/border +# for every page instance generated by the page master. For such +# a scope, we may add borders/padding/background to its features. +# However, in the current version this is ruled out explicitly by the XSL specs. + +simple-page-master.attlist = + margin-properties-CSS, + master-name.attr, + page-height.attr?, + page-width.attr?, + reference-orientation.attr?, + size.attr?, + writing-mode.attr? + +# =============================================================== +# Region elements by themselves do not generate any content. +# Reference-orientation and writing-mode may be inherited from +# the page master; all other features are local. +# =============================================================== + +region-properties = + border-padding-background-properties, + area-properties, + region-name.attr? + +# =============================================================== +# Body region: middle of the page. Unlike side regions, this one +# may have multiple columns. +# =============================================================== +# NOTE: We have restricted margin properties to be margin-only, +# allowing no spaces. This is done because no clear semantics +# can be ascribed to single components of a space vector. + +region-body.attlist = + region-properties, + margin-properties-CSS, + column-count.attr?, + column-gap.attr? + +# =============================================================== +# Side regions: page edges. These regions have extent and +# precedence that is used to arbitrate corner conflicts. Side +# regions are viewed as frames, and may not have margins. +# =============================================================== +# NOTE: Extent made obligatory: its default value of 0.0pt does not +# make much sense. +region-before.attlist = + region-properties, + extent.attr, + precedence.attr? + +region-after.attlist = + region-properties, + extent.attr, + precedence.attr? + +region-start.attlist = + region-properties, + extent.attr + +region-end.attlist = + region-properties, + extent.attr + +# =============================================================== +# Page sequence. +# =============================================================== +page-sequence.attlist = + format.attr?, + letter-value.attr?, + grouping-separator.attr?, + grouping-size.attr?, + id.attr?, + rx-key.attr?, + initial-page-number.attr?, + force-page-count.attr?, + master-reference.attr, + inheritable-properties + +# =============================================================== +# Title +# =============================================================== +#MEMO: Why 'id' attribute is not allowed here? +#MEMO: Does it makes sence to add relative-position here? +# According to Section 7.12.1. "relative-position" it is allowed everywhere except fo:block-container +#Should we allow all inline properties here?? +title.attlist = + accessibility-properties, + aural-properties-unheritable, + border-padding-background-properties, + margin-properties-inline, + inheritable-properties + +# =============================================================== +# Flows. 'flow-name' feature defines linkage of the flow to a region in the page master. +# =============================================================== +flow-properties = + id.attr?, + rx-key.attr?, + flow-name.attr, + inheritable-properties + +flow.attlist = flow-properties +static-content.attlist = flow-properties + +# =============================================================== +# An extension element, rx:flow-section. +# Acts like a top-level block with multiple columns. +# =============================================================== +flow-section.attlist = + column-count.attr?, + column-gap.attr?, + border-padding-background-properties, + margin-properties-block, + inheritable-properties + +# **************************************************************************************** +# Properties used by content-bearing elements +# **************************************************************************************** + +# =============================================================== +# Properties of block formatting objects. +# =============================================================== +# =============================================================== +# Besides properties used to format the block itself, it also conveys +# formatting information to its inline-level children. +# =============================================================== +block.attlist = + block-properties, + character-properties-unheritable, + text-altitude.attr?, + text-depth.attr? + +# =============================================================== +# Block container +# =============================================================== + +#MEMO: We are forced to create separate element 'absolute-container' in order +# to satisfy XSL FO spec requirements. +absolute-container.attlist = + absolute-position-properties, + area-properties-unheritable, + box-size-properties, + common-block-properties, + z-index.attr? + +# 'Usual' container element +#MEMO: XSLFO spec prohibits use of 'relative-position' for fo:block-container, +# but we believe that it should be allowed for non-absolutely positioned containers. +block-container.attlist = + area-properties-unheritable, + box-size-properties, + block-properties, + container-position.attr?, + z-index.attr? + +# =============================================================== +# Properties of inline formatting objects. +# =============================================================== +# =============================================================== +# Unicode bidi-override +# =============================================================== +#MEMO: This element is 'half-inline' accroding to spec, since it's exhibits the same +# bahavior and used in the same context but yet cannot carry some of inline-level +# properties such as margins and border. +# We use the same set of properties as for inline here (except for unicode-bidi and +# width properties) since we believe that this is a typical inline element. +# Moreover fo:bidi-override is redundant from semantic point of view since it do not +# carry any additional information compared to regular fo:inline - just add +# 'unicode-bidi' to fo:inline and you do not need fo:bidi-override anymore. +bidi-override.attlist = + inline-properties, + unicode-bidi.attr? +#MEMO: 'Folint' believes that direction property is required for fo:bidi-override, +# but this is against the spec since this property can be inherited. + +# =============================================================== +# Single character +# =============================================================== +character.attlist = + character.attr, + suppress-at-line-break.attr?, + treat-as-word-space.attr?, + common-inline-properties + +# =============================================================== +# Initial property set specifies properties for one or more lines +# =============================================================== +#MEMO: Spec is contradictory here. It states that use of this object is equivalent to +# the fo:wrapper around the first line. At the same time spec allows on this element +# such properties as 'Common Border, Padding, and Background Properties' +# - fo:wrapper can't have border/padding/etc and can bear inheritable properties only. +# We believe that this element should be treated as inline and thus should have +# appropriate properties set. +initial-property-set.attlist = + common-inline-properties + +# =============================================================== +# External graphic +# =============================================================== +external-graphic.attlist = + graphic-properties, + src.attr? + +# =============================================================== +# In-stream graphic +# =============================================================== +instream-foreign-object.attlist = + graphic-properties + +# =============================================================== +# Inline +# =============================================================== +inline.attlist = + height-properties, + inline-properties + +# =============================================================== +# Inline container +# =============================================================== +# FIXME! We believe that this element should not bear not-inheritable properties, +# which applies to text since it can't have text children. +# Therefor we do not use 'common-inline-properties' set. +inline-container.attlist = + id.attr?, + rx-key.attr?, + accessibility-properties, + aural-properties-unheritable, + area-alignment-properties, + border-padding-background-properties, + keeps-properties-atomic, + margin-properties-inline, + relative-position-properties, + area-properties-unheritable, + box-size-properties, + inheritable-properties + +# =============================================================== +# Leader +# =============================================================== +leader.attlist = + inline-properties + +#MEMO: Note that 'inline-properties' includes block-level inheritable properties. +# But it's OK in our content-model since it allows block-level descendants wrapped +# into fo:inline-container. +# At the same time block-level inheritable properties includes leader properties, +# since they are inheritable... + +# =============================================================== +# Page Number +# =============================================================== +page-number.attlist = + common-inline-properties, + wrap-option.attr? + +# =============================================================== +# Page number citation +# =============================================================== +page-number-citation.attlist = + common-inline-properties, + wrap-option.attr?, + ref-id.attr + +# =============================================================== +# Atomic elements for index ranges markup +# =============================================================== +begin-index-range.attlist = id.attr, rx-key.attr +end-index-range.attlist = ref-id.attr + +# =============================================================== +# Page number list - index entry +# =============================================================== +page-index.attlist = + common-inline-properties, + wrap-option.attr?, + list-separator.attr?, + ref-key.attr? +#MEMO: There is no 'ref-key' attribute on page-index now, but it is allowed for +# backward compatibility. +#MEMO: Actually it makes sense to exclude id/rx:key fom the set of availabe properties +# for 'index-item', however we prefer no to do it just to avoid creation of yet another content +# model (attribute set) for thid inline element. +index-item.attlist = + common-inline-properties, + wrap-option.attr?, + ref-key.attr, + link-back.attr?, + range-separator.attr?, + merge-subsequent-page-numbers.attr? + +# =============================================================== +# Properties of table formatting objects. +# =============================================================== +# =============================================================== +# Table & Caption. +# =============================================================== +table-and-caption.attlist = + common-block-properties, + clear.attr?, + relative-position-properties, + keeps-and-breaks-properties-atomic + +#MEMO: Spec do not allows margins on fo:table-caption that is against common sence +# since this is a typical container. +# We do allow margins (they are included in common-block-properties). +# 'Folint' does the same. +table-caption.attlist = + clear.attr?, + common-block-properties, + relative-position-properties, + box-size-properties + +table.attlist = + clear.attr?, + common-block-properties, + box-size-properties, + keeps-and-breaks-properties-atomic, + table-properties-unheritable + +# =============================================================== +# Table column specifies common properties to ascribe to all +# cells in a column *or a group of columns*. Note that, if both +# 'number-columns-repeated' and 'number-columns-spanned' exceed +# 1, the column counter is increased by 'number-columns-spanned'. +# it means that you only set properties for columns: +# 'column-number' +# 'column-number' + 'number-columns-spanned' +# 'column-number' + 2 * 'number-columns-spanned' +# and so on, leaving default properties for intermediate columns. +# =============================================================== +table-column.attlist = + column-number.attr?, + column-width.attr?, + number-columns-repeated.attr?, + number-columns-spanned.attr?, + background-properties, +#MEMO: Border properties applies to this formatting object only if the value of border-collapse +# for the table is "collapse" or "collapse-with-precedence" + border-properties, + border-precedence-properties, + inheritable-properties + +# =============================================================== +# Table header, table footer, and table body. +# =============================================================== +row-group.attlist = + id.attr?, + rx-key.attr?, + accessibility-properties, + aural-properties-unheritable, + background-properties, +#MEMO: Border properties applies to this formatting object only if the value of border-collapse +# for the table is "collapse" or "collapse-with-precedence" + border-properties, + border-precedence-properties, + relative-position-properties, + inheritable-properties + +table-header.attlist = row-group.attlist +table-footer.attlist = row-group.attlist +#MEMO: Spec do not list "Keep" properties almong applicable to fo:table-body that is a clear +# case of errata. +table-body.attlist = + row-group.attlist, + keeps-and-breaks-properties-atomic + +# =============================================================== +# Table row. +# =============================================================== +#MEMO: Should we create separate collection of properties in 'properties_groups.rnc' +# based on row-group.attlist? +table-row.attlist = + row-group.attlist, + height-properties, + keeps-and-breaks-properties-atomic + +# =============================================================== +# Table cell. +# =============================================================== +#MEMO: Spec do not allows margins on fo:table-cell but 'Folint' does. +# We excluded margins from this element and therefor don't use 'common-block-properties' +#MEMO: Spec do not list "Keep" properties almong applicable to fo:table-cell that is a clear +# case of errata. +table-cell.attlist = + id.attr?, + rx-key.attr?, + column-number.attr?, + accessibility-properties, + aural-properties-unheritable, + border-padding-background-properties, + border-precedence-properties, + box-size-properties, + ends-row.attr?, + keeps-and-breaks-properties-atomic, + number-columns-spanned.attr?, + number-rows-spanned.attr?, + starts-row.attr?, + inheritable-properties + +# =============================================================== +# Properties of list formatting objects. +# =============================================================== +# =============================================================== +# List block. +# =============================================================== +list-block.attlist = + clear.attr?, + common-block-properties, + keeps-and-breaks-properties-atomic, + relative-position-properties + +# =============================================================== +# List item. +# =============================================================== +list-item.attlist = + common-block-properties, + keeps-and-breaks-properties-atomic, + relative-position-properties + +# =============================================================== +# List item label and list item body +# =============================================================== +list-item-label.attlist = + id.attr?, + rx-key.attr?, + accessibility-properties, + inheritable-properties + +list-item-body.attlist = + id.attr?, + rx-key.attr?, + accessibility-properties, + inheritable-properties + +# =============================================================== +# Floats and footnotes. +# =============================================================== +#MEMO: Outlines can't have id and therefor can't have rx:key properties so we are strict here. +# 'Folint' is loose here - it allows use of these properties. +#MEMO: We are forced to create two types of floats: side-floats and before-floats. +side-float.attlist = + side-float.attr?, + clear.attr?, + inheritable-properties +# NOTE: before-float can't bear 'clear' property +before-float.attlist = + before-float.attr?, + inheritable-properties + +footnote.attlist = + accessibility-properties, + inheritable-properties + +footnote-body.attlist = + accessibility-properties, + inheritable-properties + +# =============================================================== +# Simple link. +# =============================================================== +basic-link.attlist = + inline-properties, + external-destination.attr?, + internal-destination.attr?, + indicate-destination.attr?, + show-destination.attr?, + destination-placement-offset.attr?, + target-processing-context.attr?, + target-presentation-context.attr?, + target-stylesheet.attr? + +# =============================================================== +# Wrappers. +# =============================================================== +wrapper.attlist = + id.attr?, + rx-key.attr?, + inheritable-properties + +# =============================================================== +# Marker. This element may embrace any content but cannot pass +# properties to its children; so, it may not have features other +# than marker-class-name. +# =============================================================== +#MEMO: We are more strict here making marker-class-name attribute a mandatory, +# but marker with no marker-class-name is meaningless. +marker.attlist = marker-class-name.attr + +# =============================================================== +# Marker retrieval. +# =============================================================== +# FIXME! We are more strict here making retrieve-class-name attribute a mandatory, +# but marker with no retrieve-class-name is meaningless. +retrieve-marker.attlist = + retrieve-class-name.attr, + retrieve-position.attr?, + retrieve-boundary.attr?, + #MEMO: Is it OK to allow inheritable properties here? There are no explicit arguments + # against it in the spec. + inheritable-properties + +# =============================================================== +# Multistate stuff. +# =============================================================== +# =============================================================== +# Switch. +# =============================================================== +#MEMO: Should we have Aural Properties here as well? +multi-switch.attlist = + id.attr?, + rx-key.attr?, + auto-restore.attr?, + accessibility-properties, + inheritable-properties + +# =============================================================== +# Single case. +# =============================================================== +multi-case.attlist = + id.attr?, + rx-key.attr?, + starting-state.attr?, + case-name.attr?, + case-title.attr?, + accessibility-properties, + inheritable-properties + +# =============================================================== +# Toggle. +# =============================================================== +#MEMO: Should we have here inline-level properties only? +multi-toggle.attlist = + switch-to.attr?, + accessibility-properties, + inheritable-properties + +# =============================================================== +# Multi-properties. +# =============================================================== +#Should we allow here any possible properties applicable to the objects inside of the flow? +multi-properties.attlist = + id.attr?, + rx-key.attr?, + accessibility-properties, + inheritable-properties + +# =============================================================== +# Multi property set. +# =============================================================== +#Should we allow here any possible properties applicable to the objects inside of the flow? +multi-property-set.attlist = + id.attr?, + rx-key.attr?, + active-state.attr, + inheritable-properties diff --git a/plugins/relaxng/testData/parsing/psi/complex/Properties.txt b/plugins/relaxng/testData/parsing/psi/complex/Properties.txt new file mode 100644 index 000000000000..b9344291c210 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/Properties.txt @@ -0,0 +1,1904 @@ +RncFileImpl:Properties.rnc + PsiComment(SINGLE_LINE_COMMENT)('# =========================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# (c) 2004, RenderX ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Author: Alexander Peshkov ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Permission is granted to use this document, copy and ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# modify free of charge, provided that every derived work ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# bear a reference to the present document. ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# This document contains a computer program written in ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# XSL Transformations Language. It is published with no ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# warranty of any kind about its usability, as a mere ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# example of XSL technology. RenderX shall not be ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# considered liable for any damage or loss of data caused ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# by use of this program.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# =========================================================') + PsiWhiteSpace('\n\n') + DOCUMENT + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('local') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('""') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_DEFAULT)('default') + PsiWhiteSpace(' ') + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('fo') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/1999/XSL/Format"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('rx') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.renderx.com/XSL/Extensions"') + PsiWhiteSpace('\n\n') + GRAMMAR_PATTERN + INCLUDE + PsiElement(KEYWORD_INCLUDE)('include') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"properties_groups.rnc"') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Properties used by top-level elements') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Root element can bear inheritable properties, passed further to ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# fo:flows/fo:static-contents. Inheritable properties from fo:layout-master-set ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# are banned in this version of schema.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('root.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('media-usage.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Document meta information - RenderX extension') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('meta-info.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# lknl klkj kjk') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('meta-field.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('name.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('value.attr') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Color profile declarations') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('declarations.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('color-profile.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('src.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('color-profile-name.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rendering-intent.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Bookmarks - RenderX extension') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('outline.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('bookmark.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('internal-destination.attr') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('external-destination.attr') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('collapse-subtree.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('bookmark-label.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Layout-master-set contains a set of page-masters. Neither of') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# its descendants generates any area, so no inherited elements') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# can be specified on it or on its children.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('layout-master-set.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + EMPTY_PATTERN + PsiElement(KEYWORD_EMPTY)('empty') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Page sequence master') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-sequence-master.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('master-name.attr') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Sequence specifiers.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('single-page-master-reference.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('master-reference.attr') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('repeatable-page-master-reference.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('master-reference.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('maximum-repeats.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('repeatable-page-master-alternatives.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('maximum-repeats.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('conditional-page-master-reference.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('master-reference.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('page-position.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('odd-or-even.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('blank-or-not-blank.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Simple page master defines a page layout. It does not') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# explicitly generate any content. Most of its properties are') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# local except for writing-mode and reference-orientation that') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# are inherited by the underlying region-* objects.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# NOTE. We could think about a common background/padding/border') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# for every page instance generated by the page master. For such') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# a scope, we may add borders/padding/background to its features.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# However, in the current version this is ruled out explicitly by the XSL specs.') + PsiWhiteSpace('\n \n') + DEFINE + PsiElement(IDENTIFIER)('simple-page-master.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('margin-properties-CSS') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('master-name.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('page-height.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('page-width.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('reference-orientation.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('size.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('writing-mode.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n \n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Region elements by themselves do not generate any content.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Reference-orientation and writing-mode may be inherited from') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# the page master; all other features are local.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('region-properties') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('border-padding-background-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('area-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('region-name.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Body region: middle of the page. Unlike side regions, this one') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# may have multiple columns.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# =============================================================== ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# NOTE: We have restricted margin properties to be margin-only,') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# allowing no spaces. This is done because no clear semantics') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# can be ascribed to single components of a space vector.') + PsiWhiteSpace('\n \n') + DEFINE + PsiElement(IDENTIFIER)('region-body.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('region-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('margin-properties-CSS') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('column-count.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('column-gap.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Side regions: page edges. These regions have extent and') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# precedence that is used to arbitrate corner conflicts. Side') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# regions are viewed as frames, and may not have margins.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# NOTE: Extent made obligatory: its default value of 0.0pt does not') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# make much sense.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('region-before.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('region-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('extent.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('precedence.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('region-after.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('region-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('extent.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('precedence.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('region-start.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('region-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('extent.attr') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('region-end.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('region-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('extent.attr') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Page sequence. ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-sequence.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('format.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('letter-value.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('grouping-separator.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('grouping-size.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('initial-page-number.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('force-page-count.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('master-reference.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Title') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: Why 'id' attribute is not allowed here?') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: Does it makes sence to add relative-position here? ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# According to Section 7.12.1. "relative-position" it is allowed everywhere except fo:block-container') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#Should we allow all inline properties here??') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('title.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('accessibility-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('aural-properties-unheritable') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('border-padding-background-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('margin-properties-inline') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Flows. 'flow-name' feature defines linkage of the flow to a region in the page master.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('flow-properties') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('flow-name.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('flow.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('flow-properties') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('static-content.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('flow-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# An extension element, rx:flow-section.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Acts like a top-level block with multiple columns.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('flow-section.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('column-count.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('column-gap.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('border-padding-background-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('margin-properties-block') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ****************************************************************************************') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Properties used by content-bearing elements') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ****************************************************************************************') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Properties of block formatting objects.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Besides properties used to format the block itself, it also conveys') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# formatting information to its inline-level children.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('block.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('block-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('character-properties-unheritable') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('text-altitude.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' \n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('text-depth.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Block container') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: We are forced to create separate element 'absolute-container' in order ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# to satisfy XSL FO spec requirements. ') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('absolute-container.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('absolute-position-properties') + PsiElement(,)(',') + PsiWhiteSpace(' \n ') + REF_PATTERN + PsiElement(IDENTIFIER)('area-properties-unheritable') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('box-size-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('common-block-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('z-index.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# 'Usual' container element') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: XSLFO spec prohibits use of 'relative-position' for fo:block-container,') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# but we believe that it should be allowed for non-absolutely positioned containers.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('block-container.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('area-properties-unheritable') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('box-size-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('block-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('container-position.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('z-index.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Properties of inline formatting objects.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Unicode bidi-override') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: This element is 'half-inline' accroding to spec, since it's exhibits the same ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# bahavior and used in the same context but yet cannot carry some of inline-level') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# properties such as margins and border.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# We use the same set of properties as for inline here (except for unicode-bidi and') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# width properties) since we believe that this is a typical inline element.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Moreover fo:bidi-override is redundant from semantic point of view since it do not ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# carry any additional information compared to regular fo:inline - just add') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'unicode-bidi' to fo:inline and you do not need fo:bidi-override anymore.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('bidi-override.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('inline-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('unicode-bidi.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: 'Folint' believes that direction property is required for fo:bidi-override,') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# but this is against the spec since this property can be inherited.') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Single character') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('character.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('character.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('suppress-at-line-break.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('treat-as-word-space.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('common-inline-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Initial property set specifies properties for one or more lines') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: Spec is contradictory here. It states that use of this object is equivalent to') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# the fo:wrapper around the first line. At the same time spec allows on this element') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# such properties as 'Common Border, Padding, and Background Properties' ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# - fo:wrapper can't have border/padding/etc and can bear inheritable properties only.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# We believe that this element should be treated as inline and thus should have') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# appropriate properties set.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('initial-property-set.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + REF_PATTERN + PsiElement(IDENTIFIER)('common-inline-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# External graphic') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('external-graphic.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('graphic-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('src.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n \n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# In-stream graphic') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('instream-foreign-object.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('graphic-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Inline') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('inline.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('height-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inline-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Inline container') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# FIXME! We believe that this element should not bear not-inheritable properties,') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# which applies to text since it can't have text children.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Therefor we do not use 'common-inline-properties' set.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('inline-container.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('accessibility-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('aural-properties-unheritable') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('area-alignment-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('border-padding-background-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('keeps-properties-atomic') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('margin-properties-inline') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('relative-position-properties') + PsiElement(,)(',') + PsiWhiteSpace(' \n ') + REF_PATTERN + PsiElement(IDENTIFIER)('area-properties-unheritable') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('box-size-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n \n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Leader') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('leader.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inline-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Note that 'inline-properties' includes block-level inheritable properties.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# But it's OK in our content-model since it allows block-level descendants wrapped') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# into fo:inline-container.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# At the same time block-level inheritable properties includes leader properties,') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# since they are inheritable... ') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Page Number') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-number.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('common-inline-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('wrap-option.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Page number citation') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-number-citation.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('common-inline-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('wrap-option.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('ref-id.attr') + PsiWhiteSpace('\n \n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Atomic elements for index ranges markup') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('begin-index-range.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('end-index-range.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('ref-id.attr') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Page number list - index entry') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('page-index.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('common-inline-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('wrap-option.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('list-separator.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('ref-key.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: There is no 'ref-key' attribute on page-index now, but it is allowed for ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# backward compatibility.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: Actually it makes sense to exclude id/rx:key fom the set of availabe properties ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# for 'index-item', however we prefer no to do it just to avoid creation of yet another content') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# model (attribute set) for thid inline element.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('index-item.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('common-inline-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('wrap-option.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('ref-key.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('link-back.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('range-separator.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('merge-subsequent-page-numbers.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Properties of table formatting objects.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Table & Caption.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-and-caption.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('common-block-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('clear.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('relative-position-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('keeps-and-breaks-properties-atomic') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Spec do not allows margins on fo:table-caption that is against common sence ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# since this is a typical container.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# We do allow margins (they are included in common-block-properties).') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' does the same.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-caption.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('clear.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('common-block-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('relative-position-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('box-size-properties') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('table.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('clear.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('common-block-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('box-size-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('keeps-and-breaks-properties-atomic') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('table-properties-unheritable') + PsiWhiteSpace('\n \n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Table column specifies common properties to ascribe to all') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# cells in a column *or a group of columns*. Note that, if both') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'number-columns-repeated' and 'number-columns-spanned' exceed') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 1, the column counter is increased by 'number-columns-spanned'.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# it means that you only set properties for columns:') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'column-number'') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'column-number' + 'number-columns-spanned'') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'column-number' + 2 * 'number-columns-spanned'') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# and so on, leaving default properties for intermediate columns.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-column.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('column-number.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('column-width.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('number-columns-repeated.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('number-columns-spanned.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('background-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Border properties applies to this formatting object only if the value of border-collapse') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# for the table is "collapse" or "collapse-with-precedence" ') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('border-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('border-precedence-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Table header, table footer, and table body.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('row-group.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('accessibility-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('aural-properties-unheritable') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('background-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Border properties applies to this formatting object only if the value of border-collapse') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# for the table is "collapse" or "collapse-with-precedence" ') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('border-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('border-precedence-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('relative-position-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('table-header.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('row-group.attlist') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-footer.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('row-group.attlist') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Spec do not list "Keep" properties almong applicable to fo:table-body that is a clear') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# case of errata.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-body.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('row-group.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('keeps-and-breaks-properties-atomic') + PsiWhiteSpace('\n \n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Table row.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: Should we create separate collection of properties in 'properties_groups.rnc'') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# based on row-group.attlist?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-row.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('row-group.attlist') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('height-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('keeps-and-breaks-properties-atomic') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Table cell.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: Spec do not allows margins on fo:table-cell but 'Folint' does.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# We excluded margins from this element and therefor don't use 'common-block-properties'') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: Spec do not list "Keep" properties almong applicable to fo:table-cell that is a clear') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# case of errata.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('table-cell.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('column-number.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('accessibility-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('aural-properties-unheritable') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('border-padding-background-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('border-precedence-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('box-size-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('ends-row.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('keeps-and-breaks-properties-atomic') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('number-columns-spanned.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('number-rows-spanned.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('starts-row.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n \n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Properties of list formatting objects.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# =============================================================== ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# List block.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('list-block.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('clear.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('common-block-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('keeps-and-breaks-properties-atomic') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('relative-position-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# List item.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('list-item.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('common-block-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('keeps-and-breaks-properties-atomic') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('relative-position-properties') + PsiWhiteSpace(' \n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# List item label and list item body') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('list-item-label.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('accessibility-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('list-item-body.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('accessibility-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n \n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Floats and footnotes.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: Outlines can't have id and therefor can't have rx:key properties so we are strict here.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# 'Folint' is loose here - it allows use of these properties.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: We are forced to create two types of floats: side-floats and before-floats.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('side-float.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('side-float.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('clear.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n') + PsiComment(SINGLE_LINE_COMMENT)('# NOTE: before-float can't bear 'clear' property') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('before-float.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('before-float.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('footnote.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('accessibility-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('footnote-body.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('accessibility-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Simple link.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('basic-link.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('inline-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('external-destination.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('internal-destination.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('indicate-destination.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('show-destination.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('destination-placement-offset.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('target-processing-context.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('target-presentation-context.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('target-stylesheet.attr') + PsiElement(?)('?') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Wrappers.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('wrapper.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Marker. This element may embrace any content but cannot pass') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# properties to its children; so, it may not have features other') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# than marker-class-name.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: We are more strict here making marker-class-name attribute a mandatory,') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# but marker with no marker-class-name is meaningless.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('marker.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('marker-class-name.attr') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Marker retrieval.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# FIXME! We are more strict here making retrieve-class-name attribute a mandatory, ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# but marker with no retrieve-class-name is meaningless.') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('retrieve-marker.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('retrieve-class-name.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('retrieve-position.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('retrieve-boundary.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PsiComment(SINGLE_LINE_COMMENT)('#MEMO: Is it OK to allow inheritable properties here? There are no explicit arguments') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n # against it in the spec.') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Multistate stuff.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Switch. ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: Should we have Aural Properties here as well?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-switch.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('auto-restore.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('accessibility-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Single case.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-case.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('starting-state.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('case-name.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('case-title.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('accessibility-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n \n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Toggle. ') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#MEMO: Should we have here inline-level properties only?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-toggle.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('switch-to.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('accessibility-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n\n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Multi-properties.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#Should we allow here any possible properties applicable to the objects inside of the flow?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-properties.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' \n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('accessibility-properties') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') + PsiWhiteSpace('\n \n') + PsiComment(SINGLE_LINE_COMMENT)('# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# Multi property set.') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n# ===============================================================') + PsiComment(SINGLE_LINE_COMMENT_CONTINUE)('\n#Should we allow here any possible properties applicable to the objects inside of the flow?') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('multi-property-set.attlist') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('id.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('rx-key.attr') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('active-state.attr') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + REF_PATTERN + PsiElement(IDENTIFIER)('inheritable-properties') \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/complex/RelaxNG.rnc b/plugins/relaxng/testData/parsing/psi/complex/RelaxNG.rnc new file mode 100644 index 000000000000..42d253dd2c85 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/RelaxNG.rnc @@ -0,0 +1,63 @@ +# RELAX NG XML syntax specified in compact syntax. + +default namespace rng = "http://relaxng.org/ns/structure/1.0" +namespace local = "" +datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes" + +start = pattern + +pattern = + element element { (nameQName | nameClass), (common & pattern+) } + | element attribute { (nameQName | nameClass), (common & pattern?) } + | element group|interleave|choice|optional + |zeroOrMore|oneOrMore|list|mixed { common & pattern+ } + | element ref|parentRef { nameNCName, common } + | element empty|notAllowed|text { common } + | element data { type, param*, (common & exceptPattern?) } + | element value { commonAttributes, type?, xsd:string } + | element externalRef { href, common } + | element grammar { common & grammarContent* } + +param = element param { commonAttributes, nameNCName, xsd:string } + +exceptPattern = element except { common & pattern+ } + +grammarContent = + definition + | element div { common & grammarContent* } + | element include { href, (common & includeContent*) } + +includeContent = + definition + | element div { common & includeContent* } + +definition = + element start { combine?, (common & pattern+) } + | element define { nameNCName, combine?, (common & pattern+) } + +combine = attribute combine { "choice" | "interleave" } + +nameClass = + element name { commonAttributes, xsd:QName } + | element anyName { common & exceptNameClass? } + | element nsName { common & exceptNameClass? } + | element choice { common & nameClass+ } + +exceptNameClass = element except { common & nameClass+ } + +nameQName = attribute name { xsd:QName } +nameNCName = attribute name { xsd:NCName } +href = attribute href { xsd:anyURI } +type = attribute type { xsd:NCName } + +common = commonAttributes, foreignElement* + +commonAttributes = + attribute ns { xsd:string }?, + attribute datatypeLibrary { xsd:anyURI }?, + foreignAttribute* + +foreignElement = element * - rng:* { (anyAttribute | text | anyElement)* } +foreignAttribute = attribute * - (rng:*|local:*) { text } +anyElement = element * { (anyAttribute | text | anyElement)* } +anyAttribute = attribute * { text } \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/complex/RelaxNG.txt b/plugins/relaxng/testData/parsing/psi/complex/RelaxNG.txt new file mode 100644 index 000000000000..03e21e74f9f5 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/RelaxNG.txt @@ -0,0 +1,953 @@ +RncFileImpl:RelaxNG.rnc + PsiComment(SINGLE_LINE_COMMENT)('# RELAX NG XML syntax specified in compact syntax.') + PsiWhiteSpace('\n\n') + DOCUMENT + NS_DECL + PsiElement(KEYWORD_DEFAULT)('default') + PsiWhiteSpace(' ') + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('rng') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://relaxng.org/ns/structure/1.0"') + PsiWhiteSpace('\n') + NS_DECL + PsiElement(KEYWORD_NAMESPACE)('namespace') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('local') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('""') + PsiWhiteSpace('\n') + DATATYPES_DECL + PsiElement(KEYWORD_DATATYPES)('datatypes') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('xsd') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PsiElement(LITERAL)('"http://www.w3.org/2001/XMLSchema-datatypes"') + PsiWhiteSpace('\n\n') + GRAMMAR_PATTERN + START + PsiElement(KEYWORD_START)('start') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('pattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('nameQName') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('nameClass') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('pattern') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('nameQName') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('nameClass') + PsiElement())(')') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('pattern') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS_CHOICE + NAME_CLASS + PsiElement(IDENTIFIER)('group') + PsiElement(|)('|') + NAME_CLASS + PsiElement(IDENTIFIER)('interleave') + PsiElement(|)('|') + NAME_CLASS + PsiElement(IDENTIFIER)('choice') + PsiElement(|)('|') + NAME_CLASS + PsiElement(IDENTIFIER)('optional') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + NAME_CLASS + PsiElement(IDENTIFIER)('zeroOrMore') + PsiElement(|)('|') + NAME_CLASS + PsiElement(IDENTIFIER)('oneOrMore') + PsiElement(|)('|') + NAME_CLASS + PsiElement(KEYWORD_LIST)('list') + PsiElement(|)('|') + NAME_CLASS + PsiElement(KEYWORD_MIXED)('mixed') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('pattern') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS_CHOICE + NAME_CLASS + PsiElement(IDENTIFIER)('ref') + PsiElement(|)('|') + NAME_CLASS + PsiElement(IDENTIFIER)('parentRef') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('nameNCName') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS_CHOICE + NAME_CLASS + PsiElement(KEYWORD_EMPTY)('empty') + PsiElement(|)('|') + NAME_CLASS + PsiElement(KEYWORD_NOTALLOWED)('notAllowed') + PsiElement(|)('|') + NAME_CLASS + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('data') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('type') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('param') + PsiElement(*)('*') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('exceptPattern') + PsiElement(?)('?') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('value') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('commonAttributes') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('type') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('externalRef') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('href') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(KEYWORD_GRAMMAR)('grammar') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('grammarContent') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('param') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('param') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('commonAttributes') + PsiElement(,)(',') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('nameNCName') + PsiElement(,)(',') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('exceptPattern') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('except') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('pattern') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('grammarContent') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('definition') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('grammarContent') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(KEYWORD_INCLUDE)('include') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('href') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('includeContent') + PsiElement(*)('*') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('includeContent') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('definition') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(KEYWORD_DIV)('div') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('includeContent') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('definition') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(KEYWORD_START)('start') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('combine') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('pattern') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('define') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('nameNCName') + PsiElement(,)(',') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('combine') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace(' ') + GROUP_PATTERN + PsiElement(()('(') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('pattern') + PsiElement(+)('+') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('combine') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('combine') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + CHOICE + DATATYPE_PATTERN + PsiElement(LITERAL)('"choice"') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + PsiElement(LITERAL)('"interleave"') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('nameClass') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + CHOICE + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('commonAttributes') + PsiElement(,)(',') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:QName') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('anyName') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('exceptNameClass') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('nsName') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + OPTIONAL + REF_PATTERN + PsiElement(IDENTIFIER)('exceptNameClass') + PsiElement(?)('?') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('choice') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('nameClass') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('exceptNameClass') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('except') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + INTERLEAVE + REF_PATTERN + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(&)('&') + PsiWhiteSpace(' ') + ONE_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('nameClass') + PsiElement(+)('+') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('nameQName') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:QName') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('nameNCName') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('name') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NCName') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('href') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('href') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:anyURI') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('type') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('type') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:NCName') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('common') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + SEQUENCE + REF_PATTERN + PsiElement(IDENTIFIER)('commonAttributes') + PsiElement(,)(',') + PsiWhiteSpace(' ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('foreignElement') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('commonAttributes') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace('\n ') + SEQUENCE + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('ns') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:string') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + OPTIONAL + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(IDENTIFIER)('datatypeLibrary') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + DATATYPE_PATTERN + NAME + PsiElement(PREFIXED_NAME)('xsd:anyURI') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(?)('?') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + ZERO_OR_MORE + REF_PATTERN + PsiElement(IDENTIFIER)('foreignAttribute') + PsiElement(*)('*') + PsiWhiteSpace('\n\n') + DEFINE + PsiElement(IDENTIFIER)('foreignElement') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(*)('*') + PsiWhiteSpace(' ') + EXCEPT_NAME_CLASS + PsiElement(-)('-') + PsiWhiteSpace(' ') + NAME_CLASS + NAME + PsiElement(PREFIX_STAR)('rng:*') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('anyAttribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('anyElement') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('foreignAttribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(*)('*') + PsiWhiteSpace(' ') + EXCEPT_NAME_CLASS + PsiElement(-)('-') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(()('(') + NAME_CLASS_CHOICE + NAME_CLASS + NAME + PsiElement(PREFIX_STAR)('rng:*') + PsiElement(|)('|') + NAME_CLASS + NAME + PsiElement(PREFIX_STAR)('local:*') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('anyElement') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ELEMENT)('element') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + ZERO_OR_MORE + GROUP_PATTERN + PsiElement(()('(') + CHOICE + REF_PATTERN + PsiElement(IDENTIFIER)('anyAttribute') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(|)('|') + PsiWhiteSpace(' ') + REF_PATTERN + PsiElement(IDENTIFIER)('anyElement') + PsiElement())(')') + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n') + DEFINE + PsiElement(IDENTIFIER)('anyAttribute') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + PATTERN + PsiElement(KEYWORD_ATTRIBUTE)('attribute') + PsiWhiteSpace(' ') + NAME_CLASS + PsiElement(*)('*') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace(' ') + TEXT_PATTERN + PsiElement(KEYWORD_TEXT)('text') + PsiWhiteSpace(' ') + PsiElement(})('}') \ No newline at end of file diff --git a/plugins/relaxng/testData/parsing/psi/complex/basic_properties.rnc b/plugins/relaxng/testData/parsing/psi/complex/basic_properties.rnc new file mode 100644 index 000000000000..ed2ce425bda6 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/basic_properties.rnc @@ -0,0 +1,648 @@ +# ========================================================= +# +# (c) 2004, RenderX +# +# Author: Alexander Peshkov +# +# Permission is granted to use this document, copy and +# modify free of charge, provided that every derived work +# bear a reference to the present document. +# +# This document contains a computer program written in +# XSL Transformations Language. It is published with no +# warranty of any kind about its usability, as a mere +# example of XSL technology. RenderX shall not be +# considered liable for any damage or loss of data caused +# by use of this program. +# +# ========================================================= + +namespace local = "" +default namespace fo = "http://www.w3.org/1999/XSL/Format" +namespace rx = "http://www.renderx.com/XSL/Extensions" + +include "datatype.rnc" + +# =============================================================== +# Common properties content models used by several attributes +# =============================================================== +border-style.attr-content = + "none" + | "hidden" + | "dotted" + | "dashed" + | "solid" + | "double" + | "groove" + | "ridge" + | "inset" + | "outset" + | "inherit" + +orientation.attr-content = + "0" + | "90" + | "180" + | "270" + | "-90" + | "-180" + | "-270" + | "0deg" + | "90deg" + | "180deg" + | "270deg" + | "-90deg" + | "-180deg" + | "-270deg" + | "inherit" + +keep.attr-content = "auto" | "always" | integer.datatype + +# =============================================================== +# Definitions of all the attributes (properties) used in XSL FO +# includeing those from RX extensions +# (definitions of attributes bearing 'rx' namespace named as rx-..., +# but sorted according to the actual attribute name) +# =============================================================== +absolute-position.attr = attribute absolute-position { + "absolute" | "fixed" + } +#MEMO: We forced to separate this property from actual 'absolute-position' +container-position.attr = attribute absolute-position { + "auto" | "inherit" | expr.datatype + } + +active-state.attr = attribute active-state { + "link" | "visited" | "active" | "hover" | "focus" | expr.datatype + } +alignment-adjust.attr = attribute alignment-adjust { text | expr.datatype } +alignment-baseline.attr = attribute alignment-baseline { + "auto" + | "baseline" + | "before-edge" + | "text-before-edge" + | "middle" + | "central" + | "after-edge" + | "text-after-edge" + | "top" + | "text-top" + | "bottom" + | "text-bottom" + | "ideographic" + | "alphabetic" + | "hanging" + | "mathematical" + | "inherit" + | expr.datatype + } +auto-restore.attr = attribute auto-restore { "true" | "false" | expr.datatype } +azimuth.attr = attribute azimuth { text | expr.datatype } +background.attr = attribute background { text | expr.datatype } +background-attachment.attr = attribute background-attachment { "scroll" | "fixed" | "inherit" | expr.datatype } +background-color.attr = attribute background-color { text | expr.datatype } +background-image.attr = attribute background-image { text | expr.datatype } +background-position.attr = attribute background-position { text | expr.datatype } +background-position-horizontal.attr = attribute background-position-horizontal { text | expr.datatype } +background-position-vertical.attr = attribute background-position-vertical { text | expr.datatype } +background-repeat.attr = attribute background-repeat { + "repeat" | "repeat-x" | "repeat-y" | "no-repeat" | "inherit" | expr.datatype + } +#RenderX extension attributes +rx-background-content-type.attr = attribute rx:background-content-type { text | expr.datatype } +rx-background-content-height.attr = attribute rx:background-content-height { text | expr.datatype } +rx-background-content-width.attr = attribute rx:background-content-width { text | expr.datatype } +rx-background-scaling.attr = attribute rx:background-scaling { "uniform" | "non-uniform" | expr.datatype } + +baseline-shift.attr = attribute baseline-shift { text | expr.datatype } +blank-or-not-blank.attr = attribute blank-or-not-blank { + "blank" | "not-blank" | "any" | "inherit" | expr.datatype + } +block-progression-dimension.attr = attribute block-progression-dimension { text | expr.datatype } +block-progression-dimension.maximum.attr = attribute block-progression-dimension.maximum { text | expr.datatype } +block-progression-dimension.minimum.attr = attribute block-progression-dimension.minimum { text | expr.datatype } +block-progression-dimension.optimum.attr = attribute block-progression-dimension.optimum { text | expr.datatype } +border.attr = attribute border { text | expr.datatype } +border-after-color.attr = attribute border-after-color { text | expr.datatype } +border-after-precedence.attr = attribute border-after-precedence { text | expr.datatype } +border-after-style.attr = attribute border-after-style { border-style.attr-content | expr.datatype } +border-after-width.attr = attribute border-after-width { text | expr.datatype } +border-after-width.conditionality.attr = attribute border-after-width.conditionality { "discard" | "retain" | expr.datatype } +border-after-width.length.attr = attribute border-after-width.length { text | expr.datatype } +border-before-color.attr = attribute border-before-color { text | expr.datatype } +border-before-precedence.attr = attribute border-before-precedence { text | expr.datatype } +border-before-style.attr = attribute border-before-style { border-style.attr-content | expr.datatype } +border-before-width.attr = attribute border-before-width { text | expr.datatype } +border-before-width.conditionality.attr = attribute border-before-width.conditionality { + "discard" | "retain" | expr.datatype + } +border-before-width.length.attr = attribute border-before-width.length { text | expr.datatype } +border-bottom.attr = attribute border-bottom { text | expr.datatype } +border-bottom-color.attr = attribute border-bottom-color { text | expr.datatype } +border-bottom-style.attr = attribute border-bottom-style { border-style.attr-content | expr.datatype } +border-bottom-width.attr = attribute border-bottom-width { text | expr.datatype } +border-bottom-width.conditionality.attr = attribute border-bottom-width.conditionality { + "discard" | "retain" | expr.datatype + } +border-bottom-width.length.attr = attribute border-bottom-width.length { text | expr.datatype } +border-collapse.attr = attribute border-collapse { + "collapse" | "collapse-with-precedence" | "separate" | "inherit" | expr.datatype + } +border-color.attr = attribute border-color { text | expr.datatype } +border-end-color.attr = attribute border-end-color { text | expr.datatype } +border-end-precedence.attr = attribute border-end-precedence { text | expr.datatype } +border-end-style.attr = attribute border-end-style { border-style.attr-content | expr.datatype } +border-end-width.attr = attribute border-end-width { text | expr.datatype } +border-end-width.conditionality.attr = attribute border-end-width.conditionality { "discard" | "retain" | expr.datatype } +border-end-width.length.attr = attribute border-end-width.length { text | expr.datatype } +border-left.attr = attribute border-left { text | expr.datatype } +border-left-color.attr = attribute border-left-color { text | expr.datatype } +border-left-style.attr = attribute border-left-style { border-style.attr-content | expr.datatype } +border-left-width.attr = attribute border-left-width { text | expr.datatype } +border-left-width.conditionality.attr = attribute border-left-width.conditionality { "discard" | "retain" | expr.datatype } +border-left-width.length.attr = attribute border-left-width.length { text | expr.datatype } +border-right.attr = attribute border-right { text | expr.datatype } +border-right-color.attr = attribute border-right-color { text | expr.datatype } +border-right-style.attr = attribute border-right-style { border-style.attr-content | expr.datatype } +border-right-width.attr = attribute border-right-width { text | expr.datatype } +border-right-width.conditionality.attr = attribute border-right-width.conditionality { "discard" | "retain" | expr.datatype } +border-right-width.length.attr = attribute border-right-width.length { text | expr.datatype } +border-separation.attr = attribute border-separation { text | expr.datatype } +border-separation.block-progression-direction.attr = attribute border-separation.block-progression-direction { text | expr.datatype } +border-separation.inline-progression-direction.attr = attribute border-separation.inline-progression-direction { text | expr.datatype } +border-spacing.attr = attribute border-spacing { text | expr.datatype } +border-start-color.attr = attribute border-start-color { text | expr.datatype } +border-start-precedence.attr = attribute border-start-precedence { text | expr.datatype } +border-start-style.attr = attribute border-start-style { border-style.attr-content | expr.datatype } +border-start-width.attr = attribute border-start-width { text | expr.datatype } +border-start-width.conditionality.attr = attribute border-start-width.conditionality { "discard" | "retain" | expr.datatype } +border-start-width.length.attr = attribute border-start-width.length { text | expr.datatype } +border-style.attr = attribute border-style { text | expr.datatype } +border-top.attr = attribute border-top { text | expr.datatype } +border-top-color.attr = attribute border-top-color { text | expr.datatype } +border-top-style.attr = attribute border-top-style { border-style.attr-content | expr.datatype } +border-top-width.attr = attribute border-top-width { text | expr.datatype } +border-top-width.conditionality.attr = attribute border-top-width.conditionality { "discard" | "retain" | expr.datatype } +border-top-width.length.attr = attribute border-top-width.length { text | expr.datatype } +border-width.attr = attribute border-width { text | expr.datatype } +bottom.attr = attribute bottom { text | expr.datatype } +break-after.attr = attribute break-after { + "auto" | "column" | "page" | "even-page" | "odd-page" | "inherit" | expr.datatype + } +break-before.attr = attribute break-before { + "auto" | "column" | "page" | "even-page" | "odd-page" | "inherit" | expr.datatype + } +caption-side.attr = attribute caption-side { + "before" + | "after" + | "start" + | "end" + | "top" + | "bottom" + | "left" + | "right" + | "inherit" + | expr.datatype + } +case-name.attr = attribute case-name { text | expr.datatype } +case-title.attr = attribute case-title { text | expr.datatype } +character.attr = attribute character { text } +clear.attr = attribute clear { + "start" | "end" | "left" | "right" | "both" | "none" | "inherit" | expr.datatype + } +clip.attr = attribute clip { shape.datatype | "auto" | "inherit" | expr.datatype } +collapse-subtree.attr = attribute collapse-subtree { "true" | "false" | expr.datatype } +color.attr = attribute color { text | expr.datatype } +color-profile-name.attr = attribute color-profile-name { text } +column-count.attr = attribute column-count { text | expr.datatype } +column-gap.attr = attribute column-gap { text | expr.datatype } +column-number.attr = attribute column-number { text | expr.datatype } +column-width.attr = attribute column-width { text | expr.datatype } +content-height.attr = attribute content-height { text | expr.datatype } +content-type.attr = attribute content-type { text | expr.datatype } +content-width.attr = attribute content-width { text | expr.datatype } +country.attr = attribute country { text | expr.datatype } +cue.attr = attribute cue { text | expr.datatype } +cue-after.attr = attribute cue-after { text | expr.datatype } +cue-before.attr = attribute cue-before { text | expr.datatype } +destination-placement-offset.attr = attribute destination-placement-offset { text | expr.datatype } +direction.attr = attribute direction { "ltr" | "rtl" | "inherit" | expr.datatype } +display-align.attr = attribute display-align { + "auto" | "before" | "center" | "after" | "inherit" | expr.datatype + } +dominant-baseline.attr = attribute dominant-baseline { + "auto" + | "use-script" + | "no-change" + | "reset-size" + | "ideographic" + | "alphabetic" + | "hanging" + | "mathematical" + | "central" + | "middle" + | "text-after-edge" + | "text-before-edge" + | "inherit" + | expr.datatype + } +elevation.attr = attribute elevation { text | expr.datatype } +empty-cells.attr = attribute empty-cells { "show" | "hide" | "inherit" | expr.datatype } +end-indent.attr = attribute end-indent { text | expr.datatype } +ends-row.attr = attribute ends-row { "true" | "false" | expr.datatype } +extent.attr = attribute extent { text | expr.datatype } +external-destination.attr = attribute external-destination { text | expr.datatype } +#MEMO: We have separated this property into the two (for side and before floats) +#MEMO: Float values "inside" and "outside" are RenderX extensions. +before-float.attr = attribute float { + "before" + } +side-float.attr = attribute float { + "start" | "end" | "left" | "right" | "none" | "inside" | "outside" | "inherit" | expr.datatype + } + flow-name.attr = attribute flow-name { text } +font.attr = attribute font { text | expr.datatype } +font-family.attr = attribute font-family { text | expr.datatype } +font-selection-strategy.attr = attribute font-selection-strategy { + "auto" | "character-by-character" | "inherit" | expr.datatype + } +font-size.attr = attribute font-size { text | expr.datatype } +font-size-adjust.attr = attribute font-size-adjust { text | expr.datatype } +font-stretch.attr = attribute font-stretch { + "normal" + | "wider" + | "narrower" + | "ultra-condensed" + | "extra-condensed" + | "condensed" + | "semi-condensed" + | "semi-expanded" + | "expanded" + | "extra-expanded" + | "ultra-expanded" + | "inherit" + | expr.datatype + } +font-style.attr = attribute font-style { + "normal" | "italic" | "oblique" | "backslant" | "inherit" | expr.datatype + } +font-variant.attr = attribute font-variant { "normal" | "small-caps" | "inherit" | expr.datatype } +font-weight.attr = attribute font-weight { + "normal" + | "bold" + | "bolder" + | "lighter" + | "inherit" + | "100" + | "200" + | "300" + | "400" + | "500" + | "600" + | "700" + | "800" + | "900" + | expr.datatype + } +force-page-count.attr = attribute force-page-count { + "auto" + | "even" + | "odd" + | "end-on-even" + | "end-on-odd" + | "no-force" + | "inherit" + | expr.datatype + } +format.attr = attribute format { text } +glyph-orientation-horizontal.attr = attribute glyph-orientation-horizontal { orientation.attr-content | expr.datatype } +glyph-orientation-vertical.attr = attribute glyph-orientation-vertical { orientation.attr-content | expr.datatype } +grouping-separator.attr = attribute grouping-separator { text } +grouping-size.attr = attribute grouping-size { text | expr.datatype } +height.attr = attribute height { text | expr.datatype } +hyphenate.attr = attribute hyphenate { "false" | "true" | "inherit" | expr.datatype } +hyphenation-character.attr = attribute hyphenation-character { text } +hyphenation-keep.attr = attribute hyphenation-keep { + "auto" | "column" | "page" | "inherit" | expr.datatype + } +hyphenation-ladder-count.attr = attribute hyphenation-ladder-count { text | expr.datatype } +hyphenation-push-character-count.attr = attribute hyphenation-push-character-count { text | expr.datatype } +hyphenation-remain-character-count.attr = attribute hyphenation-remain-character-count { text | expr.datatype } +id.attr = attribute id { text } +indicate-destination.attr = attribute indicate-destination { "true" | "false" | expr.datatype } +initial-page-number.attr = attribute initial-page-number { text | expr.datatype } +inline-progression-dimension.attr = attribute inline-progression-dimension { text | expr.datatype } +inline-progression-dimension.maximum.attr = attribute inline-progression-dimension.maximum { text | expr.datatype } +inline-progression-dimension.minimum.attr = attribute inline-progression-dimension.minimum { text | expr.datatype } +inline-progression-dimension.optimum.attr = attribute inline-progression-dimension.optimum { text | expr.datatype } +internal-destination.attr = attribute internal-destination { text } +intrusion-displace.attr = attribute intrusion-displace { + "auto" | "none" | "line" | "indent" | "block" | "inherit" | expr.datatype + } +keep-together.attr = attribute keep-together { keep.attr-content | expr.datatype } +keep-together.within-column.attr = attribute keep-together.within-column { keep.attr-content | expr.datatype } +keep-together.within-line.attr = attribute keep-together.within-line { keep.attr-content | expr.datatype } +keep-together.within-page.attr = attribute keep-together.within-page { keep.attr-content | expr.datatype } +keep-with-next.attr = attribute keep-with-next { keep.attr-content | expr.datatype } +keep-with-next.within-column.attr = attribute keep-with-next.within-column { keep.attr-content | expr.datatype } +keep-with-next.within-line.attr = attribute keep-with-next.within-line { keep.attr-content | expr.datatype } +keep-with-next.within-page.attr = attribute keep-with-next.within-page { keep.attr-content | expr.datatype } +keep-with-previous.attr = attribute keep-with-previous { keep.attr-content | expr.datatype } +keep-with-previous.within-column.attr = attribute keep-with-previous.within-column { keep.attr-content | expr.datatype } +keep-with-previous.within-line.attr = attribute keep-with-previous.within-line { keep.attr-content | expr.datatype } +keep-with-previous.within-page.attr = attribute keep-with-previous.within-page { keep.attr-content | expr.datatype } +#RenderX extension attribute +rx-key.attr = attribute rx:key { text } +language.attr = attribute language { text | expr.datatype } +last-line-end-indent.attr = attribute last-line-end-indent { text | expr.datatype } +leader-alignment.attr = attribute leader-alignment { + "none" | "reference-area" | "page" | "inherit" | expr.datatype + } +leader-length.attr = attribute leader-length { text | expr.datatype } +leader-length.maximum.attr = attribute leader-length.maximum { text | expr.datatype } +leader-length.minimum.attr = attribute leader-length.minimum { text | expr.datatype } +leader-length.optimum.attr = attribute leader-length.optimum { text | expr.datatype } +leader-pattern.attr = attribute leader-pattern { + "space" | "rule" | "dots" | "use-content" | "inherit" | expr.datatype + } +leader-pattern-width.attr = attribute leader-pattern-width { text | expr.datatype } +left.attr = attribute left { text | expr.datatype } +letter-spacing.attr = attribute letter-spacing { text | expr.datatype } +letter-spacing.conditionality.attr = attribute letter-spacing.conditionality { "retain" | "discard" | expr.datatype } +letter-spacing.maximum.attr = attribute letter-spacing.maximum { text | expr.datatype } +letter-spacing.minimum.attr = attribute letter-spacing.minimum { text | expr.datatype } +letter-spacing.optimum.attr = attribute letter-spacing.optimum { text | expr.datatype } +letter-spacing.precedence.attr = attribute letter-spacing.precedence { text | expr.datatype } +letter-value.attr = attribute letter-value { "auto" | "alphabetic" | "traditional" | expr.datatype } +line-height.attr = attribute line-height { text | expr.datatype } +line-height-shift-adjustment.attr = attribute line-height-shift-adjustment { text | expr.datatype } +line-height.conditionality.attr = attribute line-height.conditionality { "retain" | "discard" | expr.datatype } +line-height.maximum.attr = attribute line-height.maximum { text | expr.datatype } +line-height.minimum.attr = attribute line-height.minimum { text | expr.datatype } +line-height.optimum.attr = attribute line-height.optimum { text | expr.datatype } +line-height.precedence.attr = attribute line-height.precedence { text | expr.datatype } +line-stacking-strategy.attr = attribute line-stacking-strategy { + "line-height" | "font-height" | "max-height" | "inherit" | expr.datatype + } +linefeed-treatment.attr = attribute linefeed-treatment { + "ignore" + | "preserve" + | "treat-as-space" + | "treat-as-zero-width-space" + | "inherit" + | expr.datatype + } +link-back.attr = attribute link-back { text | expr.datatype } +list-separator.attr = attribute list-separator { text } +margin.attr = attribute margin { text | expr.datatype } +margin-bottom.attr = attribute margin-bottom { text | expr.datatype } +margin-left.attr = attribute margin-left { text | expr.datatype } +margin-right.attr = attribute margin-right { text | expr.datatype } +margin-top.attr = attribute margin-top { text | expr.datatype } +marker-class-name.attr = attribute marker-class-name { text } +master-name.attr = attribute master-name { text } +master-reference.attr = attribute master-reference { text } +max-height.attr = attribute max-height { text | expr.datatype } +max-width.attr = attribute max-width { text | expr.datatype } +maximum-repeats.attr = attribute maximum-repeats { text | expr.datatype } +media-usage.attr = attribute media-usage { + "auto" | "paginate" | "bounded-in-one-dimension" | "unbounded" | expr.datatype + } +merge-subsequent-page-numbers.attr = attribute merge-subsequent-page-numbers { text | expr.datatype } +min-height.attr = attribute min-height { text | expr.datatype } +min-width.attr = attribute min-width { text | expr.datatype } +#NOTE: It's RenderX extension attribute (belongs to rx:meta-field). It enumerates values currently available in XEP +name.attr = attribute name { + "author" | "title" | "subject" | "keywords" | expr.datatype + } +number-columns-repeated.attr = attribute number-columns-repeated { text | expr.datatype } +number-columns-spanned.attr = attribute number-columns-spanned { text | expr.datatype } +number-rows-spanned.attr = attribute number-rows-spanned { text | expr.datatype } +odd-or-even.attr = attribute odd-or-even { "odd" | "even" | "any" | "inherit" | expr.datatype } +rx-table-omit-initial-header.attr = attribute rx:table-omit-initial-header { "true" | "false" | expr.datatype } +orphans.attr = attribute orphans { text | expr.datatype } +overflow.attr = attribute overflow { + "visible" + | "hidden" + | "scroll" + | "auto" + | "error-if-overflow" + | "inherit" | expr.datatype + } +padding.attr = attribute padding { text | expr.datatype } +padding-after.attr = attribute padding-after { text | expr.datatype } +padding-after.conditionality.attr = attribute padding-after.conditionality { "discard" | "retain" | expr.datatype } +padding-after.length.attr = attribute padding-after.length { text | expr.datatype } +padding-before.attr = attribute padding-before { text | expr.datatype } +padding-before.conditionality.attr = attribute padding-before.conditionality { "discard" | "retain" | expr.datatype } +padding-before.length.attr = attribute padding-before.length { text | expr.datatype } +padding-bottom.attr = attribute padding-bottom { text | expr.datatype } +padding-bottom.conditionality.attr = attribute padding-bottom.conditionality { "discard" | "retain" | expr.datatype } +padding-bottom.length.attr = attribute padding-bottom.length { text | expr.datatype } +padding-end.attr = attribute padding-end { text | expr.datatype } +padding-end.conditionality.attr = attribute padding-end.conditionality { "discard" | "retain" | expr.datatype } +padding-end.length.attr = attribute padding-end.length { text | expr.datatype } +padding-left.attr = attribute padding-left { text | expr.datatype } +padding-left.conditionality.attr = attribute padding-left.conditionality { "discard" | "retain" | expr.datatype } +padding-left.length.attr = attribute padding-left.length { text | expr.datatype } +padding-right.attr = attribute padding-right { text | expr.datatype } +padding-right.conditionality.attr = attribute padding-right.conditionality { "discard" | "retain" | expr.datatype } +padding-right.length.attr = attribute padding-right.length { text | expr.datatype } +padding-start.attr = attribute padding-start { text | expr.datatype } +padding-start.conditionality.attr = attribute padding-start.conditionality { "discard" | "retain" | expr.datatype } +padding-start.length.attr = attribute padding-start.length { text | expr.datatype } +padding-top.attr = attribute padding-top { text | expr.datatype } +padding-top.conditionality.attr = attribute padding-top.conditionality { "discard" | "retain" | expr.datatype } +padding-top.length.attr = attribute padding-top.length { text | expr.datatype } +page-break-after.attr = attribute page-break-after { + "auto" | "always" | "avoid" | "left" | "right" | "inherit" | expr.datatype + } +page-break-before.attr = attribute page-break-before { + "auto" | "always" | "avoid" | "left" | "right" | "inherit" | expr.datatype + } +page-break-inside.attr = attribute page-break-inside { "avoid" | "auto" | "inherit" | expr.datatype } +page-height.attr = attribute page-height { text | expr.datatype } +page-position.attr = attribute page-position { + "first" | "last" | "rest" | "any" | "inherit" | expr.datatype + } +page-width.attr = attribute page-width { text | expr.datatype } +pause.attr = attribute pause { text | expr.datatype } +pause-after.attr = attribute pause-after { text | expr.datatype } +pause-before.attr = attribute pause-before { text | expr.datatype } +pitch.attr = attribute pitch { text | expr.datatype } +pitch-range.attr = attribute pitch-range { text | expr.datatype } +play-during.attr = attribute play-during { text | expr.datatype } +#MEMO: We forced to devide this shorthand since we have separate absolute-container element +absolute-position-shorthand.attr = attribute position { + "absolute" | "fixed" + } +relative-position-shorthand.attr = attribute position { + "static" | "relative" | "inherit" | expr.datatype + } +precedence.attr = attribute precedence { "true" | "false" | "inherit" | expr.datatype } +provisional-distance-between-starts.attr = attribute provisional-distance-between-starts { text | expr.datatype } +provisional-label-separation.attr = attribute provisional-label-separation { text | expr.datatype } +range-separator.attr = attribute range-separator { text } +ref-id.attr = attribute ref-id { text } +ref-key.attr = attribute ref-key { text } +reference-orientation.attr = attribute reference-orientation { orientation.attr-content | expr.datatype } +region-name.attr = attribute region-name { text } +relative-align.attr = attribute relative-align { "before" | "baseline" | "inherit" | expr.datatype } +relative-position.attr = attribute relative-position { + "auto" | "static" | "relative" | "inherit" | expr.datatype + } +rendering-intent.attr = attribute rendering-intent { + "auto" | "perceptual" | "relative-colorimetric" | "saturation" | "absolute-colorimetric" | "inherit" | expr.datatype + }? +retrieve-boundary.attr = attribute retrieve-boundary { "page" | "page-sequence" | "document" | expr.datatype } +retrieve-class-name.attr = attribute retrieve-class-name { text } +retrieve-position.attr = attribute retrieve-position { + "first-starting-within-page" + | "first-including-carryover" + | "last-starting-within-page" + | "last-ending-within-page" + | expr.datatype + } +richness.attr = attribute richness { text | expr.datatype } +right.attr = attribute right { text | expr.datatype } +role.attr = attribute role { text } +rule-style.attr = attribute rule-style { + "none" + | "dotted" + | "dashed" + | "solid" + | "double" + | "groove" + | "ridge" + | "inherit" + | expr.datatype + } +rule-thickness.attr = attribute rule-thickness { text | expr.datatype } +scaling.attr = attribute scaling { "uniform" | "non-uniform" | "inherit" | expr.datatype } +scaling-method.attr = attribute scaling-method { + "auto" | "integer-pixels" | "resample-any-method" | "inherit" | expr.datatype + } +score-spaces.attr = attribute score-spaces { "true" | "false" | "inherit" | expr.datatype } +script.attr = attribute script { text | expr.datatype } +show-destination.attr = attribute show-destination { "replace" | "new" | expr.datatype } +size.attr = attribute size { text | expr.datatype } +source-document.attr = attribute source-document { text } +space-after.attr = attribute space-after { text | expr.datatype } +space-after.conditionality.attr = attribute space-after.conditionality { "retain" | "discard" | expr.datatype } +space-after.maximum.attr = attribute space-after.maximum { text | expr.datatype } +space-after.minimum.attr = attribute space-after.minimum { text | expr.datatype } +space-after.optimum.attr = attribute space-after.optimum { text | expr.datatype } +space-after.precedence.attr = attribute space-after.precedence { text | expr.datatype } +space-before.attr = attribute space-before { text | expr.datatype } +space-before.conditionality.attr = attribute space-before.conditionality { "retain" | "discard" | expr.datatype } +space-before.maximum.attr = attribute space-before.maximum { text | expr.datatype } +space-before.minimum.attr = attribute space-before.minimum { text | expr.datatype } +space-before.optimum.attr = attribute space-before.optimum { text | expr.datatype } +space-before.precedence.attr = attribute space-before.precedence { text | expr.datatype } +space-end.attr = attribute space-end { text | expr.datatype } +space-end.conditionality.attr = attribute space-end.conditionality { "retain" | "discard" | expr.datatype } +space-end.maximum.attr = attribute space-end.maximum { text | expr.datatype } +space-end.minimum.attr = attribute space-end.minimum { text | expr.datatype } +space-end.optimum.attr = attribute space-end.optimum { text | expr.datatype } +space-end.precedence.attr = attribute space-end.precedence { text | expr.datatype } +space-start.attr = attribute space-start { text | expr.datatype } +space-start.conditionality.attr = attribute space-start.conditionality { "retain" | "discard" | expr.datatype } +space-start.maximum.attr = attribute space-start.maximum { text | expr.datatype } +space-start.minimum.attr = attribute space-start.minimum { text | expr.datatype } +space-start.optimum.attr = attribute space-start.optimum { text | expr.datatype } +space-start.precedence.attr = attribute space-start.precedence { text | expr.datatype } +span.attr = attribute span { "none" | "all" | "inherit" | expr.datatype } +speak.attr = attribute speak { "normal" | "none" | "spell-out" | "inherit" | expr.datatype } +speak-header.attr = attribute speak-header { "once" | "always" | "inherit" | expr.datatype } +speak-numeral.attr = attribute speak-numeral { "digits" | "continuous" | "inherit" | expr.datatype } +speak-punctuation.attr = attribute speak-punctuation { "code" | "none" | "inherit" | expr.datatype } +speech-rate.attr = attribute speech-rate { text | expr.datatype } +src.attr = attribute src { text | expr.datatype } +start-indent.attr = attribute start-indent { text | expr.datatype } +starting-state.attr = attribute starting-state { text | expr.datatype } +starts-row.attr = attribute starts-row { "true" | "false" | expr.datatype } +stress.attr = attribute stress { text | expr.datatype } +suppress-at-line-break.attr = attribute suppress-at-line-break { + "auto" | "suppress" | "retain" | "inherit" | expr.datatype + } +switch-to.attr = attribute switch-to { text | expr.datatype } +table-layout.attr = attribute table-layout { "auto" | "fixed" | "inherit" | expr.datatype } +table-omit-footer-at-break.attr = attribute table-omit-footer-at-break { "true" | "false" | "inherit" | expr.datatype } +table-omit-header-at-break.attr = attribute table-omit-header-at-break { + "true" | "false" | "inherit" | expr.datatype + } +target-presentation-context.attr = attribute target-presentation-context { text } +target-processing-context.attr = attribute target-processing-context { text } +target-stylesheet.attr = attribute target-stylesheet { text } +#MEMO: values are temporarily excluded from text-align and text-align-last +text-align.attr = attribute text-align { + "start" + | "center" + | "end" + | "justify" + | "inside" + | "outside" + | "left" + | "right" + | "inherit" + | expr.datatype + } +text-align-last.attr = attribute text-align-last { + "relative" + | "start" + | "center" + | "end" + | "justify" + | "inside" + | "outside" + | "left" + | "right" + | "inherit" + | expr.datatype + } +text-altitude.attr = attribute text-altitude { text | expr.datatype } +text-decoration.attr = attribute text-decoration { xsd:NMTOKENS | expr.datatype } +text-depth.attr = attribute text-depth { text | expr.datatype } +text-indent.attr = attribute text-indent { text | expr.datatype } +text-shadow.attr = attribute text-shadow { text | expr.datatype } +text-transform.attr = attribute text-transform { + "capitalize" | "uppercase" | "lowercase" | "none" | "inherit" | expr.datatype + } +top.attr = attribute top { text | expr.datatype } +treat-as-word-space.attr = attribute treat-as-word-space { + "auto" | "true" | "false" | "inherit" | expr.datatype + } +unicode-bidi.attr = attribute unicode-bidi { + "normal" | "embed" | "bidi-override" | "inherit" | expr.datatype + } +value.attr = attribute value { text } +vertical-align.attr = attribute vertical-align { text | expr.datatype } +visibility.attr = attribute visibility { + "visible" | "hidden" | "collapse" | "inherit" | expr.datatype + } +voice-family.attr = attribute voice-family { text | expr.datatype } +volume.attr = attribute volume { text | expr.datatype } +white-space.attr = attribute white-space { "normal" | "pre" | "nowrap" | "inherit" | expr.datatype } +white-space-collapse.attr = attribute white-space-collapse { "false" | "true" | "inherit" | expr.datatype } +white-space-treatment.attr = attribute white-space-treatment { + "ignore" + | "preserve" + | "ignore-if-before-linefeed" + | "ignore-if-after-linefeed" + | "ignore-if-surrounding-linefeed" + | "inherit" + | expr.datatype + } +widows.attr = attribute widows { text | expr.datatype } +width.attr = attribute width { text | expr.datatype } +word-spacing.attr = attribute word-spacing { text | expr.datatype } +word-spacing.conditionality.attr = attribute word-spacing.conditionality { "retain" | "discard" | expr.datatype } +word-spacing.maximum.attr = attribute word-spacing.maximum { text | expr.datatype } +word-spacing.minimum.attr = attribute word-spacing.minimum { text | expr.datatype } +word-spacing.optimum.attr = attribute word-spacing.optimum { text | expr.datatype } +word-spacing.precedence.attr = attribute word-spacing.precedence { text | expr.datatype } +wrap-option.attr = attribute wrap-option { "no-wrap" | "wrap" | "inherit" | expr.datatype } +writing-mode.attr = attribute writing-mode { + "lr-tb" | "rl-tb" | "tb-rl" | "lr" | "rl" | "tb" | "inherit" | expr.datatype + } +z-index.attr = attribute z-index { text | expr.datatype } diff --git a/plugins/relaxng/testData/parsing/psi/complex/properties_groups.rnc b/plugins/relaxng/testData/parsing/psi/complex/properties_groups.rnc new file mode 100644 index 000000000000..dab15a764859 --- /dev/null +++ b/plugins/relaxng/testData/parsing/psi/complex/properties_groups.rnc @@ -0,0 +1,562 @@ +# ========================================================= +# +# (c) 2004, RenderX +# +# Author: Alexander Peshkov +# +# Permission is granted to use this document, copy and +# modify free of charge, provided that every derived work +# bear a reference to the present document. +# +# This document contains a computer program written in +# XSL Transformations Language. It is published with no +# warranty of any kind about its usability, as a mere +# example of XSL technology. RenderX shall not be +# considered liable for any damage or loss of data caused +# by use of this program. +# +# ========================================================= + +namespace local = "" +default namespace fo = "http://www.w3.org/1999/XSL/Format" +namespace rx = "http://www.renderx.com/XSL/Extensions" + +include "basic_properties.rnc" + +# =============================================================== +# Properties grouping. Groups used by different elements classes +# =============================================================== + + +# =============================================================== +# Entity definitions for common groups of properties +# This grouping reflects properties co occurrence, rather than +# property semantics. It does not correspond to grouping in the +# spec. +# =============================================================== + +# Accessibility Properties +accessibility-properties = + source-document.attr?, + role.attr? +#MEMO: XSLFO is selfcontradictory: +# Those properties allowed on all inline elements excep to for fo:character, fo:bidi-override and fo:inline-conteiner +# At the same time spec says about those properties: +# XSL> It is used by all formatting objects that can be contained in fo:flow or fo:static-content (all formatting +# XSL> objects that can be directly created from an XML source element). +# Thus they must be present on fo:character, fo:bidi-override, fo:inline-conteiner as well +# (there are more elements missing these properties) +# Note also, that comment in the round brackets seems to be meaningless. + +# Relative Position Properties +# 'position' shorthand property also makes part of this group +relative-position-properties = + relative-position.attr?, + relative-position-shorthand.attr? + +# Absolute Position Properties +absolute-position-properties = + absolute-position.attr, + absolute-position-shorthand.attr?, + top.attr?, + right.attr?, + bottom.attr?, + left.attr? + +# Aural Properties +# 'cue' and 'pause' shorthand properties are also included +#MEMO: XSLFO is selfcontradictory here in the same way +# it is for Accessibility Properties - Aural properties allowed everywhere +# but yet not specified on some elements, e.g. fo:block-container or fo:inline-container. +# We believe this is an omission and therefor those properties are available everywhere. +aural-properties-inheritable = + azimuth.attr?, + elevation.attr?, + pitch.attr?, + pitch-range.attr?, + play-during.attr?, + richness.attr?, + speak.attr?, + speak-header.attr?, + speak-numeral.attr?, + speak-punctuation.attr?, + speech-rate.attr?, + stress.attr?, + voice-family.attr?, + volume.attr? +aural-properties-unheritable = + cue.attr?, + cue-after.attr?, + cue-before.attr?, + pause.attr?, + pause-after.attr?, + pause-before.attr? +aural-properties = aural-properties-inheritable, aural-properties-unheritable + +# Common Border, Padding, and Background Properties +# Related shorthand properties are also included +border-properties = + border.attr?, + border-after-color.attr?, + border-after-style.attr?, + border-after-width.attr?, + border-after-width.length.attr?, + border-after-width.conditionality.attr?, + border-before-color.attr?, + border-before-style.attr?, + border-before-width.attr?, + border-before-width.length.attr?, + border-before-width.conditionality.attr?, + border-bottom.attr?, + border-bottom-color.attr?, + border-bottom-style.attr?, + border-bottom-width.attr?, + border-bottom-width.length.attr?, + border-bottom-width.conditionality.attr?, + border-color.attr?, + border-end-color.attr?, + border-end-style.attr?, + border-end-width.attr?, + border-end-width.length.attr?, + border-end-width.conditionality.attr?, + border-left.attr?, + border-left-color.attr?, + border-left-style.attr?, + border-left-width.attr?, + border-left-width.length.attr?, + border-left-width.conditionality.attr?, + border-right.attr?, + border-right-color.attr?, + border-right-style.attr?, + border-right-width.attr?, + border-right-width.length.attr?, + border-right-width.conditionality.attr?, + border-start-color.attr?, + border-start-style.attr?, + border-start-width.attr?, + border-start-width.length.attr?, + border-start-width.conditionality.attr?, + border-style.attr?, + border-top.attr?, + border-top-color.attr?, + border-top-style.attr?, + border-top-width.attr?, + border-top-width.length.attr?, + border-top-width.conditionality.attr?, + border-width.attr? + +padding-properties = + padding.attr?, + padding-after.attr?, + padding-after.length.attr?, + padding-after.conditionality.attr?, + padding-before.attr?, + padding-before.length.attr?, + padding-before.conditionality.attr?, + padding-bottom.attr?, + padding-bottom.length.attr?, + padding-bottom.conditionality.attr?, + padding-end.attr?, + padding-end.length.attr?, + padding-end.conditionality.attr?, + padding-left.attr?, + padding-left.length.attr?, + padding-left.conditionality.attr?, + padding-right.attr?, + padding-right.length.attr?, + padding-right.conditionality.attr?, + padding-start.attr?, + padding-start.length.attr?, + padding-start.conditionality.attr?, + padding-top.attr?, + padding-top.length.attr?, + padding-top.conditionality.attr? + +background-properties = + background.attr?, + background-attachment.attr?, + background-color.attr?, + background-image.attr?, + background-position.attr?, + background-position-vertical.attr?, + background-position-horizontal.attr?, + background-repeat.attr?, + rx-background-content-type.attr?, + rx-background-content-height.attr?, + rx-background-content-width.attr?, + rx-background-scaling.attr? + +border-padding-background-properties = + border-properties, + padding-properties, + background-properties + +# Border Precedence Properties for tables +border-precedence-properties = + border-after-precedence.attr?, + border-before-precedence.attr?, + border-end-precedence.attr?, + border-start-precedence.attr? + +# Box Size Properties +height-properties = + height.attr?, + min-height.attr?, + max-height.attr?, + block-progression-dimension.attr?, + block-progression-dimension.minimum.attr?, + block-progression-dimension.optimum.attr?, + block-progression-dimension.maximum.attr? + +width-properties = + width.attr?, + min-width.attr?, + max-width.attr?, + inline-progression-dimension.attr?, + inline-progression-dimension.minimum.attr?, + inline-progression-dimension.optimum.attr?, + inline-progression-dimension.maximum.attr? + +box-size-properties = + height-properties, + width-properties + +# Common Area Properties +area-properties-inheritable = + display-align.attr?, + reference-orientation.attr?, + writing-mode.attr? +area-properties-unheritable = + clip.attr?, + overflow.attr? +area-properties = area-properties-inheritable, area-properties-unheritable + +# Common Font Properties +# 'font' shorthand property is also included +font-properties = + font.attr?, + font-selection-strategy.attr?, + font-family.attr?, + font-size.attr?, + font-size-adjust.attr?, + font-stretch.attr?, + font-style.attr?, + font-variant.attr?, + font-weight.attr? + +# Common Hyphenation Properties - Inline +# 'xml:lang' shorthand property is also included +hyphenation-properties-inline = + country.attr?, + language.attr?, + script.attr?, + attribute xml:lang { text }?, + hyphenate.attr?, + hyphenation-character.attr?, + hyphenation-push-character-count.attr?, + hyphenation-remain-character-count.attr? +# Common Hyphenation Properties - Block +hyphenation-properties-block = + hyphenation-keep.attr?, + hyphenation-ladder-count.attr? +hyphenation-properties = hyphenation-properties-inline, hyphenation-properties-block + +# Common CSS Margin Properties +# 'margin' shorthand property is also included +margin-properties-CSS = + margin.attr?, + margin-bottom.attr?, + margin-left.attr?, + margin-right.attr?, + margin-top.attr? + +# Common Margin Properties - Block +margin-properties-inheritable = + start-indent.attr?, + end-indent.attr? + +margin-properties-block = + margin-properties-CSS, + space-after.attr?, + space-after.minimum.attr?, + space-after.optimum.attr?, + space-after.maximum.attr?, + space-after.precedence.attr?, + space-after.conditionality.attr?, + space-before.attr?, + space-before.minimum.attr?, + space-before.optimum.attr?, + space-before.maximum.attr?, + space-before.precedence.attr?, + space-before.conditionality.attr? + +# Common Margin Properties - Inline +margin-properties-inline = + margin-properties-CSS, + space-start.attr?, + space-start.minimum.attr?, + space-start.optimum.attr?, + space-start.maximum.attr?, + space-start.precedence.attr?, + space-start.conditionality.attr?, + space-end.attr?, + space-end.minimum.attr?, + space-end.optimum.attr?, + space-end.maximum.attr?, + space-end.precedence.attr?, + space-end.conditionality.attr? + +# Area Alignment Properties +# 'vertical-align' shorthand is added +# 'relative-align' - excluded +area-alignment-properties = + alignment-adjust.attr?, + alignment-baseline.attr?, + baseline-shift.attr?, + dominant-baseline.attr?, + vertical-align.attr? + +# Line Height Properties +line-height-properties = + line-height.attr?, + line-height.minimum.attr?, + line-height.optimum.attr?, + line-height.maximum.attr?, + line-height.precedence.attr?, + line-height.conditionality.attr?, + line-height-shift-adjustment.attr? + +# Line Related Properties +line-related-properties = + text-align.attr?, + text-align-last.attr?, + text-indent.attr?, + last-line-end-indent.attr?, + line-stacking-strategy.attr?, + linefeed-treatment.attr?, + white-space.attr?, + white-space-treatment.attr?, + white-space-collapse.attr?, + wrap-option.attr?, + direction.attr? + +# Character Properties +character-properties-inheritable = + letter-spacing.attr?, + letter-spacing.minimum.attr?, + letter-spacing.optimum.attr?, + letter-spacing.maximum.attr?, + letter-spacing.precedence.attr?, + letter-spacing.conditionality.attr?, + word-spacing.attr?, + word-spacing.minimum.attr?, + word-spacing.optimum.attr?, + word-spacing.maximum.attr?, + word-spacing.precedence.attr?, + word-spacing.conditionality.attr?, + glyph-orientation-horizontal.attr?, + glyph-orientation-vertical.attr?, + score-spaces.attr?, + text-transform.attr? +character-properties-unheritable= +#MEMO: There is a problem with these two properties in XSL FO spec. +# They are assumed to be allowed everywhere but somehow on of them +# missing on fo:inline, another on fo:leader and both absent on fo:bidi-override. +# They are not present on fo:block also. +# We suppose that those omissions are erratic. and allow them on all elements that can cotain text. +# It makes sence to allow text-decoration on the graphical inlines also. + text-decoration.attr?, + text-shadow.attr? + #NOTE: Those properties apllies to char elements but they are already included into 'inheritable-properties' set + #font-properties, + #line-height-properties +character-properties = character-properties-inheritable, character-properties-unheritable + +# Common Keeps and Breaks Properties - Atomic objects +# Keeps only +keeps-properties-atomic = + keep-with-next.attr?, + keep-with-next.within-line.attr?, + keep-with-next.within-column.attr?, + keep-with-next.within-page.attr?, + keep-with-previous.attr?, + keep-with-previous.within-line.attr?, + keep-with-previous.within-column.attr?, + keep-with-previous.within-page.attr? + +# Common Keeps and Breaks Properties - Atomic objects +# Keeps and Breaks +# 'page-break-*' shorthand properties are also included +keeps-and-breaks-properties-atomic = + keeps-properties-atomic, + break-after.attr?, + break-before.attr?, + page-break-after.attr?, + page-break-before.attr? + +# Common Keeps and Breaks Properties - Inline +# 'page-break-inside' shorthand property is also included +keeps-and-breaks-properties-inline-inheritable = + keep-together.attr?, + keep-together.within-line.attr?, + keep-together.within-column.attr?, + keep-together.within-page.attr?, + page-break-inside.attr? + +#MEMO: Do we really need separate block and inline groups here + +# Common Keeps and Breaks Properties - Block +keeps-and-breaks-properties-block-inheritable = + orphans.attr?, + widows.attr? + +# Leader and Rule Properties +leader-properties = + leader-alignment.attr?, + leader-pattern.attr?, + leader-pattern-width.attr?, + leader-length.attr?, + leader-length.minimum.attr?, + leader-length.optimum.attr?, + leader-length.maximum.attr?, + rule-style.attr?, + rule-thickness.attr? + +# Table Properties +# 'border-spacing' shorthand property is also included +# 'inherit' property added to table-omit-...er-at-break +table-properties-inheritable = + border-collapse.attr?, + border-spacing.attr?, + border-separation.attr?, + border-separation.inline-progression-direction.attr?, + border-separation.block-progression-direction.attr?, + caption-side.attr?, + empty-cells.attr? +table-properties-unheritable = + table-layout.attr?, + table-omit-header-at-break.attr?, + table-omit-footer-at-break.attr?, + rx-table-omit-initial-header.attr? +table-properties = table-properties-inheritable, table-properties-unheritable + +# List Properties +list-properties = + provisional-distance-between-starts.attr?, + provisional-label-separation.attr? + +# Visibility Properties +# NOTE: 'visibility' is inheritable, but 'z-index' is not. +visibility-properties = visibility.attr?, z-index.attr? + +# =============================================================== +# Set of 'explicitly' inheritable properties. This includes attributes +# marked as inheritable in the spec only! +# We define two sets of inheritable properties: +# 1. Basic properties applicable to inline-level elements with character-only content +# 2. Full set of inheritable properties +# =============================================================== +inheritable-properties-inline = + aural-properties-inheritable, + color.attr?, + character-properties-inheritable, + font-properties, + hyphenation-properties-inline, + line-height-properties, + visibility.attr? + +inheritable-properties-block = + table-properties-inheritable, + area-properties-inheritable, + hyphenation-properties-block, + margin-properties-inheritable, + intrusion-displace.attr?, + # 'intrusion-displace' applies to: fo:block, fo:block-container, fo:table-and-caption, fo:table, fo:table-caption, fo:list-block, fo:list-item. + keeps-and-breaks-properties-inline-inheritable, + keeps-and-breaks-properties-block-inheritable, + leader-properties, + #MEMO: Should we move this one to inheritable-properties-inline? + line-related-properties, + list-properties, + relative-align.attr? #NOTE: Property 'relative-align' applies to fo:list-item and fo:table-cell only. + +inheritable-properties = + inheritable-properties-inline, + inheritable-properties-block + +# =============================================================== +# Common property subsets. +# =============================================================== +# Common block properties (those properties applies to any type of block-container as well +common-block-properties = + id.attr?, + rx-key.attr?, + accessibility-properties, + aural-properties-unheritable, + border-padding-background-properties, + margin-properties-block, + inheritable-properties + +# Properties for fo:block and fo:block-container +block-properties = + common-block-properties, + clear.attr?, + span.attr?, + keeps-and-breaks-properties-atomic, + relative-position-properties + +# Common inline properties +#MEMO: Spec says that text-altitude/text-depth applicable only to +# fo:block, fo:character, fo:leader, fo:page-number, fo:page-number-citation +# We believe this is an omission and they must be allowed on all elements +# that can have text children. +common-inline-properties = + id.attr?, + rx-key.attr?, + accessibility-properties, + aural-properties-unheritable, + area-alignment-properties, + border-padding-background-properties, + character-properties-unheritable, + keeps-properties-atomic, + margin-properties-inline, + relative-position-properties, + text-altitude.attr?, + text-depth.attr?, + inheritable-properties-inline + +# Properties for nonempty inline elements +inline-properties = + common-inline-properties, + inheritable-properties-block + +# Properties for graphical inline elements +# NOTE: src attribute exclueded since it's not applicable to fo:instream-foreign-object +graphic-properties = +#MEMO: We can replace part of the definition here with 'common-inline-properties' set +# - it will be formaly rightfil since the only difference made by text-shadow, text-altitude, +# text-depth and inheritable-properties-inline and both of them are allowed here. +# At the same time those properties do not make any sense being specified on those +# elements since they will be never applied. + id.attr?, + rx-key.attr?, + accessibility-properties, + aural-properties, + area-properties-unheritable, + border-padding-background-properties, + margin-properties-inline, + relative-position-properties, + area-alignment-properties, + box-size-properties, + keeps-properties-atomic, + line-height-properties, + display-align.attr?, + content-type.attr?, + content-height.attr?, + content-width.attr?, + scaling.attr?, + scaling-method.attr?, + text-align.attr?, + text-decoration.attr? + + diff --git a/plugins/relaxng/testData/parsing/simple.rnc b/plugins/relaxng/testData/parsing/simple.rnc new file mode 100644 index 000000000000..37778c157427 --- /dev/null +++ b/plugins/relaxng/testData/parsing/simple.rnc @@ -0,0 +1 @@ +element foo { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-datatype-prefix-1.rnc b/plugins/relaxng/testData/rename/rnc/rename-datatype-prefix-1.rnc new file mode 100644 index 000000000000..c9a7f3345418 --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-datatype-prefix-1.rnc @@ -0,0 +1,4 @@ +namespace aaa = "xxx" +datatypes aaa = "yyy" + +start = element foo { aaa:string } \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-datatype-prefix-1_after.rnc b/plugins/relaxng/testData/rename/rnc/rename-datatype-prefix-1_after.rnc new file mode 100644 index 000000000000..46dc5c6705c9 --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-datatype-prefix-1_after.rnc @@ -0,0 +1,4 @@ +namespace aaa = "xxx" +datatypes bar = "yyy" + +start = element foo { bar:string } \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-definition-1.rnc b/plugins/relaxng/testData/rename/rnc/rename-definition-1.rnc new file mode 100644 index 000000000000..4f9becd87ba0 --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-definition-1.rnc @@ -0,0 +1,3 @@ +start = pattern +pattern = grammar { +} \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-definition-1_after.rnc b/plugins/relaxng/testData/rename/rnc/rename-definition-1_after.rnc new file mode 100644 index 000000000000..dc3fcc508cf4 --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-definition-1_after.rnc @@ -0,0 +1,3 @@ +start = bar +bar = grammar { +} \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-definition-2.rnc b/plugins/relaxng/testData/rename/rnc/rename-definition-2.rnc new file mode 100644 index 000000000000..4f9becd87ba0 --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-definition-2.rnc @@ -0,0 +1,3 @@ +start = pattern +pattern = grammar { +} \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-definition-2_after.rnc b/plugins/relaxng/testData/rename/rnc/rename-definition-2_after.rnc new file mode 100644 index 000000000000..d8aa825fa969 --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-definition-2_after.rnc @@ -0,0 +1,3 @@ +start = \element +\element = grammar { +} \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-definition-3.rnc b/plugins/relaxng/testData/rename/rnc/rename-definition-3.rnc new file mode 100644 index 000000000000..4d2e7a21f2a9 --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-definition-3.rnc @@ -0,0 +1,2 @@ +start = element foo { pattern } +pattern = element bar { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-definition-3_after.rnc b/plugins/relaxng/testData/rename/rnc/rename-definition-3_after.rnc new file mode 100644 index 000000000000..58339f1868ed --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-definition-3_after.rnc @@ -0,0 +1,2 @@ +start = element foo { bar } +bar = element bar { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-in-include-ref.rnc b/plugins/relaxng/testData/rename/rnc/rename-in-include-ref.rnc new file mode 100644 index 000000000000..a2f95c59cfd2 --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-in-include-ref.rnc @@ -0,0 +1 @@ +start = element foo { empty } \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-in-include.rnc b/plugins/relaxng/testData/rename/rnc/rename-in-include.rnc new file mode 100644 index 000000000000..8c18ebaa35a4 --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-in-include.rnc @@ -0,0 +1 @@ +include "rename-in-include-ref.rnc" \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-in-include_after.rnc b/plugins/relaxng/testData/rename/rnc/rename-in-include_after.rnc new file mode 100644 index 000000000000..308705ae18a2 --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-in-include_after.rnc @@ -0,0 +1 @@ +include "rename-after.rnc" \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-ns-prefix-1.rnc b/plugins/relaxng/testData/rename/rnc/rename-ns-prefix-1.rnc new file mode 100644 index 000000000000..c522b7b1abaa --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-ns-prefix-1.rnc @@ -0,0 +1,3 @@ +default namespace rng = "http://relaxng.org/ns/structure/1.0" + +start = element rng:foo { text } \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rnc/rename-ns-prefix-1_after.rnc b/plugins/relaxng/testData/rename/rnc/rename-ns-prefix-1_after.rnc new file mode 100644 index 000000000000..9944638fd2ff --- /dev/null +++ b/plugins/relaxng/testData/rename/rnc/rename-ns-prefix-1_after.rnc @@ -0,0 +1,3 @@ +default namespace bar = "http://relaxng.org/ns/structure/1.0" + +start = element bar:foo { text } \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rng/rename-ref-1.rng b/plugins/relaxng/testData/rename/rng/rename-ref-1.rng new file mode 100644 index 000000000000..2d9ce7f4291d --- /dev/null +++ b/plugins/relaxng/testData/rename/rng/rename-ref-1.rng @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/rename/rng/rename-ref-1_after.rng b/plugins/relaxng/testData/rename/rng/rename-ref-1_after.rng new file mode 100644 index 000000000000..ef2594531c3c --- /dev/null +++ b/plugins/relaxng/testData/rename/rng/rename-ref-1_after.rng @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/broken-rnc.xml b/plugins/relaxng/testData/validation/broken-rnc.xml new file mode 100644 index 000000000000..f8c041da7b6d --- /dev/null +++ b/plugins/relaxng/testData/validation/broken-rnc.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/broken-rng.xml b/plugins/relaxng/testData/validation/broken-rng.xml new file mode 100644 index 000000000000..cc7f3a6e2f40 --- /dev/null +++ b/plugins/relaxng/testData/validation/broken-rng.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/broken.rnc b/plugins/relaxng/testData/validation/broken.rnc new file mode 100644 index 000000000000..f1d29ee6c228 --- /dev/null +++ b/plugins/relaxng/testData/validation/broken.rnc @@ -0,0 +1,7 @@ +default namespace = "broken.rnc" + +start = element foo { + (element bar { empty } | foo) +} + +foo = element x { a } \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/broken.rng b/plugins/relaxng/testData/validation/broken.rng new file mode 100644 index 000000000000..3422b8993e7b --- /dev/null +++ b/plugins/relaxng/testData/validation/broken.rng @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/cdata-test.xml b/plugins/relaxng/testData/validation/cdata-test.xml new file mode 100644 index 000000000000..0fe59d2981aa --- /dev/null +++ b/plugins/relaxng/testData/validation/cdata-test.xml @@ -0,0 +1,3 @@ + +]]> + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/entity-included-2.xml b/plugins/relaxng/testData/validation/entity-included-2.xml new file mode 100644 index 000000000000..e790b2300c24 --- /dev/null +++ b/plugins/relaxng/testData/validation/entity-included-2.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/entity-included.xml b/plugins/relaxng/testData/validation/entity-included.xml new file mode 100644 index 000000000000..1b3d1aa0ff34 --- /dev/null +++ b/plugins/relaxng/testData/validation/entity-included.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/entity-test-1.xml b/plugins/relaxng/testData/validation/entity-test-1.xml new file mode 100644 index 000000000000..03b165589fff --- /dev/null +++ b/plugins/relaxng/testData/validation/entity-test-1.xml @@ -0,0 +1,6 @@ + +]> + + &content; + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/entity-test-2.xml b/plugins/relaxng/testData/validation/entity-test-2.xml new file mode 100644 index 000000000000..90fbdb5640ac --- /dev/null +++ b/plugins/relaxng/testData/validation/entity-test-2.xml @@ -0,0 +1,6 @@ + +]> +<missing-element xmlns="urn:test:simple.rng"> + &content; + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/entity-test-3.xml b/plugins/relaxng/testData/validation/entity-test-3.xml new file mode 100644 index 000000000000..56e19d203e88 --- /dev/null +++ b/plugins/relaxng/testData/validation/entity-test-3.xml @@ -0,0 +1,5 @@ + + +]> +ü" \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/invalid-element-rnc.xml b/plugins/relaxng/testData/validation/invalid-element-rnc.xml new file mode 100644 index 000000000000..7b815fe32b9b --- /dev/null +++ b/plugins/relaxng/testData/validation/invalid-element-rnc.xml @@ -0,0 +1,4 @@ + + + <required /> + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/invalid-element.xml b/plugins/relaxng/testData/validation/invalid-element.xml new file mode 100644 index 000000000000..880b247d13d2 --- /dev/null +++ b/plugins/relaxng/testData/validation/invalid-element.xml @@ -0,0 +1,4 @@ + + + <required /> + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/missing-element-rnc.xml b/plugins/relaxng/testData/validation/missing-element-rnc.xml new file mode 100644 index 000000000000..0e6cc2df797e --- /dev/null +++ b/plugins/relaxng/testData/validation/missing-element-rnc.xml @@ -0,0 +1,2 @@ +<missing-element xmlns="urn:test:simple.rnc"> +missing-element \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/missing-element.xml b/plugins/relaxng/testData/validation/missing-element.xml new file mode 100644 index 000000000000..52a9f69b2733 --- /dev/null +++ b/plugins/relaxng/testData/validation/missing-element.xml @@ -0,0 +1,2 @@ +<missing-element xmlns="urn:test:simple.rng"> +missing-element \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/simple.rnc b/plugins/relaxng/testData/validation/simple.rnc new file mode 100644 index 000000000000..4f0bc9778bea --- /dev/null +++ b/plugins/relaxng/testData/validation/simple.rnc @@ -0,0 +1,9 @@ +default namespace = "urn:test:simple.rnc" + +element missing-element { + element required { empty } +} | +element invalid-element { + element required { empty } +} + diff --git a/plugins/relaxng/testData/validation/simple.rng b/plugins/relaxng/testData/validation/simple.rng new file mode 100644 index 000000000000..d22e684eaf56 --- /dev/null +++ b/plugins/relaxng/testData/validation/simple.rng @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + true + false + + + + + + + ü" + + + + ]]> + + + + + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/text-content.xml b/plugins/relaxng/testData/validation/text-content.xml new file mode 100644 index 000000000000..f27dfec52c83 --- /dev/null +++ b/plugins/relaxng/testData/validation/text-content.xml @@ -0,0 +1,5 @@ + + true + false + <boolean>blubbboolean> + \ No newline at end of file diff --git a/plugins/relaxng/testData/validation/xslt.rng b/plugins/relaxng/testData/validation/xslt.rng new file mode 100644 index 000000000000..0246a5a7f0ac --- /dev/null +++ b/plugins/relaxng/testData/validation/xslt.rng @@ -0,0 +1,895 @@ + + + + + + + + + + + + + 1.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + version + + + + + + + + + + + + + + + + + + + + + + version + + + + + + + + + + + + + + + + + extension-element-prefixes + + + + exclude-result-prefixes + + + + use-attribute-sets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + single + multiple + any + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + alphabetic + traditional + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + number + + + + + + + + + ascending + descending + + + + + + + + upper-first + lower-first + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + + + + + + + + xml + html + text + + + + + + + + + + + + + + + + + + yes + no + + + + + + + yes + no + + + + + + + + + + + + + + + + + + + + + + yes + no + + + + + + + + + + + + + + + + #default + + + + + + + + #default + + + + + + + + + \*|\i\c*:\* + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + .*:.* + + + + + + ([^\{\}]|\{\{|\}\})*\{([^"'\{\}]|"[^"]*"|'[^']*')+\}([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})* + + + + + + [^\{\}]*(\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})* + + + + + ([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})* + + +