hxt 8.5.4 → 9.0.0
raw patch · 104 files changed
+4225/−25187 lines, 104 filesdep +binarydep +hxt-charpropertiesdep +hxt-regex-xmlschemadep −curldep −tagsoupPVP ok
version bump matches the API change (PVP)
Dependencies added: binary, hxt-charproperties, hxt-regex-xmlschema, hxt-unicode
Dependencies removed: curl, tagsoup
API changes (from Hackage documentation)
- Data.Char.UTF8: data Error
- Data.Char.UTF8: decode :: [Word8] -> ([Char], [(Error, Int)])
- Data.Char.UTF8: decodeEmbedErrors :: [Word8] -> [Either (Error, Int) Char]
- Data.Char.UTF8: decodeOne :: [Word8] -> (Either Error Char, Int, [Word8])
- Data.Char.UTF8: encode :: [Char] -> [Word8]
- Data.Char.UTF8: encodeOne :: Char -> [Word8]
- Data.Char.UTF8: instance Eq Error
- Data.Char.UTF8: instance Show Error
- Text.XML.HXT.Arrow.ParserInterface: parseHtmlTagSoup :: ArrowList a => Bool -> Bool -> Bool -> Bool -> Bool -> a (String, String) XmlTree
- Text.XML.HXT.Arrow.ParserInterface: transformDoc :: ArrowList a => a XmlTree XmlTree
- Text.XML.HXT.Arrow.ParserInterface: validateDoc :: ArrowList a => a XmlTree XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: XIOState :: !XIOSysState -> !us -> XIOState us
- Text.XML.HXT.Arrow.XmlIOStateArrow: XIOSys :: !Int -> (Int -> String -> IO ()) -> !Int -> !String -> (String -> IO ()) -> !Bool -> !XmlTrees -> !String -> !String -> !AssocList String XmlTrees -> MimeTypeTable -> XIOSysState
- Text.XML.HXT.Arrow.XmlIOStateArrow: changeBaseURI :: IOStateArrow s String String
- Text.XML.HXT.Arrow.XmlIOStateArrow: changeSysParam :: (b -> XIOSysState -> XIOSysState) -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: changeUserState :: (b -> s -> s) -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: clearErrStatus :: IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: data XIOState us
- Text.XML.HXT.Arrow.XmlIOStateArrow: data XIOSysState
- Text.XML.HXT.Arrow.XmlIOStateArrow: documentStatusOk :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: errorMsgCollect :: IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: errorMsgIgnore :: IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: errorMsgStderr :: IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: errorMsgStderrAndCollect :: IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: expandURI :: ArrowXml a => a (String, String) String
- Text.XML.HXT.Arrow.XmlIOStateArrow: expandURIString :: String -> String -> Maybe String
- Text.XML.HXT.Arrow.XmlIOStateArrow: filterErrorMsg :: IOStateArrow s XmlTree XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: getAllParams :: IOStateArrow s b (AssocList String XmlTrees)
- Text.XML.HXT.Arrow.XmlIOStateArrow: getAllParamsString :: IOStateArrow s b (AssocList String String)
- Text.XML.HXT.Arrow.XmlIOStateArrow: getBaseURI :: IOStateArrow s b String
- Text.XML.HXT.Arrow.XmlIOStateArrow: getDefaultBaseURI :: IOStateArrow s b String
- Text.XML.HXT.Arrow.XmlIOStateArrow: getErrStatus :: IOStateArrow s XmlTree Int
- Text.XML.HXT.Arrow.XmlIOStateArrow: getErrorMessages :: IOStateArrow s b XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: getFragmentFromURI :: ArrowList a => a String String
- Text.XML.HXT.Arrow.XmlIOStateArrow: getParam :: String -> IOStateArrow s b XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: getParamInt :: Int -> String -> IOStateArrow s b Int
- Text.XML.HXT.Arrow.XmlIOStateArrow: getParamString :: String -> IOStateArrow s b String
- Text.XML.HXT.Arrow.XmlIOStateArrow: getPathFromURI :: ArrowList a => a String String
- Text.XML.HXT.Arrow.XmlIOStateArrow: getPortFromURI :: ArrowList a => a String String
- Text.XML.HXT.Arrow.XmlIOStateArrow: getQueryFromURI :: ArrowList a => a String String
- Text.XML.HXT.Arrow.XmlIOStateArrow: getRegNameFromURI :: ArrowList a => a String String
- Text.XML.HXT.Arrow.XmlIOStateArrow: getSchemeFromURI :: ArrowList a => a String String
- Text.XML.HXT.Arrow.XmlIOStateArrow: getSysParam :: (XIOSysState -> c) -> IOStateArrow s b c
- Text.XML.HXT.Arrow.XmlIOStateArrow: getTraceCmd :: IOStateArrow a b (Int -> String -> IO ())
- Text.XML.HXT.Arrow.XmlIOStateArrow: getTraceLevel :: IOStateArrow s b Int
- Text.XML.HXT.Arrow.XmlIOStateArrow: getUserInfoFromURI :: ArrowList a => a String String
- Text.XML.HXT.Arrow.XmlIOStateArrow: getUserState :: IOStateArrow s b s
- Text.XML.HXT.Arrow.XmlIOStateArrow: initialState :: us -> XIOState us
- Text.XML.HXT.Arrow.XmlIOStateArrow: initialSysState :: XIOSysState
- Text.XML.HXT.Arrow.XmlIOStateArrow: instance NFData XIOSysState
- Text.XML.HXT.Arrow.XmlIOStateArrow: instance NFData us => NFData (XIOState us)
- Text.XML.HXT.Arrow.XmlIOStateArrow: issueErr :: String -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: issueFatal :: String -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: issueWarn :: String -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: mkAbsURI :: IOStateArrow s String String
- Text.XML.HXT.Arrow.XmlIOStateArrow: runInLocalURIContext :: IOStateArrow s b c -> IOStateArrow s b c
- Text.XML.HXT.Arrow.XmlIOStateArrow: runX :: IOSArrow XmlTree c -> IO [c]
- Text.XML.HXT.Arrow.XmlIOStateArrow: setBaseURI :: IOStateArrow s String String
- Text.XML.HXT.Arrow.XmlIOStateArrow: setDefaultBaseURI :: String -> IOStateArrow s b String
- Text.XML.HXT.Arrow.XmlIOStateArrow: setDocumentStatus :: Int -> String -> IOStateArrow s XmlTree XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: setDocumentStatusFromSystemState :: String -> IOStateArrow s XmlTree XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: setErrMsgStatus :: IOStateArrow s XmlTree XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: setErrStatus :: IOStateArrow s Int Int
- Text.XML.HXT.Arrow.XmlIOStateArrow: setErrorMsgHandler :: Bool -> (String -> IO ()) -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: setMimeTypeTable :: MimeTypeTable -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: setMimeTypeTableFromFile :: FilePath -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: setParam :: String -> IOStateArrow s XmlTree XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: setParamInt :: String -> Int -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: setParamList :: String -> IOStateArrow s XmlTrees XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: setParamString :: String -> String -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: setTraceCmd :: (Int -> String -> IO ()) -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: setTraceLevel :: Int -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: setUserState :: IOStateArrow s s s
- Text.XML.HXT.Arrow.XmlIOStateArrow: trace :: Int -> IOStateArrow s b String -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: traceDoc :: String -> IOStateArrow s XmlTree XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: traceMsg :: Int -> String -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: traceSource :: IOStateArrow s XmlTree XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: traceState :: IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: traceString :: Int -> (b -> String) -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: traceTree :: IOStateArrow s XmlTree XmlTree
- Text.XML.HXT.Arrow.XmlIOStateArrow: traceValue :: Int -> (b -> String) -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: type IOSArrow b c = IOStateArrow () b c
- Text.XML.HXT.Arrow.XmlIOStateArrow: type IOStateArrow s b c = IOSLA (XIOState s) b c
- Text.XML.HXT.Arrow.XmlIOStateArrow: unsetParam :: String -> IOStateArrow s b b
- Text.XML.HXT.Arrow.XmlIOStateArrow: withExtendedUserState :: s1 -> IOStateArrow (s1, s0) b c -> IOStateArrow s0 b c
- Text.XML.HXT.Arrow.XmlIOStateArrow: withOtherUserState :: s1 -> IOStateArrow s1 b c -> IOStateArrow s0 b c
- Text.XML.HXT.Arrow.XmlIOStateArrow: withTraceLevel :: Int -> IOStateArrow s b c -> IOStateArrow s b c
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_attrList :: XIOSysState -> !AssocList String XmlTrees
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_baseURI :: XIOSysState -> !String
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_defaultBaseURI :: XIOSysState -> !String
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_errorModule :: XIOSysState -> !String
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_errorMsgCollect :: XIOSysState -> !Bool
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_errorMsgHandler :: XIOSysState -> String -> IO ()
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_errorMsgList :: XIOSysState -> !XmlTrees
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_errorStatus :: XIOSysState -> !Int
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_mimeTypes :: XIOSysState -> MimeTypeTable
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_sysState :: XIOState us -> !XIOSysState
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_trace :: XIOSysState -> !Int
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_traceCmd :: XIOSysState -> Int -> String -> IO ()
- Text.XML.HXT.Arrow.XmlIOStateArrow: xio_userState :: XIOState us -> !us
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_10 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_11 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_13 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_14 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_15 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_16 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_2 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_3 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_4 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_5 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_6 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_7 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_8 :: [(Char, Char)]
- Text.XML.HXT.DOM.IsoLatinTables: iso_8859_9 :: [(Char, Char)]
- Text.XML.HXT.DOM.UTF8Decoding: decodeUtf8 :: String -> (String, [String])
- Text.XML.HXT.DOM.UTF8Decoding: decodeUtf8EmbedErrors :: String -> [Either String Char]
- Text.XML.HXT.DOM.UTF8Decoding: decodeUtf8IgnoreErrors :: String -> String
- Text.XML.HXT.DOM.Unicode: getDecodingFct :: String -> Maybe DecodingFct
- Text.XML.HXT.DOM.Unicode: getDecodingFctEmbedErrors :: String -> Maybe DecodingFctEmbedErrors
- Text.XML.HXT.DOM.Unicode: getOutputEncodingFct :: String -> Maybe (String -> UString)
- Text.XML.HXT.DOM.Unicode: guessEncoding :: String -> String
- Text.XML.HXT.DOM.Unicode: intToCharRef :: Int -> String
- Text.XML.HXT.DOM.Unicode: intToCharRefHex :: Int -> String
- Text.XML.HXT.DOM.Unicode: isXml11SpaceChar :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlBaseChar :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlChar :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlCombiningChar :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlControlOrPermanentlyUndefined :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlDigit :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlExtender :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlIdeographicChar :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlLatin1Char :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlLetter :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlNCNameChar :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlNCNameStartChar :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlNameChar :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlNameStartChar :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlPubidChar :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: isXmlSpaceChar :: Unicode -> Bool
- Text.XML.HXT.DOM.Unicode: latin1ToUnicode :: String -> UString
- Text.XML.HXT.DOM.Unicode: normalizeNL :: String -> String
- Text.XML.HXT.DOM.Unicode: type DecodingFct = String -> (UString, [String])
- Text.XML.HXT.DOM.Unicode: type DecodingFctEmbedErrors = String -> UStringWithErrors
- Text.XML.HXT.DOM.Unicode: type UString = [Unicode]
- Text.XML.HXT.DOM.Unicode: type UStringWithErrors = [Either String Char]
- Text.XML.HXT.DOM.Unicode: type UTF8Char = Char
- Text.XML.HXT.DOM.Unicode: type UTF8String = String
- Text.XML.HXT.DOM.Unicode: type Unicode = Char
- Text.XML.HXT.DOM.Unicode: ucs2BigEndianToUnicode :: String -> UString
- Text.XML.HXT.DOM.Unicode: ucs2LittleEndianToUnicode :: String -> UString
- Text.XML.HXT.DOM.Unicode: ucs2ToUnicode :: String -> UString
- Text.XML.HXT.DOM.Unicode: unicodeCharToUtf8 :: Unicode -> UTF8String
- Text.XML.HXT.DOM.Unicode: unicodeRemoveNoneAscii :: UString -> String
- Text.XML.HXT.DOM.Unicode: unicodeRemoveNoneLatin1 :: UString -> String
- Text.XML.HXT.DOM.Unicode: unicodeToLatin1 :: UString -> String
- Text.XML.HXT.DOM.Unicode: unicodeToUtf8 :: UString -> UTF8String
- Text.XML.HXT.DOM.Unicode: unicodeToXmlEntity :: UString -> String
- Text.XML.HXT.DOM.Unicode: utf16beToUnicode :: String -> UString
- Text.XML.HXT.DOM.Unicode: utf16leToUnicode :: String -> UString
- Text.XML.HXT.DOM.Unicode: utf8ToUnicode :: DecodingFct
- Text.XML.HXT.DOM.Unicode: utf8ToUnicodeEmbedErrors :: DecodingFctEmbedErrors
- Text.XML.HXT.DOM.XmlKeywords: a_accept_mimetypes :: String
- Text.XML.HXT.DOM.XmlKeywords: a_add_default_dtd :: String
- Text.XML.HXT.DOM.XmlKeywords: a_canonicalize :: String
- Text.XML.HXT.DOM.XmlKeywords: a_check_namespaces :: String
- Text.XML.HXT.DOM.XmlKeywords: a_check_restrictions :: String
- Text.XML.HXT.DOM.XmlKeywords: a_collect_errors :: String
- Text.XML.HXT.DOM.XmlKeywords: a_default_baseuri :: String
- Text.XML.HXT.DOM.XmlKeywords: a_do_not_canonicalize :: String
- Text.XML.HXT.DOM.XmlKeywords: a_do_not_check_namespaces :: String
- Text.XML.HXT.DOM.XmlKeywords: a_do_not_check_restrictions :: String
- Text.XML.HXT.DOM.XmlKeywords: a_do_not_collect_errors :: String
- Text.XML.HXT.DOM.XmlKeywords: a_do_not_issue_errors :: String
- Text.XML.HXT.DOM.XmlKeywords: a_do_not_issue_warnings :: String
- Text.XML.HXT.DOM.XmlKeywords: a_do_not_preserve_comment :: String
- Text.XML.HXT.DOM.XmlKeywords: a_do_not_remove_whitespace :: String
- Text.XML.HXT.DOM.XmlKeywords: a_do_not_use_curl :: String
- Text.XML.HXT.DOM.XmlKeywords: a_do_not_validate :: String
- Text.XML.HXT.DOM.XmlKeywords: a_do_not_validate_externalRef :: String
- Text.XML.HXT.DOM.XmlKeywords: a_do_not_validate_include :: String
- Text.XML.HXT.DOM.XmlKeywords: a_error :: String
- Text.XML.HXT.DOM.XmlKeywords: a_error_log :: String
- Text.XML.HXT.DOM.XmlKeywords: a_help :: String
- Text.XML.HXT.DOM.XmlKeywords: a_if_modified_since :: String
- Text.XML.HXT.DOM.XmlKeywords: a_ignore_encoding_errors :: String
- Text.XML.HXT.DOM.XmlKeywords: a_ignore_none_xml_contents :: String
- Text.XML.HXT.DOM.XmlKeywords: a_indent :: String
- Text.XML.HXT.DOM.XmlKeywords: a_issue_errors :: String
- Text.XML.HXT.DOM.XmlKeywords: a_issue_warnings :: String
- Text.XML.HXT.DOM.XmlKeywords: a_mime_types :: String
- Text.XML.HXT.DOM.XmlKeywords: a_no_empty_elem_for :: String
- Text.XML.HXT.DOM.XmlKeywords: a_no_empty_elements :: String
- Text.XML.HXT.DOM.XmlKeywords: a_no_redirect :: String
- Text.XML.HXT.DOM.XmlKeywords: a_no_xml_pi :: String
- Text.XML.HXT.DOM.XmlKeywords: a_options_curl :: String
- Text.XML.HXT.DOM.XmlKeywords: a_output_changes :: String
- Text.XML.HXT.DOM.XmlKeywords: a_output_file :: String
- Text.XML.HXT.DOM.XmlKeywords: a_output_html :: String
- Text.XML.HXT.DOM.XmlKeywords: a_output_xhtml :: String
- Text.XML.HXT.DOM.XmlKeywords: a_output_xml :: String
- Text.XML.HXT.DOM.XmlKeywords: a_parse_by_mimetype :: String
- Text.XML.HXT.DOM.XmlKeywords: a_parse_html :: String
- Text.XML.HXT.DOM.XmlKeywords: a_parse_xml :: String
- Text.XML.HXT.DOM.XmlKeywords: a_preserve_comment :: String
- Text.XML.HXT.DOM.XmlKeywords: a_propagate_errors :: String
- Text.XML.HXT.DOM.XmlKeywords: a_proxy :: String
- Text.XML.HXT.DOM.XmlKeywords: a_redirect :: String
- Text.XML.HXT.DOM.XmlKeywords: a_relax_schema :: String
- Text.XML.HXT.DOM.XmlKeywords: a_remove_whitespace :: String
- Text.XML.HXT.DOM.XmlKeywords: a_show_haskell :: String
- Text.XML.HXT.DOM.XmlKeywords: a_show_tree :: String
- Text.XML.HXT.DOM.XmlKeywords: a_strict_input :: String
- Text.XML.HXT.DOM.XmlKeywords: a_tagsoup :: String
- Text.XML.HXT.DOM.XmlKeywords: a_text_mode :: String
- Text.XML.HXT.DOM.XmlKeywords: a_trace :: String
- Text.XML.HXT.DOM.XmlKeywords: a_use_curl :: String
- Text.XML.HXT.DOM.XmlKeywords: a_validate :: String
- Text.XML.HXT.DOM.XmlKeywords: a_validate_externalRef :: String
- Text.XML.HXT.DOM.XmlKeywords: a_validate_include :: String
- Text.XML.HXT.DOM.XmlKeywords: a_verbose :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_1 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_10 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_11 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_13 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_14 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_15 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_16 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_2 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_3 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_4 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_5 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_6 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_7 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_8 :: String
- Text.XML.HXT.DOM.XmlKeywords: iso8859_9 :: String
- Text.XML.HXT.DOM.XmlKeywords: isoLatin1 :: String
- Text.XML.HXT.DOM.XmlKeywords: ucs2 :: String
- Text.XML.HXT.DOM.XmlKeywords: unicodeString :: String
- Text.XML.HXT.DOM.XmlKeywords: usAscii :: String
- Text.XML.HXT.DOM.XmlKeywords: utf16 :: String
- Text.XML.HXT.DOM.XmlKeywords: utf16be :: String
- Text.XML.HXT.DOM.XmlKeywords: utf16le :: String
- Text.XML.HXT.DOM.XmlKeywords: utf8 :: String
- Text.XML.HXT.DOM.XmlOptions: generalOptions :: [OptDescr (String, String)]
- Text.XML.HXT.DOM.XmlOptions: inputOptions :: [OptDescr (String, String)]
- Text.XML.HXT.DOM.XmlOptions: isTrueValue :: String -> Bool
- Text.XML.HXT.DOM.XmlOptions: optionIsSet :: String -> Attributes -> Bool
- Text.XML.HXT.DOM.XmlOptions: outputOptions :: [OptDescr (String, String)]
- Text.XML.HXT.DOM.XmlOptions: relaxOptions :: [OptDescr (String, String)]
- Text.XML.HXT.DOM.XmlOptions: removeOptions :: [String] -> [OptDescr (String, String)] -> [OptDescr (String, String)]
- Text.XML.HXT.DOM.XmlOptions: selectOptions :: [String] -> [OptDescr (String, String)] -> [OptDescr (String, String)]
- Text.XML.HXT.DOM.XmlOptions: showOptions :: [OptDescr (String, String)]
- Text.XML.HXT.DOM.XmlOptions: versionOptions :: [OptDescr (String, String)]
- Text.XML.HXT.IO.GetHTTPLibCurl: getCont :: [(String, String)] -> String -> IO (Either ([(String, String)], String) ([(String, String)], String))
- Text.XML.HXT.Parser.TagSoup: instance Monad Parser
- Text.XML.HXT.Parser.TagSoup: parseHtmlTagSoup :: Bool -> Bool -> Bool -> Bool -> Bool -> String -> String -> XmlTrees
- Text.XML.HXT.RelaxNG.BasicArrows: checkRngName :: ArrowXml a => [String] -> a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: getRngAttrAttribute :: ArrowXml a => a XmlTree String
- Text.XML.HXT.RelaxNG.BasicArrows: getRngAttrCombine :: ArrowXml a => a XmlTree String
- Text.XML.HXT.RelaxNG.BasicArrows: getRngAttrDatatypeLibrary :: ArrowXml a => a XmlTree String
- Text.XML.HXT.RelaxNG.BasicArrows: getRngAttrDescr :: ArrowXml a => a XmlTree String
- Text.XML.HXT.RelaxNG.BasicArrows: getRngAttrHref :: ArrowXml a => a XmlTree String
- Text.XML.HXT.RelaxNG.BasicArrows: getRngAttrName :: ArrowXml a => a XmlTree String
- Text.XML.HXT.RelaxNG.BasicArrows: getRngAttrNs :: ArrowXml a => a XmlTree String
- Text.XML.HXT.RelaxNG.BasicArrows: getRngAttrType :: ArrowXml a => a XmlTree String
- Text.XML.HXT.RelaxNG.BasicArrows: hasRngAttrAttribute :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: hasRngAttrCombine :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: hasRngAttrDatatypeLibrary :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: hasRngAttrHref :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: hasRngAttrName :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: hasRngAttrNs :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: hasRngAttrType :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: hasRngName :: ArrowXml a => String -> a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isAttributeListGroupInterleaveOneOrMore :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isAttributeRef :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isAttributeRefTextListGroupInterleaveOneOrMoreEmpty :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isAttributeRefTextListInterleave :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isChoiceGroupInterleave :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isChoiceGroupInterleaveOneOrMore :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isDefineOneOrMoreZeroOrMoreOptionalListMixed :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isExternalRefInclude :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isGroupInterleave :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isNameAnyNameNsName :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isNameNsName :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isNameNsNameValue :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngAnyName :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngAttrAttribute :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngAttrCombine :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngAttrDatatypeLibrary :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngAttrHref :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngAttrName :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngAttrNs :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngAttrType :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngAttribute :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngChoice :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngCombine :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngData :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngDefine :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngDiv :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngElement :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngEmpty :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngExcept :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngExternalRef :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngGrammar :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngGroup :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngInclude :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngInterleave :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngList :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngMixed :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngName :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngNotAllowed :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngNsName :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngOneOrMore :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngOptional :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngParam :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngParentRef :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngRef :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngRelaxError :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngStart :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngText :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngType :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngValue :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: isRngZeroOrMore :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngChoice :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngDefine :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngElement :: ArrowXml a => String -> a n XmlTree -> a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngEmpty :: ArrowXml a => a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngGrammar :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngGroup :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngInterleave :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngName :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngNotAllowed :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngOneOrMore :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngRef :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngRelaxError :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngStart :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: mkRngText :: ArrowXml a => a n XmlTree -> a n XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: noOfChildren :: ArrowXml a => (Int -> Bool) -> a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: setRngName :: ArrowXml a => String -> a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: setRngNameDiv :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.BasicArrows: setRngNameRef :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.CreatePattern: createNameClass :: LA XmlTree NameClass
- Text.XML.HXT.RelaxNG.CreatePattern: createPatternFromXmlTree :: LA XmlTree Pattern
- Text.XML.HXT.RelaxNG.CreatePattern: firstChild :: (ArrowTree a, Tree t) => a (t b) (t b)
- Text.XML.HXT.RelaxNG.CreatePattern: lastChild :: (ArrowTree a, Tree t) => a (t b) (t b)
- Text.XML.HXT.RelaxNG.DataTypeLibMysql: mysqlDatatypeLib :: DatatypeLibrary
- Text.XML.HXT.RelaxNG.DataTypeLibMysql: mysqlNS :: String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: assert :: (a -> Bool) -> (a -> String) -> CheckA a a
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: assertMaybe :: (a -> Maybe b) -> (a -> String) -> CheckA a b
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: checkWith :: (a -> b) -> CheckA b c -> CheckA a a
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: data CheckA a b
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: errorMsgDataLibQName :: String -> String -> String -> String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: errorMsgDataTypeNotAllowed :: String -> String -> [(String, String)] -> String -> String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: errorMsgDataTypeNotAllowed0 :: String -> String -> String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: errorMsgDataTypeNotAllowed2 :: String -> String -> String -> String -> String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: errorMsgEqual :: DatatypeName -> String -> String -> String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: errorMsgParam :: LocalName -> String -> String -> String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: failure :: (a -> String) -> CheckA a b
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: fctTableList :: FunctionTable
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: fctTableString :: FunctionTable
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: instance Arrow CheckA
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: instance ArrowPlus CheckA
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: instance ArrowZero CheckA
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: instance Category CheckA
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: numParamValid :: (Integer -> Integer -> Bool) -> String -> String -> Bool
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: numberValid :: DatatypeName -> Integer -> Integer -> ParamList -> CheckString
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: ok :: CheckA a a
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: performCheck :: CheckA a b -> a -> Maybe String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: rng_length :: String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: rng_maxExclusive :: String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: rng_maxInclusive :: String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: rng_maxLength :: String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: rng_minExclusive :: String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: rng_minInclusive :: String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: rng_minLength :: String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: stringValid :: DatatypeName -> Integer -> Integer -> ParamList -> CheckString
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: stringValidFT :: FunctionTable -> DatatypeName -> Integer -> Integer -> ParamList -> CheckString
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: type CheckInteger = CheckA Integer Integer
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: type CheckString = CheckA String String
- Text.XML.HXT.RelaxNG.DataTypeLibUtils: type FunctionTable = [(String, String -> String -> Bool)]
- Text.XML.HXT.RelaxNG.DataTypeLibraries: datatypeAllows :: Uri -> DatatypeAllows
- Text.XML.HXT.RelaxNG.DataTypeLibraries: datatypeEqual :: Uri -> DatatypeEqual
- Text.XML.HXT.RelaxNG.DataTypeLibraries: datatypeLibraries :: DatatypeLibraries
- Text.XML.HXT.RelaxNG.DataTypes: After :: Pattern -> Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: AnyName :: NameClass
- Text.XML.HXT.RelaxNG.DataTypes: AnyNameExcept :: NameClass -> NameClass
- Text.XML.HXT.RelaxNG.DataTypes: Attribute :: NameClass -> Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: CTComplex :: ContentType
- Text.XML.HXT.RelaxNG.DataTypes: CTEmpty :: ContentType
- Text.XML.HXT.RelaxNG.DataTypes: CTNone :: ContentType
- Text.XML.HXT.RelaxNG.DataTypes: CTSimple :: ContentType
- Text.XML.HXT.RelaxNG.DataTypes: Choice :: Pattern -> Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: DTC :: DatatypeAllows -> DatatypeEqual -> AllowedDatatypes -> DatatypeCheck
- Text.XML.HXT.RelaxNG.DataTypes: Data :: Datatype -> ParamList -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: DataExcept :: Datatype -> ParamList -> Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: Element :: NameClass -> Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: Empty :: Pattern
- Text.XML.HXT.RelaxNG.DataTypes: ErrMsg :: ErrLevel -> [String] -> ErrMessage
- Text.XML.HXT.RelaxNG.DataTypes: Group :: Pattern -> Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: Interleave :: Pattern -> Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: List :: Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: NCError :: String -> NameClass
- Text.XML.HXT.RelaxNG.DataTypes: Name :: Uri -> LocalName -> NameClass
- Text.XML.HXT.RelaxNG.DataTypes: NameClassChoice :: NameClass -> NameClass -> NameClass
- Text.XML.HXT.RelaxNG.DataTypes: NotAllowed :: ErrMessage -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: NsName :: Uri -> NameClass
- Text.XML.HXT.RelaxNG.DataTypes: NsNameExcept :: Uri -> NameClass -> NameClass
- Text.XML.HXT.RelaxNG.DataTypes: OneOrMore :: Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: Text :: Pattern
- Text.XML.HXT.RelaxNG.DataTypes: Value :: Datatype -> String -> Context -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: a_numberOfErrors :: String
- Text.XML.HXT.RelaxNG.DataTypes: a_relaxSimplificationChanges :: String
- Text.XML.HXT.RelaxNG.DataTypes: after :: Pattern -> Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: choice :: Pattern -> Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: contextAttributes :: String
- Text.XML.HXT.RelaxNG.DataTypes: contextBaseAttr :: String
- Text.XML.HXT.RelaxNG.DataTypes: data ContentType
- Text.XML.HXT.RelaxNG.DataTypes: data DatatypeCheck
- Text.XML.HXT.RelaxNG.DataTypes: data ErrMessage
- Text.XML.HXT.RelaxNG.DataTypes: data NameClass
- Text.XML.HXT.RelaxNG.DataTypes: data Pattern
- Text.XML.HXT.RelaxNG.DataTypes: defineOrigName :: String
- Text.XML.HXT.RelaxNG.DataTypes: dtAllowedTypes :: DatatypeCheck -> AllowedDatatypes
- Text.XML.HXT.RelaxNG.DataTypes: dtAllowsFct :: DatatypeCheck -> DatatypeAllows
- Text.XML.HXT.RelaxNG.DataTypes: dtEqualFct :: DatatypeCheck -> DatatypeEqual
- Text.XML.HXT.RelaxNG.DataTypes: group :: Pattern -> Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: instance Eq ContentType
- Text.XML.HXT.RelaxNG.DataTypes: instance Eq NameClass
- Text.XML.HXT.RelaxNG.DataTypes: instance Ord ContentType
- Text.XML.HXT.RelaxNG.DataTypes: instance Show ContentType
- Text.XML.HXT.RelaxNG.DataTypes: instance Show ErrMessage
- Text.XML.HXT.RelaxNG.DataTypes: instance Show NameClass
- Text.XML.HXT.RelaxNG.DataTypes: instance Show Pattern
- Text.XML.HXT.RelaxNG.DataTypes: interleave :: Pattern -> Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: mergeNotAllowed :: Pattern -> Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: notAllowed :: String -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: notAllowed1 :: String -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: notAllowed2 :: String -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: notAllowedN :: ErrLevel -> String -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: oneOrMore :: Pattern -> Pattern
- Text.XML.HXT.RelaxNG.DataTypes: relaxSchemaFile :: String
- Text.XML.HXT.RelaxNG.DataTypes: relaxSchemaGrammarFile :: String
- Text.XML.HXT.RelaxNG.DataTypes: showDatatype :: Datatype -> String
- Text.XML.HXT.RelaxNG.DataTypes: type AllowedDatatypes = [(DatatypeName, AllowedParams)]
- Text.XML.HXT.RelaxNG.DataTypes: type AllowedParams = [ParamName]
- Text.XML.HXT.RelaxNG.DataTypes: type Context = (Uri, [(Prefix, Uri)])
- Text.XML.HXT.RelaxNG.DataTypes: type Datatype = (Uri, LocalName)
- Text.XML.HXT.RelaxNG.DataTypes: type DatatypeAllows = DatatypeName -> ParamList -> String -> Context -> Maybe String
- Text.XML.HXT.RelaxNG.DataTypes: type DatatypeEqual = DatatypeName -> String -> Context -> String -> Context -> Maybe String
- Text.XML.HXT.RelaxNG.DataTypes: type DatatypeLibraries = [DatatypeLibrary]
- Text.XML.HXT.RelaxNG.DataTypes: type DatatypeLibrary = (Uri, DatatypeCheck)
- Text.XML.HXT.RelaxNG.DataTypes: type DatatypeName = String
- Text.XML.HXT.RelaxNG.DataTypes: type Env = [(String, XmlTree)]
- Text.XML.HXT.RelaxNG.DataTypes: type ErrLevel = Int
- Text.XML.HXT.RelaxNG.DataTypes: type LocalName = String
- Text.XML.HXT.RelaxNG.DataTypes: type NamePair = (OldName, NewName)
- Text.XML.HXT.RelaxNG.DataTypes: type NewName = String
- Text.XML.HXT.RelaxNG.DataTypes: type OldName = String
- Text.XML.HXT.RelaxNG.DataTypes: type ParamList = [(LocalName, String)]
- Text.XML.HXT.RelaxNG.DataTypes: type ParamName = String
- Text.XML.HXT.RelaxNG.DataTypes: type Prefix = String
- Text.XML.HXT.RelaxNG.DataTypes: type RefList = [NamePair]
- Text.XML.HXT.RelaxNG.DataTypes: type Uri = String
- Text.XML.HXT.RelaxNG.PatternFunctions: getChildrenPattern :: Pattern -> [Pattern]
- Text.XML.HXT.RelaxNG.PatternFunctions: getNameClassFromPattern :: Pattern -> NameClass
- Text.XML.HXT.RelaxNG.PatternFunctions: getPatternName :: Pattern -> String
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxAfter :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxAttribute :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxChoice :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxData :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxDataExcept :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxElement :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxEmpty :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxGroup :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxInterleave :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxList :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxNotAllowed :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxOneOrMore :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxText :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternFunctions: isRelaxValue :: Pattern -> Bool
- Text.XML.HXT.RelaxNG.PatternToString: nameClassToString :: NameClass -> String
- Text.XML.HXT.RelaxNG.PatternToString: patternToFormatedString :: SLA [NameClass] Pattern String
- Text.XML.HXT.RelaxNG.PatternToString: patternToStringTree :: LA Pattern String
- Text.XML.HXT.RelaxNG.PatternToString: xmlTreeToPatternFormatedString :: LA XmlTree String
- Text.XML.HXT.RelaxNG.PatternToString: xmlTreeToPatternString :: LA XmlTree String
- Text.XML.HXT.RelaxNG.PatternToString: xmlTreeToPatternStringTree :: LA XmlTree String
- Text.XML.HXT.RelaxNG.Schema: relaxSchemaArrow :: ArrowList a => a b XmlTree
- Text.XML.HXT.RelaxNG.Schema: relaxSchemaTree :: XmlTree
- Text.XML.HXT.RelaxNG.SchemaGrammar: relaxSchemaArrow :: ArrowList a => a b XmlTree
- Text.XML.HXT.RelaxNG.SchemaGrammar: relaxSchemaTree :: XmlTree
- Text.XML.HXT.RelaxNG.Simplification: createSimpleForm :: Attributes -> Bool -> Bool -> Bool -> IOSArrow XmlTree XmlTree
- Text.XML.HXT.RelaxNG.Simplification: getErrors :: IOSArrow XmlTree XmlTree
- Text.XML.HXT.RelaxNG.Unicode.Blocks: codeBlocks :: [(String, (Char, Char))]
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeC :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeCc :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeCf :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeCo :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeCs :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeL :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeLl :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeLm :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeLo :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeLt :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeLu :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeM :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeMc :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeMe :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeMn :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeN :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeNd :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeNl :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeNo :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeP :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodePc :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodePd :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodePe :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodePf :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodePi :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodePo :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodePs :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeS :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeSc :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeSk :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeSm :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeSo :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeZ :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeZl :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeZp :: Char -> Bool
- Text.XML.HXT.RelaxNG.Unicode.CharProps: isUnicodeZs :: Char -> Bool
- Text.XML.HXT.RelaxNG.Utils: compareURI :: String -> String -> Bool
- Text.XML.HXT.RelaxNG.Utils: formatStringList :: (String -> String) -> String -> [String] -> String
- Text.XML.HXT.RelaxNG.Utils: formatStringListArr :: [String] -> String
- Text.XML.HXT.RelaxNG.Utils: formatStringListId :: [String] -> String
- Text.XML.HXT.RelaxNG.Utils: formatStringListPairs :: [(String, String)] -> String
- Text.XML.HXT.RelaxNG.Utils: formatStringListPatt :: [String] -> String
- Text.XML.HXT.RelaxNG.Utils: formatStringListQuot :: [String] -> String
- Text.XML.HXT.RelaxNG.Utils: isName :: String -> Bool
- Text.XML.HXT.RelaxNG.Utils: isNmtoken :: String -> Bool
- Text.XML.HXT.RelaxNG.Utils: isNumber :: String -> Bool
- Text.XML.HXT.RelaxNG.Utils: isRelaxAnyURI :: String -> Bool
- Text.XML.HXT.RelaxNG.Utils: normalizeURI :: String -> String
- Text.XML.HXT.RelaxNG.Validation: contains :: NameClass -> QName -> Bool
- Text.XML.HXT.RelaxNG.Validation: normalizeForRelaxValidation :: ArrowXml a => a XmlTree XmlTree
- Text.XML.HXT.RelaxNG.Validation: readForRelax :: Attributes -> String -> IOSArrow b XmlTree
- Text.XML.HXT.RelaxNG.Validation: validateDocWithRelax :: IOSArrow XmlTree XmlTree -> Attributes -> String -> IOSArrow XmlTree XmlTree
- Text.XML.HXT.RelaxNG.Validation: validateRelax :: XmlTree -> IOSArrow XmlTree XmlTree
- Text.XML.HXT.RelaxNG.Validation: validateWithRelaxAndHandleErrors :: IOSArrow XmlTree XmlTree -> IOSArrow XmlTree XmlTree
- Text.XML.HXT.RelaxNG.Validation: validateXMLDoc :: Attributes -> String -> IOSArrow XmlTree XmlTree
- Text.XML.HXT.RelaxNG.Validator: validate :: Attributes -> String -> String -> IOSArrow n XmlTree
- Text.XML.HXT.RelaxNG.Validator: validateDocumentWithRelax :: XmlTree -> IOSArrow XmlTree XmlTree
- Text.XML.HXT.RelaxNG.Validator: validateDocumentWithRelaxSchema :: Attributes -> String -> IOStateArrow s XmlTree XmlTree
- Text.XML.HXT.RelaxNG.Validator: validateSchema :: Attributes -> String -> IOSArrow n XmlTree
- Text.XML.HXT.RelaxNG.Validator: validateSchemaWithSpezification :: Attributes -> String -> IOSArrow XmlTree XmlTree
- Text.XML.HXT.RelaxNG.Validator: validateWithSpezification :: Attributes -> String -> String -> IOSArrow XmlTree XmlTree
- Text.XML.HXT.RelaxNG.Validator: validateWithoutSpezification :: Attributes -> String -> String -> IOSArrow n XmlTree
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: w3cDatatypeLib :: DatatypeLibrary
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: w3cNS :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_ENTITIES :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_ENTITY :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_ID :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_IDREF :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_IDREFS :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_NCName :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_NMTOKEN :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_NMTOKENS :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_NOTATION :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_Name :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_QName :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_anyURI :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_base64Binary :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_decimal :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_enumeration :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_fractionDigits :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_hexBinary :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_language :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_length :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_maxExclusive :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_maxInclusive :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_maxLength :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_minExclusive :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_minInclusive :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_minLength :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_normalizedString :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_pattern :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_string :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_token :: String
- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C: xsd_totalDigits :: String
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: (<&&>) :: (Char -> Bool) -> (Char -> Bool) -> (Char -> Bool)
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: (<||>) :: (Char -> Bool) -> (Char -> Bool) -> (Char -> Bool)
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: charRngs :: [Char] -> [(Char, Char)]
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: chars :: (Char -> Bool) -> [Char]
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: data Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: delta :: Regex -> Char -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: instance Show Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: isZero :: Regex -> Bool
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: matchWithRE :: Regex -> String -> Maybe String
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkAlt :: Regex -> Regex -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkCompl :: Regex -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkDif :: Regex -> Regex -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkDot :: Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkOpt :: Regex -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkRep :: Int -> Regex -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkRng :: Int -> Int -> Regex -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkSeq :: Regex -> Regex -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkStar :: Regex -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkSym :: (Char -> Bool) -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkSym1 :: Char -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkSymRng :: Char -> Char -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkUnit :: Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: mkZero :: String -> Regex
- Text.XML.HXT.RelaxNG.XmlSchema.Regex: nullable :: Regex -> Bool
- Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch: match :: String -> String -> Bool
- Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch: matchRE :: String -> String -> Maybe Bool
- Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch: sed :: (String -> String) -> String -> String -> String
- Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch: sedRE :: (String -> String) -> String -> String -> Maybe String
- Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch: split :: String -> String -> (String, String)
- Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch: splitRE :: String -> String -> Maybe (String, String)
- Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch: splitRegex :: Regex -> String -> Maybe (String, String)
- Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch: tokenize :: String -> String -> [String]
- Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch: tokenize' :: String -> String -> [Either String String]
- Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch: tokenizeRE :: String -> String -> Maybe [String]
- Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch: tokenizeRE' :: String -> String -> Maybe [Either String String]
- Text.XML.HXT.RelaxNG.XmlSchema.RegexParser: parseRegex :: String -> Either String Regex
+ Control.Arrow.ArrowExc: catchA :: ArrowExc a => a b c -> a SomeException c -> a b c
+ Control.Arrow.ArrowExc: class (Arrow a, ArrowChoice a, ArrowZero a, ArrowIO a) => ArrowExc a
+ Control.Arrow.ArrowExc: tryA :: ArrowExc a => a b c -> a b (Either SomeException c)
+ Control.Arrow.IOListArrow: instance ArrowExc IOLA
+ Control.Arrow.IOStateListArrow: instance ArrowExc (IOSLA s)
+ Data.Function.Selector: (.&&&.) :: Selector s a -> Selector s b -> Selector s (a, b)
+ Data.Function.Selector: S :: (s -> a) -> (a -> s -> s) -> Selector s a
+ Data.Function.Selector: chgM :: Monad m => Selector s a -> (a -> m a) -> (s -> m s)
+ Data.Function.Selector: chgS :: Selector s a -> (a -> a) -> (s -> s)
+ Data.Function.Selector: class Comp1 s a | s -> a
+ Data.Function.Selector: class Comp2 s a | s -> a
+ Data.Function.Selector: class Comp3 s a | s -> a
+ Data.Function.Selector: comp1 :: Comp1 s a => Selector s a
+ Data.Function.Selector: comp2 :: Comp2 s a => Selector s a
+ Data.Function.Selector: comp3 :: Comp3 s a => Selector s a
+ Data.Function.Selector: data Selector s a
+ Data.Function.Selector: getS :: Selector s a -> s -> a
+ Data.Function.Selector: idS :: Selector s s
+ Data.Function.Selector: instance Category Selector
+ Data.Function.Selector: instance Comp1 (a, b) a
+ Data.Function.Selector: instance Comp1 (a, b, c) a
+ Data.Function.Selector: instance Comp2 (a, b) b
+ Data.Function.Selector: instance Comp2 (a, b, c) b
+ Data.Function.Selector: instance Comp3 (a, b, c) c
+ Data.Function.Selector: mkSelector :: (s -> a) -> (a -> s -> s) -> Selector s a
+ Data.Function.Selector: setS :: Selector s a -> a -> s -> s
+ Data.Tree.NTree.TypeDefs: instance Binary a => Binary (NTree a)
+ Text.XML.HXT.Arrow.Binary: readBinaryValue :: (NFData a, Binary a) => String -> IOStateArrow s b a
+ Text.XML.HXT.Arrow.Binary: writeBinaryValue :: Binary a => String -> IOStateArrow s a ()
+ Text.XML.HXT.Arrow.DocumentInput: addInputError :: Attributes -> String -> IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.Pickle: showPickled :: XmlPickler a => SysConfigList -> a -> String
+ Text.XML.HXT.Arrow.Pickle: xp10Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU (a, b, c, d, e, f, g, h, i, j)
+ Text.XML.HXT.Arrow.Pickle: xp11Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU (a, b, c, d, e, f, g, h, i, j, k)
+ Text.XML.HXT.Arrow.Pickle: xp12Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU (a, b, c, d, e, f, g, h, i, j, k, l)
+ Text.XML.HXT.Arrow.Pickle: xp13Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m)
+ Text.XML.HXT.Arrow.Pickle: xp14Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
+ Text.XML.HXT.Arrow.Pickle: xp15Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
+ Text.XML.HXT.Arrow.Pickle: xp16Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
+ Text.XML.HXT.Arrow.Pickle: xp17Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)
+ Text.XML.HXT.Arrow.Pickle: xp18Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)
+ Text.XML.HXT.Arrow.Pickle: xp19Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU s -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)
+ Text.XML.HXT.Arrow.Pickle: xp20Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU s -> PU t -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)
+ Text.XML.HXT.Arrow.Pickle: xp21Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU s -> PU t -> PU u -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u)
+ Text.XML.HXT.Arrow.Pickle: xp22Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU s -> PU t -> PU u -> PU v -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v)
+ Text.XML.HXT.Arrow.Pickle: xp23Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU s -> PU t -> PU u -> PU v -> PU w -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w)
+ Text.XML.HXT.Arrow.Pickle: xp24Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU s -> PU t -> PU u -> PU v -> PU w -> PU x -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x)
+ Text.XML.HXT.Arrow.Pickle: xp7Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU (a, b, c, d, e, f, g)
+ Text.XML.HXT.Arrow.Pickle: xp8Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU (a, b, c, d, e, f, g, h)
+ Text.XML.HXT.Arrow.Pickle: xp9Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU (a, b, c, d, e, f, g, h, i)
+ Text.XML.HXT.Arrow.Pickle: xpTextAttr :: String -> PU String
+ Text.XML.HXT.Arrow.Pickle.Xml: showPickled :: XmlPickler a => SysConfigList -> a -> String
+ Text.XML.HXT.Arrow.Pickle.Xml: xp10Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU (a, b, c, d, e, f, g, h, i, j)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp11Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU (a, b, c, d, e, f, g, h, i, j, k)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp12Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU (a, b, c, d, e, f, g, h, i, j, k, l)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp13Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp14Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp15Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp16Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp17Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp18Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp19Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU s -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp20Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU s -> PU t -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp21Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU s -> PU t -> PU u -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp22Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU s -> PU t -> PU u -> PU v -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp23Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU s -> PU t -> PU u -> PU v -> PU w -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp24Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU j -> PU k -> PU l -> PU m -> PU n -> PU o -> PU p -> PU q -> PU r -> PU s -> PU t -> PU u -> PU v -> PU w -> PU x -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp7Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU (a, b, c, d, e, f, g)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp8Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU (a, b, c, d, e, f, g, h)
+ Text.XML.HXT.Arrow.Pickle.Xml: xp9Tuple :: PU a -> PU b -> PU c -> PU d -> PU e -> PU f -> PU g -> PU h -> PU i -> PU (a, b, c, d, e, f, g, h, i)
+ Text.XML.HXT.Arrow.Pickle.Xml: xpTextAttr :: String -> PU String
+ Text.XML.HXT.Arrow.ProcessDocument: andValidateNamespaces :: IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.WriteDocument: writeDocument' :: Bool -> String -> IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlOptions: a_accept_mimetypes :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_add_default_dtd :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_canonicalize :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_check_namespaces :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_collect_errors :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_default_baseuri :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_do_not_canonicalize :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_do_not_check_namespaces :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_do_not_issue_errors :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_do_not_issue_warnings :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_do_not_preserve_comment :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_do_not_remove_whitespace :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_do_not_validate :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_error :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_error_log :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_help :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_if_modified_since :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_if_unmodified_since :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_ignore_encoding_errors :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_ignore_none_xml_contents :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_indent :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_issue_errors :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_issue_warnings :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_mime_types :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_no_empty_elem_for :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_no_empty_elements :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_no_redirect :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_no_xml_pi :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_output_file :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_output_html :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_output_plain :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_output_xhtml :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_output_xml :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_parse_by_mimetype :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_parse_html :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_parse_xml :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_preserve_comment :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_proxy :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_redirect :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_remove_whitespace :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_show_haskell :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_show_tree :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_strict_input :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_text_mode :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_trace :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_validate :: String
+ Text.XML.HXT.Arrow.XmlOptions: a_verbose :: String
+ Text.XML.HXT.Arrow.XmlOptions: generalOptions :: [OptDescr SysConfig]
+ Text.XML.HXT.Arrow.XmlOptions: inputOptions :: [OptDescr SysConfig]
+ Text.XML.HXT.Arrow.XmlOptions: outputOptions :: [OptDescr SysConfig]
+ Text.XML.HXT.Arrow.XmlOptions: removeOptions :: [String] -> [OptDescr a] -> [OptDescr a]
+ Text.XML.HXT.Arrow.XmlOptions: selectOptions :: [String] -> [OptDescr a] -> [OptDescr a]
+ Text.XML.HXT.Arrow.XmlOptions: showOptions :: [OptDescr SysConfig]
+ Text.XML.HXT.Arrow.XmlOptions: versionOptions :: [OptDescr SysConfig]
+ Text.XML.HXT.Arrow.XmlRegex: mkAlts :: [XmlRegex] -> XmlRegex
+ Text.XML.HXT.Arrow.XmlRegex: mkSeqs :: [XmlRegex] -> XmlRegex
+ Text.XML.HXT.Arrow.XmlState: changeBaseURI :: IOStateArrow s String String
+ Text.XML.HXT.Arrow.XmlState: changeUserState :: (b -> s -> s) -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: clearErrStatus :: IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: configSysVars :: SysConfigList -> IOStateArrow s c c
+ Text.XML.HXT.Arrow.XmlState: data XIOState us
+ Text.XML.HXT.Arrow.XmlState: data XIOSysState
+ Text.XML.HXT.Arrow.XmlState: documentStatusOk :: ArrowXml a => a XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState: errorMsgCollect :: IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: errorMsgIgnore :: IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: errorMsgStderr :: IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: errorMsgStderrAndCollect :: IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: expandURI :: ArrowXml a => a (String, String) String
+ Text.XML.HXT.Arrow.XmlState: expandURIString :: String -> String -> Maybe String
+ Text.XML.HXT.Arrow.XmlState: filterErrorMsg :: IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState: getAllSysAttrs :: IOStateArrow s b Attributes
+ Text.XML.HXT.Arrow.XmlState: getBaseURI :: IOStateArrow s b String
+ Text.XML.HXT.Arrow.XmlState: getConfigAttr :: String -> SysConfigList -> String
+ Text.XML.HXT.Arrow.XmlState: getDefaultBaseURI :: IOStateArrow s b String
+ Text.XML.HXT.Arrow.XmlState: getErrStatus :: IOStateArrow s XmlTree Int
+ Text.XML.HXT.Arrow.XmlState: getErrorMessages :: IOStateArrow s b XmlTree
+ Text.XML.HXT.Arrow.XmlState: getFragmentFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState: getMimeTypeTable :: IOStateArrow s b MimeTypeTable
+ Text.XML.HXT.Arrow.XmlState: getPathFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState: getPortFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState: getQueryFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState: getRegNameFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState: getSchemeFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState: getSysAttr :: String -> IOStateArrow s b String
+ Text.XML.HXT.Arrow.XmlState: getSysAttrInt :: Int -> String -> IOStateArrow s b Int
+ Text.XML.HXT.Arrow.XmlState: getTraceCmd :: IOStateArrow a b (Int -> String -> IO ())
+ Text.XML.HXT.Arrow.XmlState: getTraceLevel :: IOStateArrow s b Int
+ Text.XML.HXT.Arrow.XmlState: getUserInfoFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState: getUserState :: IOStateArrow s b s
+ Text.XML.HXT.Arrow.XmlState: issueErr :: String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: issueExc :: String -> IOStateArrow s SomeException b
+ Text.XML.HXT.Arrow.XmlState: issueFatal :: String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: issueWarn :: String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: mkAbsURI :: IOStateArrow s String String
+ Text.XML.HXT.Arrow.XmlState: no :: Bool
+ Text.XML.HXT.Arrow.XmlState: runInLocalURIContext :: IOStateArrow s b c -> IOStateArrow s b c
+ Text.XML.HXT.Arrow.XmlState: runX :: IOSArrow XmlTree c -> IO [c]
+ Text.XML.HXT.Arrow.XmlState: setBaseURI :: IOStateArrow s String String
+ Text.XML.HXT.Arrow.XmlState: setDefaultBaseURI :: String -> IOStateArrow s b String
+ Text.XML.HXT.Arrow.XmlState: setDocumentStatus :: Int -> String -> IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState: setDocumentStatusFromSystemState :: String -> IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState: setErrMsgStatus :: IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState: setErrStatus :: IOStateArrow s Int Int
+ Text.XML.HXT.Arrow.XmlState: setErrorMsgHandler :: Bool -> (String -> IO ()) -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: setMimeTypeTable :: MimeTypeTable -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: setMimeTypeTableFromFile :: FilePath -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: setSysAttr :: String -> IOStateArrow s String String
+ Text.XML.HXT.Arrow.XmlState: setSysAttrInt :: String -> Int -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: setSysAttrString :: String -> String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: setTraceCmd :: (Int -> String -> IO ()) -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: setTraceLevel :: Int -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: setUserState :: IOStateArrow s s s
+ Text.XML.HXT.Arrow.XmlState: trace :: Int -> IOStateArrow s b String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: traceDoc :: String -> IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState: traceMsg :: Int -> String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: traceSource :: IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState: traceString :: Int -> (b -> String) -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: traceTree :: IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState: traceValue :: Int -> (b -> String) -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: type IOSArrow b c = IOStateArrow () b c
+ Text.XML.HXT.Arrow.XmlState: type IOStateArrow s b c = IOSLA (XIOState s) b c
+ Text.XML.HXT.Arrow.XmlState: type SysConfig = XIOSysState -> XIOSysState
+ Text.XML.HXT.Arrow.XmlState: type SysConfigList = [SysConfig]
+ Text.XML.HXT.Arrow.XmlState: unsetSysAttr :: String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState: withAcceptedMimeTypes :: [String] -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withAddDefaultDTD :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withCanonicalize :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withCheckNamespaces :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withCompression :: (CompressionFct, DeCompressionFct) -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withDefaultBaseURI :: String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withEncodingErrors :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withErrors :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withExtendedUserState :: s1 -> IOStateArrow (s1, s0) b c -> IOStateArrow s0 b c
+ Text.XML.HXT.Arrow.XmlState: withIgnoreNoneXmlContents :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withIndent :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withInputEncoding :: String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withInputOption :: String -> String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withInputOptions :: Attributes -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withMimeTypeFile :: String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withNoEmptyElemFor :: [String] -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withOtherUserState :: s1 -> IOStateArrow s1 b c -> IOStateArrow s0 b c
+ Text.XML.HXT.Arrow.XmlState: withOutputEncoding :: String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withOutputHTML :: SysConfig
+ Text.XML.HXT.Arrow.XmlState: withOutputPLAIN :: SysConfig
+ Text.XML.HXT.Arrow.XmlState: withOutputXHTML :: SysConfig
+ Text.XML.HXT.Arrow.XmlState: withOutputXML :: SysConfig
+ Text.XML.HXT.Arrow.XmlState: withParseByMimeType :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withParseHTML :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withPreserveComment :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withProxy :: String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withRedirect :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withRemoveWS :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withShowHaskell :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withShowTree :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withStrictInput :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withSysAttr :: String -> String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withTextMode :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withTrace :: Int -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withTraceLevel :: Int -> IOStateArrow s b c -> IOStateArrow s b c
+ Text.XML.HXT.Arrow.XmlState: withValidate :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withWarnings :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withXmlPi :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState: withoutUserState :: IOSArrow b c -> IOStateArrow s0 b c
+ Text.XML.HXT.Arrow.XmlState: yes :: Bool
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: addToErrorMsgList :: IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: changeErrorStatus :: (Int -> Int -> Int) -> IOStateArrow s Int Int
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: clearErrStatus :: IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: documentStatusOk :: ArrowXml a => a XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: errorMsgCollect :: IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: errorMsgIgnore :: IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: errorMsgStderr :: IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: errorMsgStderrAndCollect :: IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: errorOutputToStderr :: String -> IO ()
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: filterErrorMsg :: IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: getErrStatus :: IOStateArrow s XmlTree Int
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: getErrorMessages :: IOStateArrow s b XmlTree
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: issueErr :: String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: issueExc :: String -> IOStateArrow s SomeException b
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: issueFatal :: String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: issueWarn :: String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: setDocumentStatus :: Int -> String -> IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: setDocumentStatusFromSystemState :: String -> IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: setErrMsgStatus :: IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: setErrStatus :: IOStateArrow s Int Int
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: setErrorMsgHandler :: Bool -> (String -> IO ()) -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.ErrorHandling: sysErrorMsg :: IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.MimeTypeTable: getMimeTypeTable :: IOStateArrow s b MimeTypeTable
+ Text.XML.HXT.Arrow.XmlState.MimeTypeTable: setMimeTypeTable :: MimeTypeTable -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.MimeTypeTable: setMimeTypeTableFromFile :: FilePath -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: dummyCacheRead :: String -> IOSArrow b b
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: dummyHTTPHandler :: IOSArrow XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: dummyRelaxValidator :: IOSArrow b b
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: dummyTagSoupParser :: IOSArrow b b
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: getConfigAttr :: String -> SysConfigList -> String
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: initialCacheConfig :: XIOCacheConfig
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: initialInputConfig :: XIOInputConfig
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: initialOutputConfig :: XIOOutputConfig
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: initialParseConfig :: XIOParseConfig
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: initialRelaxConfig :: XIORelaxConfig
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: initialState :: us -> XIOState us
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: initialSysEnv :: XIOSysEnv
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: initialSysState :: XIOSysState
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: initialSysWriter :: XIOSysWriter
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: runX :: IOSArrow XmlTree c -> IO [c]
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: runXIOState :: XIOState s -> IOStateArrow s XmlTree c -> IO [c]
+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow: theSysConfigComp :: Selector XIOSysState a -> Selector SysConfig a
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: no :: Bool
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withAcceptedMimeTypes :: [String] -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withAddDefaultDTD :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withCanonicalize :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withCheckNamespaces :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withCompression :: (CompressionFct, DeCompressionFct) -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withDefaultBaseURI :: String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withEncodingErrors :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withErrors :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withIgnoreNoneXmlContents :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withIndent :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withInputEncoding :: String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withInputOption :: String -> String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withInputOptions :: Attributes -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withMimeTypeFile :: String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withNoEmptyElemFor :: [String] -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withOutputEncoding :: String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withOutputHTML :: SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withOutputPLAIN :: SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withOutputXHTML :: SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withOutputXML :: SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withParseByMimeType :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withParseHTML :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withPreserveComment :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withProxy :: String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withRedirect :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withRemoveWS :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withShowHaskell :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withShowTree :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withStrictInput :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withSysAttr :: String -> String -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withTextMode :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withTrace :: Int -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withValidate :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withWarnings :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: withXmlPi :: Bool -> SysConfig
+ Text.XML.HXT.Arrow.XmlState.SystemConfig: yes :: Bool
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: getTraceCmd :: IOStateArrow a b (Int -> String -> IO ())
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: getTraceLevel :: IOStateArrow s b Int
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: setTraceCmd :: (Int -> String -> IO ()) -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: setTraceLevel :: Int -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: trace :: Int -> IOStateArrow s b String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: traceDoc :: String -> IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: traceMsg :: Int -> String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: traceOutputToStderr :: Int -> String -> IO ()
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: traceSource :: IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: traceString :: Int -> (b -> String) -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: traceTree :: IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: traceValue :: Int -> (b -> String) -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.TraceHandling: withTraceLevel :: Int -> IOStateArrow s b c -> IOStateArrow s b c
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: (.&&&.) :: Selector s a -> Selector s b -> Selector s (a, b)
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: HTMLoutput :: XIOXoutConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: PLAINoutput :: XIOXoutConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: S :: (s -> a) -> (a -> s -> s) -> Selector s a
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: XHTMLoutput :: XIOXoutConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: XIOCch :: CompressionFct -> DeCompressionFct -> !Bool -> !String -> !Int -> !Bool -> (String -> IOSArrow XmlTree XmlTree) -> XIOCacheConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: XIOEnv :: !Int -> (Int -> String -> IO ()) -> !Int -> (String -> IO ()) -> !Bool -> !String -> !String -> !Attributes -> !XIOInputConfig -> !XIOParseConfig -> !XIOOutputConfig -> !XIORelaxConfig -> !XIOCacheConfig -> XIOSysEnv
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: XIOIcgf :: !Bool -> !Bool -> String -> IOSArrow XmlTree XmlTree -> !Attributes -> !Bool -> String -> XIOInputConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: XIOOcfg :: !Bool -> !String -> !XIOXoutConfig -> !Bool -> ![String] -> !Bool -> !Bool -> !Bool -> !Bool -> XIOOutputConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: XIOPcfg :: MimeTypeTable -> String -> [String] -> !Bool -> !Bool -> !Bool -> !Bool -> !Bool -> !Bool -> !Bool -> !Bool -> !Bool -> !Bool -> !Bool -> IOSArrow XmlTree XmlTree -> XIOParseConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: XIORxc :: !Bool -> String -> !Bool -> !Bool -> !Bool -> !Bool -> !Int -> !Int -> AssocList String XmlTrees -> IOSArrow XmlTree XmlTree -> XIORelaxConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: XIOState :: !XIOSysState -> !us -> XIOState us
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: XIOSys :: !XIOSysWriter -> !XIOSysEnv -> XIOSysState
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: XIOwrt :: !XmlTrees -> XIOSysWriter
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: XMLoutput :: XIOXoutConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: changeUserState :: (b -> s -> s) -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: chgS :: Selector s a -> (a -> a) -> (s -> s)
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: chgSysVar :: Selector XIOSysState c -> (b -> c -> c) -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: configSysVar :: SysConfig -> IOStateArrow s c c
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: configSysVars :: SysConfigList -> IOStateArrow s c c
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: data Selector s a
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: data XIOCacheConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: data XIOInputConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: data XIOOutputConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: data XIOParseConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: data XIORelaxConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: data XIOState us
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: data XIOSysEnv
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: data XIOSysState
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: data XIOSysWriter
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: data XIOXoutConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: getAllSysAttrs :: IOStateArrow s b Attributes
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: getS :: Selector s a -> s -> a
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: getSysAttr :: String -> IOStateArrow s b String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: getSysAttrInt :: Int -> String -> IOStateArrow s b Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: getSysVar :: Selector XIOSysState c -> IOStateArrow s b c
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: getUserState :: IOStateArrow s b s
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: idS :: Selector s s
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: incrSysVar :: Selector XIOSysState Int -> IOStateArrow s a Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: instance Eq XIOXoutConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: instance NFData XIOSysState
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: instance NFData us => NFData (XIOState us)
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: localSysEnv :: IOStateArrow s a b -> IOStateArrow s a b
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: localSysVar :: Selector XIOSysState c -> IOStateArrow s a b -> IOStateArrow s a b
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: setS :: Selector s a -> a -> s -> s
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: setSysAttr :: String -> IOStateArrow s String String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: setSysAttrInt :: String -> Int -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: setSysAttrString :: String -> String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: setSysVar :: Selector XIOSysState c -> IOStateArrow s c c
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: setUserState :: IOStateArrow s s s
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theAcceptedMimeTypes :: Selector XIOSysState [String]
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theAddDefaultDTD :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theAttrList :: Selector XIOSysState Attributes
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theBaseURI :: Selector XIOSysState String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theBinaryCompression :: Selector XIOSysState (ByteString -> ByteString)
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theBinaryDeCompression :: Selector XIOSysState (ByteString -> ByteString)
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theCache404Err :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theCacheConfig :: Selector XIOSysState XIOCacheConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theCacheDir :: Selector XIOSysState String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theCacheRead :: Selector XIOSysState (String -> IOSArrow XmlTree XmlTree)
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theCanonicalize :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theCheckNamespaces :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theDefaultBaseURI :: Selector XIOSysState String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theDocumentAge :: Selector XIOSysState Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theEncodingErrors :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theErrorMsgCollect :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theErrorMsgHandler :: Selector XIOSysState (String -> IO ())
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theErrorMsgList :: Selector XIOSysState XmlTrees
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theErrorStatus :: Selector XIOSysState Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theHttpHandler :: Selector XIOSysState (IOSArrow XmlTree XmlTree)
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theIgnoreNoneXmlContents :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theIndent :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theInputConfig :: Selector XIOSysState XIOInputConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theInputEncoding :: Selector XIOSysState String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theInputOptions :: Selector XIOSysState Attributes
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theLowerCaseNames :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theMimeTypeFile :: Selector XIOSysState String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theMimeTypes :: Selector XIOSysState MimeTypeTable
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theNoEmptyElemFor :: Selector XIOSysState [String]
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theOutputConfig :: Selector XIOSysState XIOOutputConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theOutputEncoding :: Selector XIOSysState String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theOutputFmt :: Selector XIOSysState XIOXoutConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theParseByMimeType :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theParseConfig :: Selector XIOSysState XIOParseConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theParseHTML :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: thePreserveComment :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theProxy :: Selector XIOSysState String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRedirect :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRelaxAttrList :: Selector XIOSysState (AssocList String XmlTrees)
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRelaxCheckRestr :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRelaxCollectErrors :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRelaxConfig :: Selector XIOSysState XIORelaxConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRelaxDefineId :: Selector XIOSysState Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRelaxNoOfErrors :: Selector XIOSysState Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRelaxSchema :: Selector XIOSysState String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRelaxValidate :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRelaxValidateExtRef :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRelaxValidateInclude :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRelaxValidator :: Selector XIOSysState (IOSArrow XmlTree XmlTree)
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theRemoveWS :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theShowHaskell :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theShowTree :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theStrictInput :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theSysEnv :: Selector XIOSysState XIOSysEnv
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theSysState :: Selector (XIOState us) XIOSysState
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theSysWriter :: Selector XIOSysState XIOSysWriter
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theTagSoup :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theTagSoupParser :: Selector XIOSysState (IOSArrow XmlTree XmlTree)
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theTextMode :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theTrace :: Selector XIOSysState (Int, Int -> String -> IO ())
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theTraceCmd :: Selector XIOSysState (Int -> String -> IO ())
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theTraceLevel :: Selector XIOSysState Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theUserState :: Selector (XIOState us) us
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theValidate :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theWarnings :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theWithCache :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: theXmlPi :: Selector XIOSysState Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: toInt :: Int -> String -> Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: type CompressionFct = ByteString -> ByteString
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: type DeCompressionFct = ByteString -> ByteString
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: type IOSArrow b c = IOStateArrow () b c
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: type IOStateArrow s b c = IOSLA (XIOState s) b c
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: type SysConfig = XIOSysState -> XIOSysState
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: type SysConfigList = [SysConfig]
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: unsetSysAttr :: String -> IOStateArrow s b b
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: withExtendedUserState :: s1 -> IOStateArrow (s1, s0) b c -> IOStateArrow s0 b c
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: withOtherUserState :: s1 -> IOStateArrow s1 b c -> IOStateArrow s0 b c
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: withoutUserState :: IOSArrow b c -> IOStateArrow s0 b c
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioAcceptedMimeTypes :: XIOParseConfig -> [String]
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioAddDefaultDTD :: XIOOutputConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioAttrList :: XIOSysEnv -> !Attributes
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioBaseURI :: XIOSysEnv -> !String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioBinaryCompression :: XIOCacheConfig -> CompressionFct
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioBinaryDeCompression :: XIOCacheConfig -> DeCompressionFct
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioCache404Err :: XIOCacheConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioCacheConfig :: XIOSysEnv -> !XIOCacheConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioCacheDir :: XIOCacheConfig -> !String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioCacheRead :: XIOCacheConfig -> String -> IOSArrow XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioCanonicalize :: XIOParseConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioCheckNamespaces :: XIOParseConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioDefaultBaseURI :: XIOSysEnv -> !String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioDocumentAge :: XIOCacheConfig -> !Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioEncodingErrors :: XIOInputConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioErrorMsgCollect :: XIOSysEnv -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioErrorMsgHandler :: XIOSysEnv -> String -> IO ()
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioErrorMsgList :: XIOSysWriter -> !XmlTrees
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioErrorStatus :: XIOSysEnv -> !Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioHttpHandler :: XIOInputConfig -> IOSArrow XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioIgnoreNoneXmlContents :: XIOParseConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioIndent :: XIOOutputConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioInputConfig :: XIOSysEnv -> !XIOInputConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioInputEncoding :: XIOInputConfig -> String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioInputOptions :: XIOInputConfig -> !Attributes
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioLowerCaseNames :: XIOParseConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioMimeTypeFile :: XIOParseConfig -> String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioMimeTypes :: XIOParseConfig -> MimeTypeTable
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioNoEmptyElemFor :: XIOOutputConfig -> ![String]
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioOutputConfig :: XIOSysEnv -> !XIOOutputConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioOutputEncoding :: XIOOutputConfig -> !String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioOutputFmt :: XIOOutputConfig -> !XIOXoutConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioParseByMimeType :: XIOParseConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioParseConfig :: XIOSysEnv -> !XIOParseConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioParseHTML :: XIOParseConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioPreserveComment :: XIOParseConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioProxy :: XIOInputConfig -> String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRedirect :: XIOInputConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRelaxAttrList :: XIORelaxConfig -> AssocList String XmlTrees
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRelaxCheckRestr :: XIORelaxConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRelaxCollectErrors :: XIORelaxConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRelaxConfig :: XIOSysEnv -> !XIORelaxConfig
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRelaxDefineId :: XIORelaxConfig -> !Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRelaxNoOfErrors :: XIORelaxConfig -> !Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRelaxSchema :: XIORelaxConfig -> String
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRelaxValidate :: XIORelaxConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRelaxValidateExtRef :: XIORelaxConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRelaxValidateInclude :: XIORelaxConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRelaxValidator :: XIORelaxConfig -> IOSArrow XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioRemoveWS :: XIOParseConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioShowHaskell :: XIOOutputConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioShowTree :: XIOOutputConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioStrictInput :: XIOInputConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioSysEnv :: XIOSysState -> !XIOSysEnv
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioSysState :: XIOState us -> !XIOSysState
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioSysWriter :: XIOSysState -> !XIOSysWriter
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioTagSoup :: XIOParseConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioTagSoupParser :: XIOParseConfig -> IOSArrow XmlTree XmlTree
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioTextMode :: XIOOutputConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioTraceCmd :: XIOSysEnv -> Int -> String -> IO ()
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioTraceLevel :: XIOSysEnv -> !Int
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioUserState :: XIOState us -> !us
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioValidate :: XIOParseConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioWarnings :: XIOParseConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioWithCache :: XIOCacheConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.TypeDefs: xioXmlPi :: XIOOutputConfig -> !Bool
+ Text.XML.HXT.Arrow.XmlState.URIHandling: changeBaseURI :: IOStateArrow s String String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: expandURI :: ArrowXml a => a (String, String) String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: expandURIString :: String -> String -> Maybe String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: getBaseURI :: IOStateArrow s b String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: getDefaultBaseURI :: IOStateArrow s b String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: getFragmentFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: getPartFromURI :: ArrowList a => (URI -> String) -> a String String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: getPathFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: getPortFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: getQueryFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: getRegNameFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: getSchemeFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: getUserInfoFromURI :: ArrowList a => a String String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: mkAbsURI :: IOStateArrow s String String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: parseURIReference' :: String -> Maybe URI
+ Text.XML.HXT.Arrow.XmlState.URIHandling: runInLocalURIContext :: IOStateArrow s b c -> IOStateArrow s b c
+ Text.XML.HXT.Arrow.XmlState.URIHandling: setBaseURI :: IOStateArrow s String String
+ Text.XML.HXT.Arrow.XmlState.URIHandling: setDefaultBaseURI :: String -> IOStateArrow s b String
+ Text.XML.HXT.DOM.QualifiedName: instance Binary QName
+ Text.XML.HXT.DOM.TypeDefs: instance Binary DTDElem
+ Text.XML.HXT.DOM.TypeDefs: instance Binary XNode
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: w3cNS :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_ENTITIES :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_ENTITY :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_ID :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_IDREF :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_IDREFS :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_NCName :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_NMTOKEN :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_NMTOKENS :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_NOTATION :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_Name :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_QName :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_anyURI :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_base64Binary :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_byte :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_decimal :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_enumeration :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_fractionDigits :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_hexBinary :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_int :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_integer :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_language :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_length :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_long :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_maxExclusive :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_maxInclusive :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_maxLength :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_minExclusive :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_minInclusive :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_minLength :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_negativeInteger :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_nonNegativeInteger :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_nonPositiveInteger :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_normalizedString :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_pattern :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_positiveInteger :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_short :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_string :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_token :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_totalDigits :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_unsignedByte :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_unsignedInt :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_unsignedLong :: String
+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames: xsd_unsignedShort :: String
- Text.XML.HXT.Arrow.Pickle: xpickleDocument :: PU a -> Attributes -> String -> IOStateArrow s a XmlTree
+ Text.XML.HXT.Arrow.Pickle: xpickleDocument :: PU a -> SysConfigList -> String -> IOStateArrow s a XmlTree
- Text.XML.HXT.Arrow.Pickle: xpickleWriteDTD :: PU b -> Attributes -> String -> IOStateArrow s b XmlTree
+ Text.XML.HXT.Arrow.Pickle: xpickleWriteDTD :: PU b -> SysConfigList -> String -> IOStateArrow s b XmlTree
- Text.XML.HXT.Arrow.Pickle: xunpickleDocument :: PU a -> Attributes -> String -> IOStateArrow s b a
+ Text.XML.HXT.Arrow.Pickle: xunpickleDocument :: PU a -> SysConfigList -> String -> IOStateArrow s b a
- Text.XML.HXT.Arrow.ProcessDocument: getDocumentContents :: Attributes -> String -> IOStateArrow s b XmlTree
+ Text.XML.HXT.Arrow.ProcessDocument: getDocumentContents :: String -> IOStateArrow s b XmlTree
- Text.XML.HXT.Arrow.ProcessDocument: parseHtmlDocument :: Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.ProcessDocument: parseHtmlDocument :: IOStateArrow s XmlTree XmlTree
- Text.XML.HXT.Arrow.ReadDocument: readDocument :: Attributes -> String -> IOStateArrow s b XmlTree
+ Text.XML.HXT.Arrow.ReadDocument: readDocument :: SysConfigList -> String -> IOStateArrow s b XmlTree
- Text.XML.HXT.Arrow.ReadDocument: readFromDocument :: Attributes -> IOStateArrow s String XmlTree
+ Text.XML.HXT.Arrow.ReadDocument: readFromDocument :: SysConfigList -> IOStateArrow s String XmlTree
- Text.XML.HXT.Arrow.ReadDocument: readFromString :: Attributes -> IOStateArrow s String XmlTree
+ Text.XML.HXT.Arrow.ReadDocument: readFromString :: SysConfigList -> IOStateArrow s String XmlTree
- Text.XML.HXT.Arrow.ReadDocument: readString :: Attributes -> String -> IOStateArrow s b XmlTree
+ Text.XML.HXT.Arrow.ReadDocument: readString :: SysConfigList -> String -> IOStateArrow s b XmlTree
- Text.XML.HXT.Arrow.WriteDocument: prepareContents :: ArrowXml a => Attributes -> (Bool -> String -> a XmlTree XmlTree) -> a XmlTree XmlTree
+ Text.XML.HXT.Arrow.WriteDocument: prepareContents :: ArrowXml a => XIOSysState -> (Bool -> String -> a XmlTree XmlTree) -> a XmlTree XmlTree
- Text.XML.HXT.Arrow.WriteDocument: writeDocument :: Attributes -> String -> IOStateArrow s XmlTree XmlTree
+ Text.XML.HXT.Arrow.WriteDocument: writeDocument :: SysConfigList -> String -> IOStateArrow s XmlTree XmlTree
- Text.XML.HXT.Arrow.WriteDocument: writeDocumentToString :: ArrowXml a => Attributes -> a XmlTree String
+ Text.XML.HXT.Arrow.WriteDocument: writeDocumentToString :: ArrowXml a => SysConfigList -> a XmlTree String
Files
- examples/arrows/AGentleIntroductionToHXT/PicklerExample/Baseball.hs +6/−6
- examples/arrows/AGentleIntroductionToHXT/SimpleExamples.hs +35/−27
- examples/arrows/HelloWorld/HelloWorld.hs +4/−4
- examples/arrows/HelloWorld/Mini.hs +5/−3
- examples/arrows/RegexXMLSchema/Makefile +0/−128
- examples/arrows/RegexXMLSchema/REtest.hs +0/−170
- examples/arrows/absurls/AbsURIs.hs +44/−39
- examples/arrows/absurls/ProcessDocument.hs +3/−4
- examples/arrows/dtd2hxt/DTDtoHXT.hs +201/−201
- examples/arrows/hparser/HXmlParser.hs +73/−64
- examples/arrows/hparser/Makefile +5/−44
- examples/arrows/hrelaxng/.ghci +0/−3
- examples/arrows/hrelaxng/HRelaxNG.hs +0/−170
- examples/arrows/hrelaxng/Makefile +0/−77
- examples/arrows/hrelaxng/invalid1.xml +0/−1
- examples/arrows/hrelaxng/invalid2.rng +0/−13
- examples/arrows/hrelaxng/invalid3.rng +0/−19
- examples/arrows/hrelaxng/valid1.rng +0/−7
- examples/arrows/hrelaxng/valid1.xml +0/−1
- examples/arrows/hrelaxng/valid2.rng +0/−27
- examples/arrows/hrelaxng/valid2.xml +0/−1
- examples/arrows/performance/GenDoc.hs +10/−9
- examples/arrows/pickle/PickleTest.hs +12/−12
- hxt.cabal +25/−48
- src/Control/Arrow/ArrowExc.hs +38/−0
- src/Control/Arrow/ArrowIO.hs +1/−2
- src/Control/Arrow/ArrowIf.hs +3/−5
- src/Control/Arrow/ArrowList.hs +7/−8
- src/Control/Arrow/ArrowState.hs +1/−1
- src/Control/Arrow/ArrowTree.hs +6/−8
- src/Control/Arrow/IOListArrow.hs +21/−7
- src/Control/Arrow/IOStateListArrow.hs +24/−10
- src/Control/Arrow/ListArrows.hs +4/−2
- src/Data/AssocList.hs +17/−5
- src/Data/Atom.hs +2/−3
- src/Data/Char/UTF8.hs +0/−363
- src/Data/Function/Selector.hs +139/−0
- src/Data/Tree/NTree/TypeDefs.hs +8/−0
- src/Text/XML/HXT/Arrow.hs +0/−64
- src/Text/XML/HXT/Arrow/Binary.hs +69/−0
- src/Text/XML/HXT/Arrow/DTDProcessing.hs +2/−3
- src/Text/XML/HXT/Arrow/DocumentInput.hs +32/−71
- src/Text/XML/HXT/Arrow/DocumentOutput.hs +43/−41
- src/Text/XML/HXT/Arrow/Edit.hs +3/−2
- src/Text/XML/HXT/Arrow/GeneralEntitySubstitution.hs +2/−2
- src/Text/XML/HXT/Arrow/Namespace.hs +21/−9
- src/Text/XML/HXT/Arrow/ParserInterface.hs +15/−25
- src/Text/XML/HXT/Arrow/Pickle.hs +47/−23
- src/Text/XML/HXT/Arrow/Pickle/DTD.hs +1/−1
- src/Text/XML/HXT/Arrow/Pickle/Schema.hs +1/−1
- src/Text/XML/HXT/Arrow/Pickle/Xml.hs +245/−3
- src/Text/XML/HXT/Arrow/ProcessDocument.hs +68/−52
- src/Text/XML/HXT/Arrow/ReadDocument.hs +184/−208
- src/Text/XML/HXT/Arrow/WriteDocument.hs +115/−100
- src/Text/XML/HXT/Arrow/XmlArrow.hs +1/−2
- src/Text/XML/HXT/Arrow/XmlIOStateArrow.hs +0/−989
- src/Text/XML/HXT/Arrow/XmlOptions.hs +242/−0
- src/Text/XML/HXT/Arrow/XmlRegex.hs +11/−3
- src/Text/XML/HXT/Arrow/XmlState.hs +157/−0
- src/Text/XML/HXT/Arrow/XmlState/ErrorHandling.hs +252/−0
- src/Text/XML/HXT/Arrow/XmlState/MimeTypeTable.hs +60/−0
- src/Text/XML/HXT/Arrow/XmlState/RunIOStateArrow.hs +218/−0
- src/Text/XML/HXT/Arrow/XmlState/SystemConfig.hs +234/−0
- src/Text/XML/HXT/Arrow/XmlState/TraceHandling.hs +150/−0
- src/Text/XML/HXT/Arrow/XmlState/TypeDefs.hs +809/−0
- src/Text/XML/HXT/Arrow/XmlState/URIHandling.hs +239/−0
- src/Text/XML/HXT/Core.hs +69/−0
- src/Text/XML/HXT/DOM/Interface.hs +2/−3
- src/Text/XML/HXT/DOM/IsoLatinTables.hs +0/−719
- src/Text/XML/HXT/DOM/QualifiedName.hs +15/−1
- src/Text/XML/HXT/DOM/TypeDefs.hs +52/−0
- src/Text/XML/HXT/DOM/UTF8Decoding.hs +0/−52
- src/Text/XML/HXT/DOM/Unicode.hs +0/−1105
- src/Text/XML/HXT/DOM/XmlKeywords.hs +1/−158
- src/Text/XML/HXT/DOM/XmlOptions.hs +0/−188
- src/Text/XML/HXT/DTDValidation/DocTransformation.hs +11/−13
- src/Text/XML/HXT/IO/GetHTTPLibCurl.hs +0/−310
- src/Text/XML/HXT/Parser/TagSoup.hs +0/−495
- src/Text/XML/HXT/Parser/XmlCharParser.hs +26/−5
- src/Text/XML/HXT/Parser/XmlDTDTokenParser.hs +0/−1
- src/Text/XML/HXT/Parser/XmlParsec.hs +0/−1
- src/Text/XML/HXT/Parser/XmlTokenParser.hs +10/−11
- src/Text/XML/HXT/RelaxNG.hs +0/−24
- src/Text/XML/HXT/RelaxNG/BasicArrows.hs +0/−326
- src/Text/XML/HXT/RelaxNG/CreatePattern.hs +0/−349
- src/Text/XML/HXT/RelaxNG/DataTypeLibMysql.hs +0/−169
- src/Text/XML/HXT/RelaxNG/DataTypeLibUtils.hs +0/−407
- src/Text/XML/HXT/RelaxNG/DataTypeLibraries.hs +0/−140
- src/Text/XML/HXT/RelaxNG/DataTypes.hs +0/−296
- src/Text/XML/HXT/RelaxNG/PatternFunctions.hs +0/−108
- src/Text/XML/HXT/RelaxNG/PatternToString.hs +0/−360
- src/Text/XML/HXT/RelaxNG/Schema.hs +0/−3921
- src/Text/XML/HXT/RelaxNG/SchemaGrammar.hs +0/−3831
- src/Text/XML/HXT/RelaxNG/Simplification.hs +0/−2321
- src/Text/XML/HXT/RelaxNG/Unicode/Blocks.hs +0/−229
- src/Text/XML/HXT/RelaxNG/Unicode/CharProps.hs +0/−3945
- src/Text/XML/HXT/RelaxNG/Utils.hs +0/−161
- src/Text/XML/HXT/RelaxNG/Validation.hs +0/−617
- src/Text/XML/HXT/RelaxNG/Validator.hs +0/−308
- src/Text/XML/HXT/RelaxNG/XmlSchema/DataTypeLibW3C.hs +0/−610
- src/Text/XML/HXT/RelaxNG/XmlSchema/Regex.hs +0/−317
- src/Text/XML/HXT/RelaxNG/XmlSchema/RegexMatch.hs +0/−241
- src/Text/XML/HXT/RelaxNG/XmlSchema/RegexParser.hs +0/−354
- src/Text/XML/HXT/XMLSchema/DataTypeLibW3CNames.hs +124/−0
examples/arrows/AGentleIntroductionToHXT/PicklerExample/Baseball.hs view
@@ -11,7 +11,7 @@ import Data.Map (Map, fromList, toList) -import Text.XML.HXT.Arrow+import Text.XML.HXT.Core -- Example data taken from: -- http://www.ibiblio.org/xml/books/bible/examples/05/5-1.xml@@ -115,15 +115,15 @@ main :: IO () main = do- runX ( xunpickleDocument xpSeason [ (a_validate,v_0)- , (a_trace, v_1)- , (a_remove_whitespace,v_1)- , (a_preserve_comment, v_0)+ runX ( xunpickleDocument xpSeason [ withValidate no+ , withTrace 1+ , withRemoveWS yes+ , withPreserveComment no ] "simple2.xml" >>> processSeason >>>- xpickleDocument xpSeason [ (a_indent, v_1)+ xpickleDocument xpSeason [ withIndent yes ] "new-simple2.xml" ) return ()
examples/arrows/AGentleIntroductionToHXT/SimpleExamples.hs view
@@ -1,14 +1,13 @@ {- |- $Id: SimpleExamples.hs,v 1.3 2006/11/17 17:16:24 hxml Exp $- - The examples from the HXT tutorial at haskell.org "http://www.haskell.org/haskellwiki/HXT"+ The examples from the HXT tutorial at haskell.org "http://www.haskell.org/haskellwiki/HXT" -} module Main where -import Text.XML.HXT.Arrow -- import HXT stuff-import Text.XML.HXT.XPath+import Text.XML.HXT.Core -- basic HXT stuff+import Text.XML.HXT.XPath -- additional XPath functions+import Text.XML.HXT.Curl -- Curl HTTP handler import Data.List -- auxiliary functions import Data.Maybe@@ -35,45 +34,54 @@ then exitWith (ExitFailure (-1)) else exitWith ExitSuccess -application :: Attributes -> String -> String -> String -> IOSArrow b Int-application al fct src dst- = readDocument al src+application :: SysConfigList -> String -> String -> String -> IOSArrow b Int+application config fct src dst+ = configSysVars config -- set all global config options >>>+ readDocument [] src+ >>> processChildren (processRootElement fct `when` isElem) >>>- writeDocument ( (a_indent, v_1)- : (a_output_encoding, isoLatin1)- : al- ) dst+ writeDocument [ withIndent yes,+ withOutputEncoding isoLatin1+ ]+ dst >>> getErrStatus -- | the dummy for the boring stuff of option evaluation, -- usually done with 'System.Console.GetOpt' -cmdlineOpts :: [String] -> IO (Attributes, String, String, String)+cmdlineOpts :: [String] -> IO (SysConfigList, String, String, String) cmdlineOpts argv- = return ([(a_validate, v_0),(a_parse_html, v_1)], argv!!0, argv!!1, argv!!2)+ = return ( [ withValidate no+ , withParseHTML yes+ , withCurl []+ ]+ , argv!!0+ , argv!!1+ , argv!!2+ ) -- | the processing examples examples :: [ (String, IOSArrow XmlTree XmlTree) ] examples- = [ ( "selectAllText", selectAllText )- , ( "selectAllTextAndAltValues", selectAllTextAndAltValues )+ = [ ( "selectAllText", selectAllText )+ , ( "selectAllTextAndAltValues", selectAllTextAndAltValues ) , ( "selectAllTextAndRealAltValues", selectAllTextAndRealAltValues )- , ( "addRefIcon", addRefIcon )- , ( "helloWorld", helloWorld )- , ( "helloWorld2", helloWorld2 )- , ( "imageTable", imageTable )- , ( "imageTable0", imageTable0 )- , ( "imageTable1", imageTable1 )- , ( "imageTable2", imageTable2 )- , ( "imageTable3", imageTable3 )- , ( "toAbsHRefs", toAbsHRefs )- , ( "toAbsRefs", toAbsRefs )- , ( "toAbsRefs1", toAbsRefs1 )+ , ( "addRefIcon", addRefIcon )+ , ( "helloWorld", helloWorld )+ , ( "helloWorld2", helloWorld2 )+ , ( "imageTable", imageTable )+ , ( "imageTable0", imageTable0 )+ , ( "imageTable1", imageTable1 )+ , ( "imageTable2", imageTable2 )+ , ( "imageTable3", imageTable3 )+ , ( "toAbsHRefs", toAbsHRefs )+ , ( "toAbsRefs", toAbsRefs )+ , ( "toAbsRefs1", toAbsRefs1 ) ] processRootElement :: String -> IOSArrow XmlTree XmlTree
examples/arrows/HelloWorld/HelloWorld.hs view
@@ -1,17 +1,17 @@ module Main where -import Text.XML.HXT.Arrow+import Text.XML.HXT.Core import System.Exit main :: IO() main = do- [rc] <- runX ( readDocument [ (a_trace, "1")- , (a_validate, v_0)+ [rc] <- runX ( readDocument [ withTrace 1+ , withValidate no ] "hello.xml" >>>- writeDocument [ (a_output_encoding, isoLatin1)+ writeDocument [ withOutputEncoding utf8 ] "-" >>> getErrStatus
examples/arrows/HelloWorld/Mini.hs view
@@ -1,13 +1,15 @@ module Main where -import Text.XML.HXT.Arrow+import Text.XML.HXT.Core main :: IO() main- = runX ( readDocument [ (a_validate, v_0) ] "hello.xml"+ = runX ( configSysVars [ withTrace 1 ] >>>- writeDocument [ ] "bye.xml"+ readDocument [ withValidate no ] "hello.xml"+ >>>+ writeDocument [ ] "bye.xml" ) >> return ()
− examples/arrows/RegexXMLSchema/Makefile
@@ -1,128 +0,0 @@-# $Id: Makefile,v 1.9 2006/11/11 15:36:03 hxml Exp $--HXT_HOME = ../../..-PKGFLAGS = -GHCFLAGS = -Wall -O2-GHC = ghc $(GHCFLAGS) $(PKGFLAGS)--DIST = $(HXT_HOME)/dist/examples/arrows-DIST_DIR = $(DIST)/RegexXMLSchema--CNT = 3--ropts = +RTS -s -RTS --prog = ./REtest-prog2 = ./Lines-prog3 = ./RElines-prog4 = ./Words-prog5 = ./REwords-prog0 = ./Copy--progs = $(prog) $(prog0) $(prog2) $(prog3) $(prog4) $(prog5)--all : $(progs)--$(prog) : $(prog).hs- $(GHC) --make -o $@ $<--local :- $(GHC) --make -o $(prog) -fglasgow-exts -ignore-package hxt -i../../../src $(prog).hs--$(prog2) : $(prog)- ln -f $(prog) $(prog2)--$(prog3) : $(prog)- ln -f $(prog) $(prog3)--$(prog4) : $(prog)- ln -f $(prog) $(prog4)--$(prog5) : $(prog)- ln -f $(prog) $(prog5)--$(prog0) : $(prog)- ln -f $(prog) $(prog0)--# generate and read documents containing a binary tree-# with 2^i leaf nodes containing the numbers 1 to 2^i-# for i up to at least 22 (8M XML elements) output works fine-# for i up to 19 (1M XML elements) input works without swapping-# with i=20 swapping starts, but the program it still terminates-# the size of the XML file for i=20 is about 36Mb-# these tests have run on a box with 1Gb memory--tests = 18--test : $(prog)- $(MAKE) genfiles tests="$(tests)"- $(MAKE) copy tests="$(tests)"- $(MAKE) lines tests="$(tests)"- $(MAKE) relines tests="$(tests)"- $(MAKE) words tests="$(tests)"- $(MAKE) rewords tests="$(tests)"--perftest : $(prog)- $(MAKE) test tests="2 3 10 11 12 13 14 15 16 17 18 19 20"--genfiles :- @for i in $(tests) ; \- do \- echo time $(prog) $(ropts) $$i ; \- time $(prog) $(ropts) $$i ; \- ls -l tree-*$$i.xml ; \- echo ; \- done--copy :- @for i in $(tests) ; \- do \- echo time $(prog0) $(ropts) $$i ; \- time $(prog0) $(ropts) $$i ; \- ls -l tree-*$$i.xml.copy ; \- echo ; \- done--lines :- @for i in $(tests) ; \- do \- echo time $(prog2) $(ropts) $$i ; \- time $(prog2) $(ropts) $$i ; \- ls -l tree-*$$i.xml.lines ; \- echo ; \- done--relines :- @for i in $(tests) ; \- do \- echo time $(prog3) $(ropts) $$i ; \- time $(prog3) $(ropts) $$i ; \- ls -l tree-*$$i.xml.relines ; \- echo ; \- done--words :- @for i in $(tests) ; \- do \- echo time $(prog4) $(ropts) $$i ; \- time $(prog4) $(ropts) $$i ; \- ls -l tree-*$$i.xml.words ; \- echo ; \- done--rewords :- @for i in $(tests) ; \- do \- echo time $(prog5) $$i ; \- time $(prog5) $(ropts) $$i ; \- ls -l tree-*$$i.xml.rewords ; \- echo ; \- done--dist :- [ -d $(DIST_DIR) ] || mkdir -p $(DIST_DIR)- cp Makefile REtest.hs $(DIST_DIR)--clean :- rm -f $(progs) *.o *.hi *.xml *.xml.*-
− examples/arrows/RegexXMLSchema/REtest.hs
@@ -1,170 +0,0 @@-{-# LANGUAGE BangPatterns#-}---- ------------------------------------------module Main(main)-where--import Text.XML.HXT.Arrow-import Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch--import Text.XML.HXT.DOM.Unicode- ( unicodeToXmlEntity- )--import Control.Monad.State.Strict hiding (when)--import Data.Maybe--import System.IO -- import the IO and commandline option stuff-import System.Environment---- ------------------------------------------main :: IO ()-main- = do- p <- getProgName- al <- getArgs- let i = if null al- then 4- else (read . head $ al)::Int- main' p i- where- main' p' = fromMaybe main1 . lookup (pn p') $ mpt- mpt = [ ("REtest", main1)- , ("Copy", main2 "copy" (:[]))- , ("Lines", main2 "lines" lines)- , ("RElines", main2 "relines" relines)- , ("Words", main2 "words" words)- , ("REwords", main2 "rewords" rewords)- ]---- -------------------------------------------- generate a document containing a binary tree of 2^i leafs (= 2^(i-1) XML elements)--main1 :: Int -> IO ()-main1 i- = runX (genDoc i (fn i))- >> return ()---- -------------------------------------------- read a document containing a binary tree of 2^i leafs--main2 :: String -> (String -> [String]) -> Int -> IO ()-main2 ext lines' i- = do- hPutStrLn stderr "start processing"- h <- openBinaryFile (fn i) ReadMode- c <- hGetContents h- let ls = lines' c- o <- openBinaryFile (fn i ++ "." ++ ext) WriteMode- mapM_ (hPutStrLn o) ls- hClose o- hClose h- hPutStrLn stderr "end processing"--relines :: String -> [String]-relines = tokenize "[^\n\r]*"--rewords :: String -> [String]-rewords = tokenize "[^ \t\n\r]+"---- ------------------------------------------pn :: String -> String-pn = reverse . takeWhile (/= '/') . reverse--fn :: Int -> String-fn = ("tree-" ++) . (++ ".xml") . reverse . take 4 . reverse . ((replicate 4 '0') ++ ) . show---- ------------------------------------------genDoc :: Int -> String -> IOSArrow b XmlTree-genDoc d out = constA (mkBTree d)- >>>- xpickleVal xpickle- >>>- indentDoc- >>>- putDoc out---- ------------------------------------------type Counter a = State Int a--incr :: Counter Int-incr = do- modify (+1)- get---- ------------------------------------------data BTree = Leaf Int- | Fork BTree BTree- deriving (Show)--instance XmlPickler BTree where- xpickle = xpAlt tag ps- where- tag (Leaf _ ) = 0- tag (Fork _ _ ) = 1- ps = [ xpWrap ( Leaf, \ (Leaf i) -> i)- ( xpElem "leaf" $ xpAttr "value" $ xpickle )-- , xpWrap ( uncurry Fork, \ (Fork l r) -> (l, r))- ( xpElem "fork" $ xpPair xpickle xpickle )- ]---- ------------------------------------------mkBTree :: Int -> BTree-mkBTree depth = evalState (mkT depth) 0--mkT :: Int -> Counter BTree-mkT 0 = do- i <- incr- return (Leaf i)-mkT n = do- l <- mkT (n-1)- r <- mkT (n-1)- return (Fork l r)---- -------------------------------------------- output is done with low level ops to write the--- document i a lazy manner--- adding an xml pi and encoding is done "by hand"--- latin1 decoding is the identity, so please generate the--- docs with latin1 encoding. Here ist done even with ASCCI--- every none ASCII char is represented by a char ref (&nnn;)--putDoc :: String -> IOStateArrow s XmlTree XmlTree-putDoc dst- = addXmlPi- >>>- addXmlPiEncoding isoLatin1- >>>- xshow getChildren- >>>- arr unicodeToXmlEntity- >>>- arrIO (\ s -> hPutDocument (\h -> hPutStrLn h s))- >>>- none- where- isStdout = null dst || dst == "-"-- hPutDocument :: (Handle -> IO()) -> IO()- hPutDocument action- | isStdout- = action stdout- | otherwise- = do- handle <- openBinaryFile dst WriteMode- action handle- hClose handle---- ----------------------------------------
examples/arrows/absurls/AbsURIs.hs view
@@ -9,9 +9,8 @@ Maintainer : uwe@fh-wedel.de Stability : experimental Portability: portable- Version : $Id: AbsURIs.hs,v 1.1 2005/05/12 16:41:38 hxml Exp $ -AbsURIs - Conversion references into absolute URIs in HTML pages+ AbsURIs - Conversion references into absolute URIs in HTML pages The commandline interface -}@@ -21,9 +20,9 @@ module Main where -import Text.XML.HXT.Arrow -- import all stuff for parsing, validating, and transforming XML+import Text.XML.HXT.Core -- import all stuff for parsing, validating, and transforming XML -import System.IO -- import the IO and commandline option stuff+import System.IO -- import the IO and commandline option stuff import System.Environment import System.Console.GetOpt import System.Exit@@ -38,16 +37,16 @@ main :: IO () main = do- argv <- getArgs -- get the commandline arguments- (al, src) <- cmdlineOpts argv -- and evaluate them, return a key-value list- [rc] <- runX (parser al src) -- run the parser arrow- exitProg (rc >= c_err) -- set return code and terminate+ argv <- getArgs -- get the commandline arguments+ (al, src) <- cmdlineOpts argv -- and evaluate them, return a key-value list+ [rc] <- runX (parser al src) -- run the parser arrow+ exitProg (rc >= c_err) -- set return code and terminate -- ------------------------------------------------------------ -exitProg :: Bool -> IO a-exitProg True = exitWith (ExitFailure (-1))-exitProg False = exitWith ExitSuccess+exitProg :: Bool -> IO a+exitProg True = exitWith (ExitFailure (-1))+exitProg False = exitWith ExitSuccess -- ------------------------------------------------------------ @@ -57,10 +56,12 @@ -- get wellformed document, validates document, propagates and check namespaces -- and controls output -parser :: Attributes -> String -> IOSArrow b Int-parser al src- = readDocument ([(a_parse_html, v_1)] ++ al) src+parser :: SysConfigList -> String -> IOSArrow b Int+parser config src+ = configSysVars config -- set all global config options >>>+ readDocument [withParseHTML yes] src -- use HTML parser+ >>> traceMsg 1 "start processing" >>> processDocument@@ -71,7 +72,7 @@ >>> traceTree >>>- writeDocument al "-" `whenNot` hasAttr "no-output"+ ( writeDocument [] $< getSysAttr "output-file" ) >>> getErrStatus @@ -80,51 +81,55 @@ -- the options definition part -- see doc for System.Console.GetOpt -progName :: String-progName = "AbsURIs"+progName :: String+progName = "AbsURIs" -options :: [OptDescr (String, String)]+options :: [OptDescr SysConfig] options = generalOptions ++- selectOptions [a_trace, a_proxy, a_use_curl, a_issue_warnings, a_do_not_issue_warnings, a_do_not_use_curl, a_options_curl, a_encoding] inputOptions+ inputOptions +++ [ Option "f" ["output-file"] (ReqArg (withSysAttr "output-file") "FILE")+ "output file for resulting document (default: stdout)"+ ]+ ++ outputOptions ++ showOptions -usage :: [String] -> IO a+usage :: [String] -> IO a usage errl | null errl- = do- hPutStrLn stdout use- exitProg False+ = do+ hPutStrLn stdout use+ exitProg False | otherwise- = do- hPutStrLn stderr (concat errl ++ "\n" ++ use)- exitProg True+ = do+ hPutStrLn stderr (concat errl ++ "\n" ++ use)+ exitProg True where header = progName ++ " - Convert all references in an HTML document into absolute URIs\n\n" ++ "Usage: " ++ progName ++ " [OPTION...] [URI or FILE]" use = usageInfo header options -cmdlineOpts :: [String] -> IO (Attributes, String)+cmdlineOpts :: [String] -> IO (SysConfigList, String) cmdlineOpts argv = case (getOpt Permute options argv) of- (ol,n,[])- -> do- sa <- src n- help (lookup a_help ol) sa- return (ol, sa)+ (scfg,n,[])+ -> do+ sa <- src n+ help (getConfigAttr a_help scfg) sa+ return (scfg, sa) (_,_,errs)- -> usage errs+ -> usage errs where- src [] = return []- src [uri] = return uri- src _ = usage ["only one input uri or file allowed\n"]+ src [] = return []+ src [uri] = return uri+ src _ = usage ["only one input uri or file allowed\n"] - help (Just _) _ = usage []- help Nothing [] = usage ["no input uri or file given\n"]- help Nothing _ = return ()+ help "1" _ = usage []+ help _ [] = usage ["no input uri or file given\n"]+ help _ _ = return () -- ------------------------------------------------------------
examples/arrows/absurls/ProcessDocument.hs view
@@ -9,11 +9,10 @@ Maintainer : uwe@fh-wedel.de Stability : experimental Portability: portable- Version : $Id: ProcessDocument.hs,v 1.2 2005/05/15 17:01:04 hxml Exp $ -AbsURIs - Conversion references into absolute URIs in HTML pages+ AbsURIs - Conversion references into absolute URIs in HTML pages -The REAL processing functions+ The REAL processing functions -} -- ------------------------------------------------------------@@ -22,7 +21,7 @@ ( processDocument ) where -import Text.XML.HXT.Arrow -- import all stuff for parsing, validating, and transforming XML+import Text.XML.HXT.Core -- import all stuff for parsing, validating, and transforming XML import Data.Maybe
examples/arrows/dtd2hxt/DTDtoHXT.hs view
@@ -4,22 +4,20 @@ -- -- Author : Uwe Schmidt ----- Version : $Id: DTDtoHXT.hs,v 1.3 2005/04/14 12:52:50 hxml Exp $--- -- this program may be used as example main program for the -- Haskell XML Toolbox module Main where -import Text.XML.HXT.Arrow -- import all stuff for parsing, validating, and transforming XML+import Text.XML.HXT.Core -- import all stuff for parsing, validating, and transforming XML+import Text.XML.HXT.Curl -import System.IO -- import the IO and commandline option stuff+import System.IO -- import the IO and commandline option stuff import System.Environment import System.Console.GetOpt import System.Exit -import Data.Maybe import Data.Char import Data.List @@ -31,43 +29,43 @@ main :: IO () main = do- argv <- getArgs -- get the commandline arguments- (al, src) <- cmdlineOpts argv -- and evaluate them, return a key-value list+ argv <- getArgs -- get the commandline arguments+ (al, src) <- cmdlineOpts argv -- and evaluate them, return a key-value list [rc] <- runX (dtd2hxt al src) exitProg (rc >= c_err) -- ------------------------------------------------------------ -exitProg :: Bool -> IO a-exitProg True = exitWith (ExitFailure (-1))-exitProg False = exitWith ExitSuccess+exitProg :: Bool -> IO a+exitProg True = exitWith (ExitFailure (-1))+exitProg False = exitWith ExitSuccess -- ------------------------------------------------------------ -- -- options -uppercaseInitials, namespaceAware, prefixUnderline :: String+uppercaseInitials, namespaceAware, prefixUnderline :: String -uppercaseInitials = "uppercase-initials"-namespaceAware = "namespace-aware"-prefixUnderline = "prefix-underline"+uppercaseInitials = "uppercase-initials"+namespaceAware = "namespace-aware"+prefixUnderline = "prefix-underline" -- name prefixes tagPrefix, attPrefix, nsPrefix, isPrefix, mkPrefix, hasPrefix, getPrefix , mkAttPrefix, mkSAttPrefix- , nsDefault :: String+ , nsDefault :: String -tagPrefix = "tag"-attPrefix = "attr"-nsPrefix = "ns"-isPrefix = "is"-mkPrefix = "e"-hasPrefix = "has"-getPrefix = "get"-mkAttPrefix = "a"-mkSAttPrefix = "sa"-nsDefault = "default"+tagPrefix = "tag"+attPrefix = "attr"+nsPrefix = "ns"+isPrefix = "is"+mkPrefix = "e"+hasPrefix = "has"+getPrefix = "get"+mkAttPrefix = "a"+mkSAttPrefix = "sa"+nsDefault = "default" -- ------------------------------------------------------------ @@ -78,10 +76,14 @@ -- (this would remove the DTD), -- and controls output -dtd2hxt :: Attributes -> String -> IOSArrow b Int-dtd2hxt al src- = readDocument ((a_canonicalize, v_0) : al) src+dtd2hxt :: SysConfigList -> String -> IOSArrow b Int+dtd2hxt config src+ = configSysVars config -- set all global config options >>>+ readDocument [withCanonicalize no+ ,withCurl []+ ] src+ >>> traceMsg 1 "start processing DTD" >>> processChildren (isDTD `guards` genHXT)@@ -92,195 +94,195 @@ >>> traceTree >>>- writeDocument ((a_output_xml, v_0) : al) (fromMaybe "" (lookup a_output_file al))+ ( writeDocument [withOutputPLAIN] $< getSysAttr "output-file" ) >>> getErrStatus where genHXT- = catA $ map (>>> mkText) $- [ getModuleName -- the module header- >>>- arr genModHead+ = catA $ map (>>> mkText) $+ [ getModuleName -- the module header+ >>>+ arr genModHead - , constA $ comm "namespace declarations"+ , constA $ comm "namespace declarations" - , getNSAttr -- namespace constants- >>> -- declared as "xmlns" or "xmlns:<ns>" attribute with #FIXED values- arr2 genNSCode+ , getNSAttr -- namespace constants+ >>> -- declared as "xmlns" or "xmlns:<ns>" attribute with #FIXED values+ arr2 genNSCode - , constA $ comm "element arrows"+ , constA $ comm "element arrows" - , getElems >>. sort -- element processing- >>>- arr genElemCode+ , getElems >>. sort -- element processing+ >>>+ arr genElemCode - , getAttrs >>. ( sort . nub ) -- attribute processing+ , getAttrs >>. ( sort . nub ) -- attribute processing >>>- arr genAttrCode+ arr genAttrCode - , getModuleName -- module footer+ , getModuleName -- module footer >>> arr genModFoot- ]+ ] -- auxiliary arrows -------------------------------------------------- - getModuleName :: (ArrowXml a, ArrowDTD a) => a XmlTree String+ getModuleName :: (ArrowXml a, ArrowDTD a) => a XmlTree String getModuleName- = isDTDDoctype- >>>- getDTDAttrValue a_name- >>>- arr moduleName+ = isDTDDoctype+ >>>+ getDTDAttrValue a_name+ >>>+ arr moduleName -- filter namespace attributes ---------------------------------------- - getNSAttr :: (ArrowXml a, ArrowDTD a) => a XmlTree (String, String)+ getNSAttr :: (ArrowXml a, ArrowDTD a) => a XmlTree (String, String) getNSAttr- = deep isDTDAttlist- >>>- ( ( getDTDAttrValue a_value >>> isA (\ s -> s == "xmlns" || "xmlns:" `isPrefixOf` s)- )- `guards`- ( ( getDTDAttrValue a_kind >>> isA (== k_fixed)- )- `guards`- ( ( getDTDAttrValue a_value >>> arr (drop 6) ) -- remove "xmlns:" prefix- &&&- getDTDAttrValue a_default- )- )- )+ = deep isDTDAttlist+ >>>+ ( ( getDTDAttrValue a_value >>> isA (\ s -> s == "xmlns" || "xmlns:" `isPrefixOf` s)+ )+ `guards`+ ( ( getDTDAttrValue a_kind >>> isA (== k_fixed)+ )+ `guards`+ ( ( getDTDAttrValue a_value >>> arr (drop 6) ) -- remove "xmlns:" prefix+ &&&+ getDTDAttrValue a_default+ )+ )+ ) - getElems :: (ArrowXml a, ArrowDTD a) => a XmlTree String+ getElems :: (ArrowXml a, ArrowDTD a) => a XmlTree String getElems- = deep isDTDElement- >>>- getDTDAttrValue a_name+ = deep isDTDElement+ >>>+ getDTDAttrValue a_name - getAttrs :: (ArrowXml a, ArrowDTD a) => a XmlTree String+ getAttrs :: (ArrowXml a, ArrowDTD a) => a XmlTree String getAttrs- = deep isDTDAttlist- >>>- getDTDAttrValue a_value+ = deep isDTDAttlist+ >>>+ getDTDAttrValue a_value -- code generation ------------------------------------------------------------ - genModHead :: String -> String+ genModHead :: String -> String genModHead rootElem- = code [ sepl- , "--"- , "-- don't edit this module"- , "-- generated with " ++ progName- , "-- simple access function for Haskell XML Toolbox"- , "-- generated from DTD of document: " ++ show src- , ""- , "module " ++ rootElem ++ " ( module " ++ rootElem ++ " )"- , "where"- , ""- , "import Text.XML.HXT.Arrow (XmlTree, ArrowXml, (>>>))"- , "import qualified Text.XML.HXT.Arrow as X (attr, eelem, getAttrValue, hasAttr, hasName, isElem, sattr)"- ]+ = code [ sepl+ , "--"+ , "-- don't edit this module"+ , "-- generated with " ++ progName+ , "-- simple access function for Haskell XML Toolbox"+ , "-- generated from DTD of document: " ++ show src+ , ""+ , "module " ++ rootElem ++ " ( module " ++ rootElem ++ " )"+ , "where"+ , ""+ , "import Text.XML.HXT.Core (XmlTree, ArrowXml, (>>>))"+ , "import qualified Text.XML.HXT.Core as X (attr, eelem, getAttrValue, hasAttr, hasName, isElem, sattr)"+ ] - genNSCode :: String -> String -> String+ genNSCode :: String -> String -> String genNSCode prefix ns- = code [ ns' ++ "\t:: String"- , ns' ++ "\t= " ++ show ns- ]- where- ns' = nsPrefix ++ nn (if null prefix then nsDefault else prefix)+ = code [ ns' ++ "\t:: String"+ , ns' ++ "\t= " ++ show ns+ ]+ where+ ns' = nsPrefix ++ nn (if null prefix then nsDefault else prefix) - genElemCode :: String -> String- genElemCode n- = code [ comm ("arrows for element " ++ show n)- , tagN ++ "\t:: String"- , tagN ++ "\t= " ++ show n- , ""- , isN ++ "\t:: ArrowXml a => a XmlTree XmlTree"- , isN ++ "\t= X.isElem >>> X.hasName " ++ tagN- , ""- , mkN ++ "\t:: ArrowXml a => a n XmlTree"- , mkN ++ "\t= X.eelem " ++ tagN- ]- where- tagN = tagPrefix ++ nn n- isN = isPrefix ++ nn n- mkN = mkPrefix ++ nn n+ genElemCode :: String -> String+ genElemCode n+ = code [ comm ("arrows for element " ++ show n)+ , tagN ++ "\t:: String"+ , tagN ++ "\t= " ++ show n+ , ""+ , isN ++ "\t:: ArrowXml a => a XmlTree XmlTree"+ , isN ++ "\t= X.isElem >>> X.hasName " ++ tagN+ , ""+ , mkN ++ "\t:: ArrowXml a => a n XmlTree"+ , mkN ++ "\t= X.eelem " ++ tagN+ ]+ where+ tagN = tagPrefix ++ nn n+ isN = isPrefix ++ nn n+ mkN = mkPrefix ++ nn n - genAttrCode :: String -> String- genAttrCode n- = code [ comm ("arrows for attribute " ++ show n)- , attN ++ "\t:: String"- , attN ++ "\t= " ++ show n- , ""- , hasN ++ "\t:: ArrowXml a => a XmlTree XmlTree"- , hasN ++ "\t= X.hasAttr " ++ attN- , ""- , getN ++ "\t:: ArrowXml a => a XmlTree String"- , getN ++ "\t= X.getAttrValue " ++ attN- , ""- , mkN ++ "\t:: ArrowXml a => a n XmlTree -> a n XmlTree"- , mkN ++ "\t= X.attr " ++ attN- , ""- , mksN ++ "\t:: ArrowXml a => String -> a n XmlTree"- , mksN ++ "\t= X.sattr " ++ attN- ]- where- attN = attPrefix ++ nn n- hasN = hasPrefix ++ nn n- getN = getPrefix ++ nn n ++ nn "value"- mkN = mkAttPrefix ++ nn n- mksN = mkSAttPrefix ++ nn n+ genAttrCode :: String -> String+ genAttrCode n+ = code [ comm ("arrows for attribute " ++ show n)+ , attN ++ "\t:: String"+ , attN ++ "\t= " ++ show n+ , ""+ , hasN ++ "\t:: ArrowXml a => a XmlTree XmlTree"+ , hasN ++ "\t= X.hasAttr " ++ attN+ , ""+ , getN ++ "\t:: ArrowXml a => a XmlTree String"+ , getN ++ "\t= X.getAttrValue " ++ attN+ , ""+ , mkN ++ "\t:: ArrowXml a => a n XmlTree -> a n XmlTree"+ , mkN ++ "\t= X.attr " ++ attN+ , ""+ , mksN ++ "\t:: ArrowXml a => String -> a n XmlTree"+ , mksN ++ "\t= X.sattr " ++ attN+ ]+ where+ attN = attPrefix ++ nn n+ hasN = hasPrefix ++ nn n+ getN = getPrefix ++ nn n ++ nn "value"+ mkN = mkAttPrefix ++ nn n+ mksN = mkSAttPrefix ++ nn n - genModFoot :: String -> String+ genModFoot :: String -> String genModFoot rootElem- = comm ( "end of module " ++ rootElem)+ = comm ( "end of module " ++ rootElem) -- string manipulation -------------------------------------------------- - code :: [String] -> String- code = concatMap (++ "\n")+ code :: [String] -> String+ code = concatMap (++ "\n") - comm :: String -> String- comm cm = code [ "", sepl, "--", "-- " ++ cm, ""]+ comm :: String -> String+ comm cm = code [ "", sepl, "--", "-- " ++ cm, ""] - sepl :: String- sepl = "-- ----------------------------------------"+ sepl :: String+ sepl = "-- ----------------------------------------" - moduleName :: String -> String+ moduleName :: String -> String moduleName rootElem- = modname . fromMaybe rootElem . lookup a_output_file $ al+ = modname . (\ x -> if null x then rootElem else x) . getConfigAttr "output_file" $ config modname- = (\ x -> toUpper (head x) : tail x)- . reverse- . (\ n -> if '.' `elem` n -- remove extension- then drop 1 . dropWhile (/= '.') $ n- else n- )- . takeWhile (/= '/') -- remove dir path- . reverse+ = (\ x -> toUpper (head x) : tail x)+ . reverse+ . (\ n -> if '.' `elem` n -- remove extension+ then drop 1 . dropWhile (/= '.') $ n+ else n+ )+ . takeWhile (/= '/') -- remove dir path+ . reverse - nn :: String -> String+ nn :: String -> String nn- = trInitial . concatMap nc -- normalize names+ = trInitial . concatMap nc -- normalize names - nc :: Char -> String+ nc :: Char -> String nc c- | c `elem` ['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9'] ++ "_" = [c]- | c == ':' || c == '-' = "_" - | otherwise = ("_" ++) . show . fromEnum $ c+ | c `elem` ['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9'] ++ "_" = [c]+ | c == ':' || c == '-' = "_" + | otherwise = ("_" ++) . show . fromEnum $ c - trInitial :: String -> String+ trInitial :: String -> String trInitial str- | null str = str- | underLn = '_' : str- | upperCs = toUpper (head str) : tail str- | otherwise = str+ | null str = str+ | underLn = '_' : str+ | upperCs = toUpper (head str) : tail str+ | otherwise = str - upperCs, underLn {-, nsAware -} :: Bool- upperCs = isJust . lookup uppercaseInitials $ al- underLn = isJust . lookup prefixUnderline $ al- {- nsAware = isJust . lookup namespaceAware $ al -}+ upperCs, underLn {-, nsAware -} :: Bool+ upperCs = (== "1") . getConfigAttr uppercaseInitials $ config+ underLn = (== "1") . getConfigAttr prefixUnderline $ config+ _nsAware = (== "1") . getConfigAttr namespaceAware $ config -- ------------------------------------------------------------ --@@ -288,64 +290,62 @@ -- -- see doc for System.Console.GetOpt -progName :: String-progName = "DTDtoHXT"+progName :: String+progName = "DTDtoHXT" -options :: [OptDescr (String, String)]+options :: [OptDescr SysConfig] options = selectOptions [ a_help- ] generalOptions+ ] generalOptions ++ selectOptions [ a_trace- , a_proxy- , a_use_curl- , a_options_curl- , a_encoding- , a_validate- , a_check_namespaces- ] inputOptions+ , a_proxy+ , a_encoding+ , a_validate+ , a_check_namespaces+ ] inputOptions ++- selectOptions [ a_output_file- ] outputOptions+ selectOptions [ "output-file"+ ] outputOptions ++- [ Option "u" [prefixUnderline] (NoArg (prefixUnderline, v_1)) "separate tag and attribute names with a '_'"- , Option "U" [uppercaseInitials] (NoArg (uppercaseInitials, v_1)) "transform the first char of tag and attribute names to uppercase"- -- , Option "N" [namespaceAware] (NoArg (namespaceAware, v_1)) "filter are namespace aware, if namespace attributes occur in the DTD"+ [ Option "u" [prefixUnderline] (NoArg $ withSysAttr prefixUnderline "1") "separate tag and attribute names with a '_'"+ , Option "U" [uppercaseInitials] (NoArg $ withSysAttr uppercaseInitials "1") "transform the first char of tag and attribute names to uppercase"+ , Option "N" [namespaceAware] (NoArg $ withSysAttr namespaceAware "1") "filter are namespace aware, if namespace attributes occur in the DTD" ] ++ showOptions -usage :: [String] -> IO a+usage :: [String] -> IO a usage errl | null errl- = do- hPutStrLn stdout use- exitProg False+ = do+ hPutStrLn stdout use+ exitProg False | otherwise- = do- hPutStrLn stderr (concat errl ++ "\n" ++ use)- exitProg True+ = do+ hPutStrLn stderr (concat errl ++ "\n" ++ use)+ exitProg True where header = "DTDtoHXml - Generation of access function for the Haskell XML Toolbox from a DTD\n" ++ "Usage: " ++ progName ++ " [OPTION...] [URI or FILE]" use = usageInfo header options -cmdlineOpts :: [String] -> IO (Attributes, String)+cmdlineOpts :: [String] -> IO (SysConfigList, String) cmdlineOpts argv = case (getOpt Permute options argv) of (ol,n,[] )- -> do- sa <- src n- help (lookup a_help ol)- return (ol, sa)+ -> do+ sa <- src n+ help (getConfigAttr a_help ol)+ return (ol, sa) (_,_,errs)- -> usage errs+ -> usage errs where- src [uri] = return uri- src [] = usage ["input file/uri missing"]- src _ = usage ["only one input url or file allowed\n"]+ src [uri] = return uri+ src [] = usage ["input file/uri missing"]+ src _ = usage ["only one input url or file allowed\n"] - help Nothing = return ()- help (Just _) = usage []+ help "1" = usage []+ help _ = return () -- ------------------------------------------------------------
examples/arrows/hparser/HXmlParser.hs view
@@ -10,7 +10,7 @@ Stability : experimental Portability: portable - HXmlParser - Validating XML Parser of the Haskell XML Toolbox+ HXmlParser - Minimal Validating XML Parser of the Haskell XML Toolbox, no HTTP supported XML well-formed checker and validator. @@ -28,15 +28,13 @@ module Main where -import Text.XML.HXT.Arrow -- import all stuff for parsing, validating, and transforming XML+import Text.XML.HXT.Core -- import all stuff for parsing, validating, and transforming XML -import System.IO -- import the IO and commandline option stuff+import System.IO -- import the IO and commandline option stuff import System.Environment import System.Console.GetOpt import System.Exit -import Data.Maybe- -- ------------------------------------------------------------ -- |@@ -45,16 +43,16 @@ main :: IO () main = do- argv <- getArgs -- get the commandline arguments- (al, src) <- cmdlineOpts argv -- and evaluate them, return a key-value list- [rc] <- runX (parser al src) -- run the parser arrow- exitProg (rc >= c_err) -- set return code and terminate+ argv <- getArgs -- get the commandline arguments+ (al, src) <- cmdlineOpts argv -- and evaluate them, return a key-value list+ [rc] <- runX (parser al src) -- run the parser arrow+ exitProg (rc >= c_err) -- set return code and terminate -- ------------------------------------------------------------ -exitProg :: Bool -> IO a-exitProg True = exitWith (ExitFailure (-1))-exitProg False = exitWith ExitSuccess+exitProg :: Bool -> IO a+exitProg True = exitWith (ExitFailure (-1))+exitProg False = exitWith ExitSuccess -- ------------------------------------------------------------ @@ -64,98 +62,109 @@ -- get wellformed document, validates document, propagates and check namespaces -- and controls output -parser :: Attributes -> String -> IOSArrow b Int-parser al src- = readDocument al src+parser :: SysConfigList -> String -> IOSArrow b Int+parser config src+ = configSysVars config -- set all global config options, the output file and the+ >>> -- other user options are stored as key-value pairs in the stystem state+ readDocument [] src -- no more special read options needed >>> ( ( traceMsg 1 "start processing document"- >>>- processDocument al- >>>- traceMsg 1 "document processing finished"- )- `when`- documentStatusOk+ >>>+ ( processDocument $< getSysAttr "action" ) -- ask for the action stored in the key-value list of user defined values + >>>+ traceMsg 1 "document processing finished"+ )+ `when`+ documentStatusOk ) >>> traceSource >>> traceTree >>>- writeDocument al (fromMaybe "-" . lookup a_output_file $ al) `whenNot` hasAttr "no-output"+ ( (writeDocument [] $< getSysAttr "output-file") -- ask for the output file stored in the system configuration+ `whenNot`+ ( getSysAttr "no-output" >>> isA (== "1") ) -- ask for the no-output attr value in the system key-value list+ ) >>> getErrStatus --- simple example of a processing arrow+-- simple example of a processing arrow, selected by a command line option -processDocument :: Attributes -> IOSArrow XmlTree XmlTree-processDocument al- | extractText- = traceMsg 1 "selecting plain text"- >>>- processChildren (deep isText)- | otherwise- = this- where- extractText = optionIsSet "show-text" $ al+processDocument :: String -> IOSArrow XmlTree XmlTree+processDocument "only-text"+ = traceMsg 1 "selecting plain text"+ >>>+ processChildren (deep isText) +processDocument "indent"+ = traceMsg 1 "indent document"+ >>>+ indentDoc++processDocument _action+ = traceMsg 1 "default action: do nothing"+ >>>+ this+ -- ------------------------------------------------------------ -- -- the options definition part -- see doc for System.Console.GetOpt -progName :: String-progName = "HXmlParser"+progName :: String+progName = "HXmlParser" -options :: [OptDescr (String, String)]+options :: [OptDescr SysConfig] options = generalOptions ++ inputOptions ++- relaxOptions- ++ outputOptions ++- [ Option "q" ["no-output"] (NoArg ("no-output", "1")) "no output of resulting document"- , Option "x" ["show-text"] (NoArg ("show-text", "1")) "output only the raw text, remove all markup"- ]- ++ showOptions+ +++ [ Option "f" ["output-file"] (ReqArg (withSysAttr "output-file") "FILE") "output file for resulting document (default: stdout)"+ , Option "q" ["no-output"] (NoArg $ withSysAttr "no-output" "1") "no output of resulting document"+ , Option "x" ["action"] (ReqArg (withSysAttr "action") "ACTION") "actions are: only-text, indent, no-op"+ ]+ -- the last 2 option values will be stored by withAttr in the system key-value list+ -- and can be read by getSysAttr key -usage :: [String] -> IO a+usage :: [String] -> IO a usage errl | null errl- = do- hPutStrLn stdout use- exitProg False+ = do+ hPutStrLn stdout use+ exitProg False | otherwise- = do- hPutStrLn stderr (concat errl ++ "\n" ++ use)- exitProg True+ = do+ hPutStrLn stderr (concat errl ++ "\n" ++ use)+ exitProg True where header = "HXmlParser - Validating XML Parser of the Haskell XML Toolbox with Arrow Interface\n" ++- "XML well-formed checker, DTD validator, Relax NG validator.\n\n" +++ "XML well-formed checker, DTD validator, HTML parser.\n\n" ++ "Usage: " ++ progName ++ " [OPTION...] [URI or FILE]" use = usageInfo header options -cmdlineOpts :: [String] -> IO (Attributes, String)+cmdlineOpts :: [String] -> IO (SysConfigList, String) cmdlineOpts argv = case (getOpt Permute options argv) of- (ol,n,[])- -> do- sa <- src n- help (lookup a_help ol) sa- return (ol, sa)+ (scfg,n,[])+ -> do+ sa <- src n+ help (getConfigAttr a_help scfg) sa+ return (scfg, sa) (_,_,errs)- -> usage errs+ -> usage errs where- src [] = return []- src [uri] = return uri- src _ = usage ["only one input uri or file allowed\n"]+ src [] = return []+ src [uri] = return uri+ src _ = usage ["only one input uri or file allowed\n"] - help (Just _) _ = usage []- help Nothing [] = usage ["no input uri or file given\n"]- help Nothing _ = return ()+ help "1" _ = usage []+ help _ [] = usage ["no input uri or file given\n"]+ help _ _ = return () -- ------------------------------------------------------------
examples/arrows/hparser/Makefile view
@@ -29,7 +29,7 @@ @echo "===> first see all command line options" $(prog) --help @echo- $(MAKE) test0 test1 test2 test3 test4 test5+ $(MAKE) test0 test1 test2 test3 test4 EX1 = ./example1.xml EXi = ./invalid.xml@@ -74,7 +74,7 @@ $(prog) --show-tree --output-encoding=ISO-8859-1 $(EX1) @echo @sleep 2 ; echo ; echo "===> once again, but without any markup" ; echo ; sleep 2- $(prog) --show-text --output-encoding=ISO-8859-1 $(EX1)+ $(prog) --action=only-text --output-encoding=ISO-8859-1 $(EX1) @echo test2 :@@ -84,14 +84,14 @@ @sleep 2 ; echo ; echo "===> parser will validate this document and try to indent the output" ; echo ; sleep 2 $(prog) --indent $(EX2) @sleep 2 ; echo ; echo "===> once again, but remove all markup" ; echo ; sleep 2- $(prog) --show-text --remove-whitespace $(EX2)+ $(prog) --action=only-text --remove-whitespace $(EX2) @sleep 2 ; echo ; echo "===> once again with hdom tree output" ; echo ; sleep 2 $(prog) --show-tree --remove-whitespace $(EX2) test3 : @echo "===> namespace processing examples" ; echo ; sleep 2 @echo "===> namespace propagation test" ; echo ; sleep 2- $(prog) --verbose --check-namespaces --indent --output-encoding=ISO-8859-1 $(EX3)+ $(prog) --verbose --check-namespaces --indent --output-encoding=UTF-8 $(EX3) @echo @echo ; sleep 2 ; echo "===> namespace propagation test: tree output with attached namespaces" ; echo ; sleep 2 $(prog) --verbose --check-namespaces --remove-whitespace --show-tree --output-encoding=ISO-8859-1 $(EX3)@@ -107,51 +107,12 @@ cat $(EX4) @sleep 2 ; echo ; echo "===> parser accepts this document and tries to build a document tree" ; echo ; sleep 2 $(prog) --indent --preserve-comment --parse-html $(EX4)- @sleep 2 ; echo ; echo "===> same with lazy parser with tagsoup" ; echo ; sleep 2- $(prog) -H -T -r --indent $(EX4)- @echo @echo "===> the source of another lousy html document containing empty elements" ; echo ; sleep 2 cat $(EX4a) @sleep 2 ; echo ; echo "===> parser accepts this document and tries to format this as a HTML document without any dangarous empty elements" ; echo ; sleep 2 $(prog) --indent --preserve-comment --parse-html --output-html --no-empty-elements $(EX4a) @echo --test5 :- @echo "===> Validate a valid xml file with respect to a valid Relax NG schema" ; echo ; sleep 1- @echo "the XML document ./valid1.xml"- @cat ./valid1.xml- @echo "the Relax NG schema ./valid1.rng"- @cat ./valid1.rng- @echo- $(prog) --relax-schema ./valid1.rng ./valid1.xml- @echo- @echo "===> Validate an invalid xml file with respect to a valid Relax NG schema" ; echo ; sleep 1- @echo "the invalid XML document ./invalid1.xml"- @cat ./valid1.xml- $(prog) --relax-schema ./valid1.rng ./invalid1.xml || true- @echo- @echo "===> Incorrect Relax NG schema" ; echo ; sleep 1- $(prog) --relax-schema ./invalid2.rng ./valid1.xml || true- @echo- @echo "===> Incorrect Relax NG schema with two errors" ; echo ; sleep 1- $(prog) --relax-schema ./invalid3.rng ./valid1.xml || true- @echo--test6 :- @echo "===> tagsoup parsing examples" ; echo ; sleep 2- @echo "===> lousy HTML document" ; echo ; sleep 2- $(prog) --tagsoup --parse-html lousy.html- @echo "===> www.w3c.org homepage (valid XHTML)" ; echo ; sleep 2- $(prog) --tagsoup http://www.w3c.org/- @echo "===> same again with removed whitespace and tree output" ; echo ; sleep 2- $(prog) --tagsoup --remove-whitespace --show-tree http://www.w3c.org/- @echo "===> same procedure with www.haskell.org homepage (rather valid HTML)" ; echo ; sleep 2- $(prog) --tagsoup --parse-html http://www.haskell.org/- @echo "===> same again with removed whitespace and tree output" ; echo ; sleep 2- $(prog) --tagsoup --parse-html --remove-whitespace --show-tree http://www.haskell.org/- @echo- dist : [ -d $(DIST_DIR) ] || mkdir -p $(DIST_DIR) cp $(EX) Makefile $(prog).hs $(DIST_DIR)@@ -159,4 +120,4 @@ clean : rm -f $(prog) *.o *.hi -.PHONY : all test test0 test1 test2 test3 test4 test5 test6 dist clean prof local force+.PHONY : all test test0 test1 test2 test3 test4 dist clean prof local force
− examples/arrows/hrelaxng/.ghci
@@ -1,3 +0,0 @@-:set -i../../../src-:set -Wall -fglasgow-exts-:load HRelaxNG
− examples/arrows/hrelaxng/HRelaxNG.hs
@@ -1,170 +0,0 @@--- |--- HRelaxNG - Relax NG Validator of the Haskell XML Toolbox.--- RELAX NG is a simpler schema language for XML.------ Author : Torben Kuseler------ Version : $Id: HRelaxNG.hs,v 1.2 2005/09/30 14:41:44 hxml Exp $------ This program may be used as example main program for the--- Relax NG Validator.-----module Main-where--import System.IO-import System.Environment-import System.Console.GetOpt-import System.Exit--import Text.XML.HXT.Arrow -import Text.XML.HXT.RelaxNG---- ---------------------------------------------------------------main :: IO ()-main- = do- argv <- getArgs -- get the commandline arguments- (al, xml, schema) <- cmdlineOpts argv -- and evaluate them, return a key-value list- [rc] <- runX (relax al xml schema) -- run the Relax NG validator - exitProg (rc >= c_err) -- set return code and terminate--{--relax :: Attributes -> String -> String -> IOSArrow b Int-relax al xml schema- = readDocument al schema- >>>- createSimpleForm- >>>- ( getErrors -- compute errors in schema- `orElse`- validateXMLDoc [] xml -- compute errors in document- `orElse`- root [] [txt "valid"] -- or document is valid- )- >>>- writeDocument [(a_show_tree, "1")] "-"- >>>- getErrStatus--}--relax :: Attributes -> String -> String -> IOSArrow b Int-relax al xml schema- = readDocument ( [ (a_check_namespaces, v_1)- , (a_validate, v_0)- ] ++ al- ) xml- >>>- traceState- >>>- validateDocumentWithRelaxSchema al schema- >>>- traceState- >>>- writeDocument al "-"- >>>- getErrStatus---exitProg :: Bool -> IO a-exitProg True = exitWith (ExitFailure (-1))-exitProg False = exitWith ExitSuccess------ ------------------------------------------------------------------ the options definition part--- see doc for System.Console.GetOpt--progName :: String-progName = "HRelaxNGValidator"--options :: [OptDescr (String, String)]-options- = generalOptions- ++- inputOptions- ++- outputOptions- ++- relaxOptions--usage :: [String] -> IO a-usage errl- | null errl- = do- hPutStrLn stdout use- exitProg False- | otherwise- = do- hPutStrLn stderr (concat errl ++ "\n" ++ use)- exitProg True- where- header = "HRelaxNGValidator - Relax NG schema validator of the " ++- "Haskell XML Toolbox with Arrow Interface\n\n" ++- "Usage: " ++ progName ++ " [OPTION...] (XML file URI/FILE) (Relax NG Schema URI/FILE)"- use = usageInfo header options--cmdlineOpts :: [String] -> IO (Attributes, String, String)-cmdlineOpts argv- = case (getOpt Permute options argv) of- (ol,n,[])- -> do- (xml, schema) <- src n- help (lookup a_help ol)- return (ol, xml, schema)- (_,_,errs)- -> usage errs- where- src [xml, schema] = return (xml, schema)- src [] = usage ["XML file and Relax NG schema input file/url missing"]- src [_] = usage ["Relax NG schema input file/url missing"]- src _ = usage ["too many arguments"]-- help (Just _) = usage []- help Nothing = return ()----- --------------------------------------------------------------- test environment----{--xmlFile :: String-xmlFile = "testCases/213/1.v.xml"--schema :: [String]-schema = ["testCases/213/c.rng"]--testValidator :: Attributes -> String -> String -> IOSArrow b Int-testValidator al src xmlFile- = readDocument al src- >>> propagateNamespaces- >>> simplificationStep1- >>> simplificationStep2 [] []- >>> simplificationStep3- >>> simplificationStep4- >>> simplificationStep5- >>> simplificationStep6- >>> simplificationStep7- >>> simplificationStep8- >>> cleanUp- >>> resetStates--- >>> perform (getErrors >>> writeDocument [(a_show_tree, "1")] "-")--- >>> perform (fromLA xmlTreeToPatternString >>> arrIO (\s -> hPutStrLn stdout (s ++ "\n\n")))--- >>> perform (fromLA xmlTreeToPatternFormatedString >>> arrIO (\s -> hPutStrLn stdout (s ++ "\n\n")))--- >>> perform (fromLA xmlTreeToPatternStringTree >>> arrIO (hPutStrLn stdout))- >>>- ( getErrors- `orElse`- (validateXMLDoc [] xmlFile)- `orElse`- (root [] [(constA $ mkXTextTree "valid")])- )--- >>> writeDocument [(a_show_tree, "1")] "-"--- >>> writeDocument [(a_show_haskell, "1")] "-" - >>> getErrStatus--}
− examples/arrows/hrelaxng/Makefile
@@ -1,77 +0,0 @@-# $Id: Makefile,v 1.2 2005/09/30 14:41:44 hxml Exp $--HXT_HOME = ../../..-PKGFLAGS = -GHCFLAGS = -Wall -O2-GHC = ghc $(GHCFLAGS) $(PKGFLAGS)--DIST = $(HXT_HOME)/dist/examples/arrows-DIST_DIR = $(DIST)/hrelaxng--prog = ./HRelaxNG--all : $(prog)--prof :- ghc --make -o $(prog) -Wall -prof -auto-all -O -fglasgow-exts -ignore-package hxt -ignore-package HTTP -i../../../src $(prog).hs--local :- ghc --make -o $(prog) $(GHCFLAGS) -fglasgow-exts -ignore-package hxt -i../../../src $(prog).hs--$(prog) : $(prog).hs- $(GHC) --make -o $@ $<--force :- $(GHC) --make -o $(prog) $(prog).hs--test : $(prog)- @echo "===> Relax NG examples" ; echo ; sleep 1- @$(MAKE) example1 example1a example2 example3 example5--example1 :- @echo "===> Validate a valid Relax NG schema with respect to a valid xml file" ; echo ; sleep 1- $(prog) ./valid1.xml ./valid1.rng- @echo--example1a :- @echo "a valid document"- $(prog) ./valid2.xml ./valid2.rng || true- @echo--example1b :- @echo "===> 1. invalid document\n"- $(prog) ./inv2.xml ./valid2.rng || true- @echo "\n===> 2. invalid document\n"- $(prog) ./inv3.xml ./valid2.rng || true- @echo--example2 :- @echo "===> Validate a valid Relax NG schema with respect to a invalid xml file" ; echo ; sleep 1- $(prog) ./invalid1.xml ./valid1.rng || true- @echo--example3 :- @echo "===> Incorrect Relax NG schema" ; echo ; sleep 1- $(prog) ./valid1.xml ./invalid2.rng || true- @echo--example4 :- @echo "===> Same example with \"--output-pattern-transformations\" option " ; echo ; sleep 1- $(prog) --output-pattern-transformations ./valid1.xml ./invalid2.rng || true- @echo--example5 :- @echo "===> Incorrect Relax NG schema with two errors" ; echo ; sleep 1- $(prog) ./valid1.xml ./invalid3.rng || true- @echo--EX = $(wildcard *valid*.xml *valid*.rng)--dist :- [ -d $(DIST_DIR) ] || mkdir -p $(DIST_DIR)- cp $(EX) Makefile $(prog).hs $(DIST_DIR)--clean :- rm -f $(prog) *.o *.hi--# eof ------------------------------------------------------------
− examples/arrows/hrelaxng/invalid1.xml
@@ -1,1 +0,0 @@-<bar/>
− examples/arrows/hrelaxng/invalid2.rng
@@ -1,13 +0,0 @@-<grammar xmlns:html="http://www.w3.org/TR/REC-html40" - xmlns="http://relaxng.org/ns/structure/1.0" >- <start>- <element name="foo">- <zeroOrMore>- <group>- <attribute name="bar"/>- <attribute name="baz"/>- </group>- </zeroOrMore>- </element>- </start>-</grammar>
− examples/arrows/hrelaxng/invalid3.rng
@@ -1,19 +0,0 @@-<grammar xmlns:html="http://www.w3.org/TR/REC-html40" - xmlns="http://relaxng.org/ns/structure/1.0" >- <start>- <element name="foo">- <zeroOrMore>- <group>- <attribute name="bar"/>- <attribute name="baz"/>- </group>- </zeroOrMore>- </element>- <element name="bar">- <group>- <data type="token"/>- <data type="token"/>- </group>- </element>- </start>-</grammar>
− examples/arrows/hrelaxng/valid1.rng
@@ -1,7 +0,0 @@-<grammar xmlns="http://relaxng.org/ns/structure/1.0">- <start>- <element name="foo">- <empty/>- </element>- </start>-</grammar>
− examples/arrows/hrelaxng/valid1.xml
@@ -1,1 +0,0 @@-<foo/>
− examples/arrows/hrelaxng/valid2.rng
@@ -1,27 +0,0 @@-<grammar- xmlns="http://relaxng.org/ns/structure/1.0"- datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">- <start>- <ref name="foo"/>- </start>- - <define name="foo">- <element name="foo">-- <attribute name="string2-4">- <data type="string">- <param name="minLength">2</param>- <param name="maxLength">4</param>- </data>- </attribute>-- <attribute name="id">- <data type="ID">- <param name="length">4</param>- </data>- </attribute>- - </element>- </define>--</grammar>
− examples/arrows/hrelaxng/valid2.xml
@@ -1,1 +0,0 @@-<foo string2-4="xxx" id="iooo"/>
examples/arrows/performance/GenDoc.hs view
@@ -5,9 +5,10 @@ module Main where -import Text.XML.HXT.Arrow+import Text.XML.HXT.Core+import Text.XML.HXT.TagSoup -import Text.XML.HXT.DOM.Unicode+import Data.String.Unicode ( unicodeToXmlEntity ) @@ -154,13 +155,13 @@ readDoc :: String -> IOSArrow b XmlTree readDoc src- = readDocument [ (a_tagsoup, v_1)- , (a_parse_xml, v_1)- , (a_remove_whitespace, v_1)- , (a_encoding, isoLatin1)- , (a_issue_warnings, v_0)- , (a_trace, v_1)- , (a_strict_input, v_0)+ = readDocument [ withTagSoup+ , withParseHTML no+ , withRemoveWS yes+ , withInputEncoding isoLatin1+ , withWarnings no+ , withTrace 1+ , withStrictInput no ] src >>> processChildren (isElem `guards` this)
examples/arrows/pickle/PickleTest.hs view
@@ -5,7 +5,7 @@ import System.Exit import Test.HUnit -import Text.XML.HXT.Arrow+import Text.XML.HXT.Core -- ------------------------------------------------------------ --@@ -232,7 +232,7 @@ >>> writeDocumentToString [] -- XmlTree => String >>>- readFromString [(a_validate, v_0)] -- String => XmlTree+ readFromString [ withValidate no ] -- String => XmlTree >>> arrL (maybeToList . unpickleDoc xpProgram) -- XmlTree => Program )@@ -245,11 +245,11 @@ >>> arr (pickleDoc xpProgram) -- Program => XmlTree >>>- writeDocument [ (a_indent, v_1) -- XmlTree => formated external XML document+ writeDocument [ withIndent yes -- XmlTree => formated external XML document ] "pickle.xml" >>>- readDocument [ (a_remove_whitespace, v_1) -- formated external XML document => XmlTree- , (a_validate, v_0)+ readDocument [ withRemoveWS yes -- formated external XML document => XmlTree+ , withValidate no ] "pickle.xml" >>> arrL (maybeToList . unpickleDoc xpProgram) -- XmlTree => Program@@ -263,12 +263,12 @@ ( constA p -- take the Program value >>> xpickleDocument xpProgram- [ (a_indent, v_1) -- Program => formated external XML document+ [ withIndent yes -- Program => formated external XML document ] "pickle.xml" >>> xunpickleDocument xpProgram- [ (a_remove_whitespace, v_1) -- formated external XML document => Program- , (a_validate, v_0)+ [ withRemoveWS yes -- formated external XML document => Program+ , withValidate no ] "pickle.xml" ) res7 :: IO [Program] -- the most important case@@ -279,13 +279,13 @@ ( constA p -- take the Program value >>> xpickleDocument xpProgram- [ (a_indent, v_1) -- Program => formated external XML document- , (a_addDTD, v_1)+ [ withIndent yes -- Program => formated external XML document+ , withSysAttr a_addDTD v_1 -- with inline DTD ] "pickle.xml" >>> xunpickleDocument xpProgram- [ (a_remove_whitespace, v_1) -- formated external XML document => Program- , (a_validate, v_1)+ [ withRemoveWS yes -- formated external XML document => Program+ , withValidate yes ] "pickle.xml" )
hxt.cabal view
@@ -1,7 +1,7 @@ -- arch-tag: Haskell XML Toolbox main description file Name: hxt-Version: 8.5.4-Synopsis: A collection of tools for processing XML with Haskell. +Version: 9.0.0+Synopsis: A collection of tools for processing XML with Haskell. Description: The Haskell XML Toolbox bases on the ideas of HaXml and HXML, but introduces a more general approach for processing XML with Haskell. The Haskell XML Toolbox uses a generic data model for representing XML documents,@@ -10,8 +10,11 @@ an XPath expression evaluator, an XSLT library, a RelaxNG schema validator and funtions for serialization and deserialization of user defined data. The library makes extensive use of the arrow approach for processing XML.- Since version 8.5 XPath and XSLT have been moved to separate packages hxt-xpath and hxt-xslt,- serialisation is in package hxt-binary+ Since version 9 the toolbox is partitioned into various (sub-)packages.+ This package contains the core functionality,+ hxt-curl, hxt-tagsoup, hxt-relaxng, hxt-xpath, hxt-xslt, hxt-regex-xmlschema contain the extensions.+ hxt-unicode contains encoding and decoding functions,+ hxt-charproperties char properties for unicode and XML. License: OtherLicense License-file: LICENSE Author: Uwe Schmidt, Martin Schmidt, Torben Kuseler@@ -56,25 +59,14 @@ examples/arrows/hparser/namespace1.xml examples/arrows/hparser/valid1.rng examples/arrows/hparser/valid1.xml- examples/arrows/hrelaxng/.ghci- examples/arrows/hrelaxng/HRelaxNG.hs- examples/arrows/hrelaxng/invalid1.xml- examples/arrows/hrelaxng/invalid2.rng- examples/arrows/hrelaxng/invalid3.rng- examples/arrows/hrelaxng/Makefile- examples/arrows/hrelaxng/valid1.rng- examples/arrows/hrelaxng/valid1.xml- examples/arrows/hrelaxng/valid2.rng- examples/arrows/hrelaxng/valid2.xml examples/arrows/performance/GenDoc.hs examples/arrows/performance/Makefile examples/arrows/pickle/Makefile examples/arrows/pickle/PickleTest.hs- examples/arrows/RegexXMLSchema/Makefile- examples/arrows/RegexXMLSchema/REtest.hs library exposed-modules:+ Control.Arrow.ArrowExc, Control.Arrow.ArrowIO, Control.Arrow.ArrowIf, Control.Arrow.ArrowList,@@ -88,10 +80,10 @@ Control.Arrow.StateListArrow, Data.AssocList, Data.Atom,- Data.Char.UTF8,+ Data.Function.Selector, Data.Tree.Class, Data.Tree.NTree.TypeDefs,- Text.XML.HXT.Arrow,+ Text.XML.HXT.Arrow.Binary, Text.XML.HXT.Arrow.DTDProcessing, Text.XML.HXT.Arrow.DocumentInput, Text.XML.HXT.Arrow.DocumentOutput,@@ -107,22 +99,27 @@ Text.XML.HXT.Arrow.ReadDocument, Text.XML.HXT.Arrow.WriteDocument, Text.XML.HXT.Arrow.XmlArrow,- Text.XML.HXT.Arrow.XmlIOStateArrow,+ Text.XML.HXT.Arrow.XmlOptions, Text.XML.HXT.Arrow.XmlRegex,+ Text.XML.HXT.Arrow.XmlState,+ Text.XML.HXT.Arrow.XmlState.ErrorHandling,+ Text.XML.HXT.Arrow.XmlState.MimeTypeTable,+ Text.XML.HXT.Arrow.XmlState.RunIOStateArrow,+ Text.XML.HXT.Arrow.XmlState.TraceHandling,+ Text.XML.HXT.Arrow.XmlState.TypeDefs,+ Text.XML.HXT.Arrow.XmlState.URIHandling,+ Text.XML.HXT.Arrow.XmlState.SystemConfig,+ Text.XML.HXT.Core, Text.XML.HXT.DOM.FormatXmlTree, Text.XML.HXT.DOM.Interface,- Text.XML.HXT.DOM.IsoLatinTables, Text.XML.HXT.DOM.MimeTypeDefaults, Text.XML.HXT.DOM.MimeTypes, Text.XML.HXT.DOM.QualifiedName, Text.XML.HXT.DOM.ShowXml, Text.XML.HXT.DOM.TypeDefs,- Text.XML.HXT.DOM.UTF8Decoding,- Text.XML.HXT.DOM.Unicode, Text.XML.HXT.DOM.Util, Text.XML.HXT.DOM.XmlKeywords, Text.XML.HXT.DOM.XmlNode,- Text.XML.HXT.DOM.XmlOptions, Text.XML.HXT.DTDValidation.AttributeValueValidation, Text.XML.HXT.DTDValidation.DTDValidation, Text.XML.HXT.DTDValidation.DocTransformation,@@ -133,10 +130,8 @@ Text.XML.HXT.DTDValidation.Validation, Text.XML.HXT.DTDValidation.XmlRE, Text.XML.HXT.IO.GetFILE,- Text.XML.HXT.IO.GetHTTPLibCurl, Text.XML.HXT.Parser.HtmlParsec, Text.XML.HXT.Parser.ProtocolHandlerUtil,- Text.XML.HXT.Parser.TagSoup, Text.XML.HXT.Parser.XhtmlEntities, Text.XML.HXT.Parser.XmlCharParser, Text.XML.HXT.Parser.XmlDTDParser,@@ -144,27 +139,7 @@ Text.XML.HXT.Parser.XmlEntities, Text.XML.HXT.Parser.XmlParsec, Text.XML.HXT.Parser.XmlTokenParser,- Text.XML.HXT.RelaxNG,- Text.XML.HXT.RelaxNG.BasicArrows,- Text.XML.HXT.RelaxNG.CreatePattern,- Text.XML.HXT.RelaxNG.DataTypeLibMysql,- Text.XML.HXT.RelaxNG.DataTypeLibUtils,- Text.XML.HXT.RelaxNG.DataTypeLibraries,- Text.XML.HXT.RelaxNG.DataTypes,- Text.XML.HXT.RelaxNG.PatternFunctions,- Text.XML.HXT.RelaxNG.PatternToString,- Text.XML.HXT.RelaxNG.Schema,- Text.XML.HXT.RelaxNG.SchemaGrammar,- Text.XML.HXT.RelaxNG.Simplification,- Text.XML.HXT.RelaxNG.Unicode.Blocks,- Text.XML.HXT.RelaxNG.Unicode.CharProps,- Text.XML.HXT.RelaxNG.Utils,- Text.XML.HXT.RelaxNG.Validation,- Text.XML.HXT.RelaxNG.Validator,- Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C,- Text.XML.HXT.RelaxNG.XmlSchema.Regex,- Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch,- Text.XML.HXT.RelaxNG.XmlSchema.RegexParser,+ Text.XML.HXT.XMLSchema.DataTypeLibW3CNames, Text.XML.HXT.Version hs-source-dirs: src@@ -183,5 +158,7 @@ network >= 2.1 && < 3, deepseq >= 1.1 && < 2, bytestring >= 0.9 && < 1,- tagsoup >= 0.10 && < 0.11,- curl >= 1.3 && < 2+ binary >= 0.5 && < 1,+ hxt-charproperties >= 9 && < 10,+ hxt-unicode >= 9 && < 10,+ hxt-regex-xmlschema >= 9 && < 10
+ src/Control/Arrow/ArrowExc.hs view
@@ -0,0 +1,38 @@+-- ------------------------------------------------------------++{- |+ Module : Control.Arrow.ArrowExc+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe\@fh-wedel.de)+ Stability : experimental+ Portability: not portable++ The exception arrow class++-}++-- ------------------------------------------------------------++module Control.Arrow.ArrowExc+ ( ArrowExc(..)+ )+where++import Control.Arrow+import Control.Arrow.ArrowIO++import Control.Exception ( SomeException+ )++class (Arrow a, ArrowChoice a, ArrowZero a, ArrowIO a) => ArrowExc a where+ tryA :: a b c -> a b (Either SomeException c)++ catchA :: a b c -> a SomeException c -> a b c+ catchA f h = tryA f+ >>>+ ( h ||| returnA )+++-- ------------------------------------------------------------
src/Control/Arrow/ArrowIO.hs view
@@ -8,9 +8,8 @@ Maintainer : Uwe Schmidt (uwe\@fh-wedel.de) Stability : experimental Portability: portable- Version : $Id: ArrowIO.hs,v 1.6 2005/09/02 17:09:39 hxml Exp $ -Lifting of IO actions to arrows+ Lifting of IO actions to arrows -}
src/Control/Arrow/ArrowIf.hs view
@@ -8,14 +8,12 @@ Maintainer : Uwe Schmidt (uwe\@fh-wedel.de) Stability : experimental Portability: portable- Version : $Id: ArrowIf.hs,v 1.8 2006/05/04 14:17:53 hxml Exp $ -Conditionals for List Arrows--This module defines conditional combinators for list arrows.+ Conditionals for List Arrows -The empty list as result represents False, none empty lists True.+ This module defines conditional combinators for list arrows. + The empty list as result represents False, none empty lists True. -} -- ------------------------------------------------------------
src/Control/Arrow/ArrowList.hs view
@@ -8,17 +8,16 @@ Maintainer : Uwe Schmidt (uwe\@fh-wedel.de) Stability : experimental Portability: portable- Version : $Id: ArrowList.hs,v 1.11 2006/06/01 12:59:04 hxml Exp $ -The List Arrow Class+ The list arrow class -This module defines the interface for list arrows.+ This module defines the interface for list arrows. -A list arrow is a function, that gives a list of results-for a given argument. A single element result represents a normal function.-An empty list oven indicates, the function is undefined for the given argument.-The empty list may also represent False, none empty lists True.-A list with more than one element gives all results for a nondeterministic function.+ A list arrow is a function, that gives a list of results+ for a given argument. A single element result represents a normal function.+ An empty list oven indicates, the function is undefined for the given argument.+ The empty list may also represent False, none empty lists True.+ A list with more than one element gives all results for a nondeterministic function. -}
src/Control/Arrow/ArrowState.hs view
@@ -9,7 +9,7 @@ Maintainer : Uwe Schmidt (uwe\@fh-wedel.de) Stability : experimental- Portability: multy parameter classes and functional depenedencies required+ Portability: multi parameter classes and functional depenedencies required Arrows for managing an explicit state
src/Control/Arrow/ArrowTree.hs view
@@ -2,19 +2,17 @@ {- | Module : Control.Arrow.ArrowTree- Copyright : Copyright (C) 2005 Uwe Schmidt+ Copyright : Copyright (C) 2010 Uwe Schmidt License : MIT Maintainer : Uwe Schmidt (uwe\@fh-wedel.de)- Stability : experimental+ Stability : stable Portability: portable- Version : $Id: ArrowTree.hs,v 1.12 2006/11/30 16:05:24 hxml Exp $ -List arrows for tree processing.--Trees that implement the "Data.Tree.Class" interface, can be processed-with these arrows.+ List arrows for tree processing. + Trees that implement the "Data.Tree.Class" interface, can be processed+ with these arrows. -} -- ------------------------------------------------------------@@ -181,7 +179,7 @@ -- The search is performed top down. All nodes of the tree are searched, even within the -- subtrees of trees for which the predicate holds. --- -- example: @ multy isHtmlTable @ selects all table elements, even nested ones.+ -- example: @ multi isHtmlTable @ selects all table elements, even nested ones. multi :: Tree t => a (t b) c -> a (t b) c multi f = f -- combine result for root
src/Control/Arrow/IOListArrow.hs view
@@ -23,14 +23,18 @@ import Control.Category -import Control.Arrow-import Control.Arrow.ArrowIf-import Control.Arrow.ArrowList-import Control.Arrow.ArrowNF-import Control.Arrow.ArrowTree-import Control.Arrow.ArrowIO+import Control.Arrow+import Control.Arrow.ArrowExc+import Control.Arrow.ArrowIf+import Control.Arrow.ArrowIO+import Control.Arrow.ArrowList+import Control.Arrow.ArrowNF+import Control.Arrow.ArrowTree -import Control.DeepSeq+import Control.DeepSeq+import Control.Exception ( SomeException+ , try+ ) -- ------------------------------------------------------------ @@ -116,6 +120,16 @@ arrIO cmd = IOLA $ \x -> do res <- cmd x return [res]++instance ArrowExc IOLA where+ tryA f = IOLA $ \ x -> do+ res <- try' $ runIOLA f x+ return $ case res of+ Left er -> [Left er]+ Right ys -> [Right x' | x' <- ys]+ where+ try' :: IO a -> IO (Either SomeException a)+ try' = try instance ArrowIOIf IOLA where isIOA p = IOLA $ \x -> do
src/Control/Arrow/IOStateListArrow.hs view
@@ -24,19 +24,23 @@ ) where -import Prelude hiding (id, (.))+import Prelude hiding (id, (.)) -import Control.Category+import Control.Category -import Control.Arrow-import Control.Arrow.ArrowIf-import Control.Arrow.ArrowIO-import Control.Arrow.ArrowList-import Control.Arrow.ArrowNF-import Control.Arrow.ArrowTree-import Control.Arrow.ArrowState+import Control.Arrow+import Control.Arrow.ArrowExc+import Control.Arrow.ArrowIf+import Control.Arrow.ArrowIO+import Control.Arrow.ArrowList+import Control.Arrow.ArrowNF+import Control.Arrow.ArrowTree+import Control.Arrow.ArrowState -import Control.DeepSeq+import Control.DeepSeq+import Control.Exception ( SomeException+ , try+ ) -- ------------------------------------------------------------ @@ -144,6 +148,16 @@ arrIO cmd = IOSLA $ \ s x -> do res <- cmd x return (s, [res])++instance ArrowExc (IOSLA s) where+ tryA f = IOSLA $ \ s x -> do+ res <- try' $ runIOSLA f s x+ return $ case res of+ Left er -> (s, [Left er])+ Right (s1, ys) -> (s1, [Right x' | x' <- ys])+ where+ try' :: IO a -> IO (Either SomeException a)+ try' = try instance ArrowIOIf (IOSLA s) where isIOA p = IOSLA $ \ s x -> do
src/Control/Arrow/ListArrows.hs view
@@ -17,12 +17,13 @@ module Control.Arrow.ListArrows ( module Control.Arrow -- arrow classes- , module Control.Arrow.ArrowList+ , module Control.Arrow.ArrowExc , module Control.Arrow.ArrowIf+ , module Control.Arrow.ArrowIO+ , module Control.Arrow.ArrowList , module Control.Arrow.ArrowNF , module Control.Arrow.ArrowState , module Control.Arrow.ArrowTree- , module Control.Arrow.ArrowIO , module Control.Arrow.ListArrow -- arrow types , module Control.Arrow.StateListArrow@@ -32,6 +33,7 @@ where import Control.Arrow -- arrow classes+import Control.Arrow.ArrowExc import Control.Arrow.ArrowList import Control.Arrow.ArrowIf import Control.Arrow.ArrowNF
src/Data/AssocList.hs view
@@ -1,8 +1,20 @@--- |--- simple key value assocciation list--- implemented as unordered list of pairs------ Version : $Id: AssocList.hs,v 1.2 2005/05/27 13:15:23 hxml Exp $+-- ------------------------------------------------------------++{- |+ Module : Data.AssocList+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ Simple key value assocciation list+ implemented as unordered list of pairs++-}++-- ------------------------------------------------------------ module Data.AssocList ( module Data.AssocList
src/Data/Atom.hs view
@@ -65,12 +65,11 @@ import Data.ByteString.Internal ( toForeignPtr, c2w, w2c ) import Data.ByteString ( ByteString, pack, unpack ) import qualified Data.Map as M+import Data.String.UTF8Decoding ( decodeUtf8 )+import Data.String.Unicode ( unicodeToUtf8 ) import Data.Typeable import System.IO.Unsafe ( unsafePerformIO )--import Text.XML.HXT.DOM.Unicode ( unicodeToUtf8 )-import Text.XML.HXT.DOM.UTF8Decoding ( decodeUtf8 ) -- ------------------------------------------------------------
− src/Data/Char/UTF8.hs
@@ -1,363 +0,0 @@-{---Copyright (c) 2002, members of the Haskell Internationalisation Working-Group All rights reserved.--Redistribution and use in source and binary forms, with or without-modification, are permitted provided that the following conditions are met:--* Redistributions of source code must retain the above copyright notice,- this list of conditions and the following disclaimer.-* Redistributions in binary form must reproduce the above copyright notice,- this list of conditions and the following disclaimer in the- documentation and/or other materials provided with the distribution.-* Neither the name of the Haskell Internationalisation Working Group nor- the names of its contributors may be used to endorse or promote products- derived from this software without specific prior written permission.--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE-POSSIBILITY OF SUCH DAMAGE.--This module provides lazy stream encoding/decoding facilities for UTF-8,-the Unicode Transformation Format with 8-bit words.--2002-09-02 Sven Moritz Hallberg <pesco@gmx.de>---}--{---2007-04-30 Henning Thielemann:-Slight changes to make decode lazy.-The calls of 'reverse' in the original version have broken laziness-and thus had memory leaks.---}--module Data.Char.UTF8- ( encode, decode,- decodeEmbedErrors,- encodeOne, decodeOne,- Error, -- Haddock does not want to document signatures with private types- -- these functions should be moved to a utility module- ) where--import Data.Char (ord, chr)-import Data.Word (Word8, Word16, Word32)-import Data.Bits (Bits, shiftL, shiftR, (.&.), (.|.))--import Data.List (unfoldr)--import Text.XML.HXT.DOM.Util (partitionEither, swap, toMaybe)------ - UTF-8 in General ----- Adapted from the Unicode standard, version 3.2,--- Table 3.1 "UTF-8 Bit Distribution" (excluded are UTF-16 encodings):---- Scalar 1st Byte 2nd Byte 3rd Byte 4th Byte--- 000000000xxxxxxx 0xxxxxxx--- 00000yyyyyxxxxxx 110yyyyy 10xxxxxx--- zzzzyyyyyyxxxxxx 1110zzzz 10yyyyyy 10xxxxxx--- 000uuuzzzzzzyyyyyyxxxxxx 11110uuu 10zzzzzz 10yyyyyy 10xxxxxx---- Also from the Unicode standard, version 3.2,--- Table 3.1B "Legal UTF-8 Byte Sequences":---- Code Points 1st Byte 2nd Byte 3rd Byte 4th Byte--- U+0000..U+007F 00..7F--- U+0080..U+07FF C2..DF 80..BF--- U+0800..U+0FFF E0 A0..BF 80..BF--- U+1000..U+CFFF E1..EC 80..BF 80..BF--- U+D000..U+D7FF ED 80..9F 80..BF--- U+D800..U+DFFF ill-formed--- U+E000..U+FFFF EE..EF 80..BF 80..BF--- U+10000..U+3FFFF F0 90..BF 80..BF 80..BF--- U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF--- U+100000..U+10FFFF F4 80..8F 80..BF 80..BF------ - Encoding Functions ----- Must the encoder ensure that no illegal byte sequences are output or--- can we trust the Haskell system to supply only legal values?--- For now I include error case for the surrogate values U+D800..U+DFFF and--- out-of-range scalars.---- The function is pretty much a transscript of table 3.1B with error checks.--- It dispatches the actual encoding to functions specific to the number of--- required bytes.--encodeOne :: Char -> [Word8]-encodeOne c- -- The report guarantees in (6.1.2) that this won't happen:- -- | n < 0 = error "encodeUTF8: ord returned a negative value"- | n < 0x0080 = encodeOne_onebyte n8- | n < 0x0800 = encodeOne_twobyte n16- | n < 0xD800 = encodeOne_threebyte n16- | n < 0xE000 = error "encodeUTF8: ord returned a surrogate value"- | n < 0x10000 = encodeOne_threebyte n16- -- Haskell 98 only talks about 16 bit characters, but ghc handles 20.1.- | n < 0x10FFFF = encodeOne_fourbyte n32- | otherwise = error "encodeUTF8: ord returned a value above 0x10FFFF"- where- n = ord c :: Int- n8 = fromIntegral n :: Word8- n16 = fromIntegral n :: Word16- n32 = fromIntegral n :: Word32----- With the above, a stream decoder is trivial:--encode :: [Char] -> [Word8]-encode = concatMap encodeOne----- Now follow the individual encoders for certain numbers of bytes...--- _--- / | __ ___ __ __--- / ^| // /__/ // //--- /.==| \\ //_ // //--- It's // || // \_/_//_//_ and it's here to stay!--encodeOne_onebyte :: Word8 -> [Word8]-encodeOne_onebyte cp = [cp]----- 00000yyyyyxxxxxx -> 110yyyyy 10xxxxxx--encodeOne_twobyte :: Word16 -> [Word8]-encodeOne_twobyte cp = [(0xC0.|.ys), (0x80.|.xs)]- where- xs, ys :: Word8- ys = fromIntegral (shiftR cp 6)- xs = (fromIntegral cp) .&. 0x3F----- zzzzyyyyyyxxxxxx -> 1110zzzz 10yyyyyy 10xxxxxx--encodeOne_threebyte :: Word16 -> [Word8]-encodeOne_threebyte cp = [(0xE0.|.zs), (0x80.|.ys), (0x80.|.xs)]- where- xs, ys, zs :: Word8- xs = (fromIntegral cp) .&. 0x3F- ys = (fromIntegral (shiftR cp 6)) .&. 0x3F- zs = fromIntegral (shiftR cp 12)----- 000uuuzzzzzzyyyyyyxxxxxx -> 11110uuu 10zzzzzz 10yyyyyy 10xxxxxx--encodeOne_fourbyte :: Word32 -> [Word8]-encodeOne_fourbyte cp = [0xF0.|.us, 0x80.|.zs, 0x80.|.ys, 0x80.|.xs]- where- xs, ys, zs, us :: Word8- xs = (fromIntegral cp) .&. 0x3F- ys = (fromIntegral (shiftR cp 6)) .&. 0x3F- zs = (fromIntegral (shiftR cp 12)) .&. 0x3F- us = fromIntegral (shiftR cp 18)------ - Decoding ----- The decoding is a bit more involved. The byte sequence could contain all--- sorts of corruptions. The user must be able to either notice or ignore these--- errors.---- I will first look at the decoding of a single character. The process--- consumes a certain number of bytes from the input. It returns the--- remaining input and either an error and the index of its occurance in the--- byte sequence or the decoded character.--data Error---- The first byte in a sequence starts with either zero, two, three, or four--- ones and one zero to indicate the length of the sequence. If it doesn't,--- it is invalid. It is dropped and the next byte interpreted as the start--- of a new sequence.-- = InvalidFirstByte---- All bytes in the sequence except the first match the bit pattern 10xxxxxx.--- If one doesn't, it is invalid. The sequence up to that point is dropped--- and the "invalid" byte interpreted as the start of a new sequence. The error--- includes the length of the partial sequence and the number of expected bytes.-- | InvalidLaterByte Int -- the byte at relative index n was invalid---- If a sequence ends prematurely, it has been truncated. It dropped and--- decoding stops. The error reports the actual and expected lengths of the--- sequence.-- | Truncated Int Int -- only n of m expected bytes were present---- Some sequences would represent code points which would be encoded as a--- shorter sequence by a conformant encoder. Such non-shortest sequences are--- considered erroneous and dropped. The error reports the actual and--- expected number of bytes used.-- | NonShortest Int Int -- n instead of m bytes were used---- Unicode code points are in the range of [0..0x10FFFF]. Any values outside--- of those bounds are simply invalid.-- | ValueOutOfBounds---- There is no such thing as "surrogate pairs" any more in UTF-8. The--- corresponding code points now form illegal byte sequences.-- | Surrogate- deriving (Show, Eq)----- Second, third, and fourth bytes share the common requirement to start--- with the bit sequence 10. So, here's the function to check that property.--first_bits_not_10 :: Word8 -> Bool-first_bits_not_10 b- | (b.&.0xC0) /= 0x80 = True- | otherwise = False----- Erm, OK, the single-character decoding function's return type is a bit--- longish. It is a tripel:---- - The first component contains the decoded character or an error--- if the byte sequence was erroneous.--- - The second component contains the number of bytes that were consumed--- from the input.--- - The third component contains the remaining bytes of input.--decodeOne :: [Word8] -> (Either Error Char, Int, [Word8])-decodeOne bs@(b1:rest)- | b1 < 0x80 = decodeOne_onebyte bs- | b1 < 0xC0 = (Left InvalidFirstByte, 1, rest)- | b1 < 0xE0 = decodeOne_twobyte bs- | b1 < 0xF0 = decodeOne_threebyte bs- | b1 < 0xF5 = decodeOne_fourbyte bs- | otherwise = (Left ValueOutOfBounds, 1, rest)-decodeOne [] = error "UTF8.decodeOne: No input"----- 0xxxxxxx -> 000000000xxxxxxx--decodeOne_onebyte :: [Word8] -> (Either Error Char, Int, [Word8])-decodeOne_onebyte (b:bs) = (Right (cpToChar b), 1, bs)-decodeOne_onebyte[] = error "UTF8.decodeOne_onebyte: No input (can't happen)"--cpToChar :: Integral a => a -> Char-cpToChar = chr . fromIntegral----- 110yyyyy 10xxxxxx -> 00000yyyyyxxxxxx--decodeOne_twobyte :: [Word8] -> (Either Error Char, Int, [Word8])-decodeOne_twobyte (_:[])- = (Left (Truncated 1 2), 1, [])-decodeOne_twobyte (b1:b2:bs)- | b1 < 0xC2 = (Left (NonShortest 2 1), 2, bs)- | first_bits_not_10 b2 = (Left (InvalidLaterByte 1), 1, (b2:bs))- | otherwise = (Right (cpToChar result), 2, bs)- where- xs, ys, result :: Word32- xs = fromIntegral (b2.&.0x3F)- ys = fromIntegral (b1.&.0x1F)- result = shiftL ys 6 .|. xs-decodeOne_twobyte[] = error "UTF8.decodeOne_twobyte: No input (can't happen)"----- 1110zzzz 10yyyyyy 10xxxxxx -> zzzzyyyyyyxxxxxx--decodeOne_threebyte :: [Word8] -> (Either Error Char, Int, [Word8])-decodeOne_threebyte (_:[]) = threebyte_truncated 1-decodeOne_threebyte (_:_:[]) = threebyte_truncated 2-decodeOne_threebyte bs@(b1:b2:b3:rest)- | first_bits_not_10 b2- = (Left (InvalidLaterByte 1), 1, drop 1 bs)- | first_bits_not_10 b3- = (Left (InvalidLaterByte 2), 2, drop 2 bs)- | result < 0x0080- = (Left (NonShortest 3 1), 3, rest)- | result < 0x0800- = (Left (NonShortest 3 2), 3, rest)- | result >= 0xD800 && result < 0xE000- = (Left Surrogate, 3, rest)- | otherwise- = (Right (cpToChar result), 3, rest)- where- xs, ys, zs, result :: Word32- xs = fromIntegral (b3.&.0x3F)- ys = fromIntegral (b2.&.0x3F)- zs = fromIntegral (b1.&.0x0F)- result = shiftL zs 12 .|. shiftL ys 6 .|. xs-decodeOne_threebyte[]- = error "UTF8.decodeOne_threebyte: No input (can't happen)"--threebyte_truncated :: Int -> (Either Error Char, Int, [Word8])-threebyte_truncated n = (Left (Truncated n 3), n, [])----- 11110uuu 10zzzzzz 10yyyyyy 10xxxxxx -> 000uuuzzzzzzyyyyyyxxxxxx--decodeOne_fourbyte :: [Word8] -> (Either Error Char, Int, [Word8])-decodeOne_fourbyte (_:[]) = fourbyte_truncated 1-decodeOne_fourbyte (_:_:[]) = fourbyte_truncated 2-decodeOne_fourbyte (_:_:_:[]) = fourbyte_truncated 3-decodeOne_fourbyte bs@(b1:b2:b3:b4:rest)- | first_bits_not_10 b2- = (Left (InvalidLaterByte 1), 1, drop 1 bs)- | first_bits_not_10 b3- = (Left (InvalidLaterByte 2), 2, drop 2 bs)- | first_bits_not_10 b4- = (Left (InvalidLaterByte 3), 3, drop 3 bs)- | result < 0x0080- = (Left (NonShortest 4 1), 4, rest)- | result < 0x0800- = (Left (NonShortest 4 2), 4, rest)- | result < 0x10000- = (Left (NonShortest 4 3), 4, rest)- | result > 0x10FFFF- = (Left ValueOutOfBounds, 4, rest)- | otherwise- = (Right (cpToChar result), 4, rest)- where- xs, ys, zs, us, result :: Word32- xs = fromIntegral (b4 .&. 0x3F)- ys = fromIntegral (b3 .&. 0x3F)- zs = fromIntegral (b2 .&. 0x3F)- us = fromIntegral (b1 .&. 0x07)- result = xs .|. shiftL ys 6 .|. shiftL zs 12 .|. shiftL us 18-decodeOne_fourbyte[]- = error "UTF8.decodeOne_fourbyte: No input (can't happen)"--fourbyte_truncated :: Int -> (Either Error Char, Int, [Word8])-fourbyte_truncated n = (Left (Truncated n 4), n, [])----- The decoder examines all input, recording decoded characters as well as--- error-index pairs along the way.--decode :: [Word8] -> ([Char], [(Error,Int)])-decode = swap . partitionEither . decodeEmbedErrors--decodeEmbedErrors :: [Word8] -> [Either (Error,Int) Char]-decodeEmbedErrors =- unfoldr (\(pos,xs) ->- toMaybe- (not $ null xs)- (let (c,n,rest) = decodeOne xs- in (either (\err -> Left (err,pos)) Right c,- (pos+n,rest)))) .- (,) 0
+ src/Data/Function/Selector.hs view
@@ -0,0 +1,139 @@+{-# OPTIONS -XMultiParamTypeClasses -XFunctionalDependencies -XFlexibleInstances #-}++module Data.Function.Selector+where++import Prelude hiding (id,(.))++import Control.Arrow+import Control.Category++infixr 3 .&&&.++-- ------------------------------------------------------------++-- | A Selector is a pair of an access function and a modifying function+-- for reading and updating parts of a composite type++data Selector s a = S { getS :: s -> a+ , setS :: a -> s -> s+ }++chgS :: Selector s a -> (a -> a) -> (s -> s)+chgS sel f s = setS sel x s+ where+ x = f . getS sel $ s++chgM :: (Monad m) => Selector s a -> (a -> m a) -> (s -> m s)+chgM sel f s = do+ y <- f x+ return $ setS sel y s+ where+ x = getS sel $ s++-- | Alias for constructor S++mkSelector :: (s -> a) -> (a -> s -> s) -> Selector s a+mkSelector = S++-- (.), (>>>), (<<<)++instance Category Selector where+ id = S { getS = id+ , setS = const+ }+ (S g2 s2) . (S g1 s1) = S { getS = g2 . g1+ , setS = \ x s ->+ let x1 = g1 s in+ let x1' = s2 x x1 in+ s1 x1' s+ }++idS :: Selector s s+idS = id++(.&&&.) :: Selector s a -> Selector s b -> Selector s (a, b)+(.&&&.) (S g1 s1) (S g2 s2) = S { getS = g1 &&& g2+ , setS = \ (x, y) -> s2 y . s1 x+ }++-- ------------------------------------------------------------+-- TODO: delete theses+{-+subS :: Selector b c -> Selector a b -> Selector a c+subS = (.)++pairS :: Selector s a -> Selector s b -> Selector s (a, b)+pairS = (.&&&.)++chgS :: Selector s a -> (a -> a) -> (s -> s)+chgS = update++putS :: Selector s a -> a -> (s -> s)+putS = setS++-}+-- ------------------------------------------------------------+{-+type Selector s a = (s -> a, a -> s -> s)++subS :: Selector b c -> Selector a b -> Selector a c+subS (g2, s2) (g1, s1) = ( g2 . g1+ , s1s2+ )+ where+ s1s2 x s = s'+ where+ x1 = g1 s+ x1' = s2 x x1+ s' = s1 x1' s++pairS :: Selector s a -> Selector s b -> Selector s (a, b)+pairS (g1, s1) (g2, s2) = ( g1 &&& g2+ , \ (x, y) -> s2 y . s1 x+ )++chgS :: Selector s a -> (a -> a) -> (s -> s)+chgS (g, s) f x = s (f (g x)) x++getS :: Selector s a -> s -> a+getS = fst -- getS (g, _s) x = g x++putS :: Selector s a -> a -> (s -> s)+putS s v = chgS s (const v)++idS :: Selector s s+idS = (id, const)+-}+-- ------------------------------------------------------------++-- | Selectors for pairs and 3-tuples: comp1, comp2, comp3,+-- this can be extended to n-tuples++class Comp1 s a | s -> a where comp1 :: Selector s a+class Comp2 s a | s -> a where comp2 :: Selector s a+class Comp3 s a | s -> a where comp3 :: Selector s a+++instance Comp1 (a, b) a where comp1 = S { getS = fst+ , setS = \ x1 (_, x2) -> (x1, x2)+ }++instance Comp2 (a, b) b where comp2 = S { getS = snd+ , setS = \ x2 (x1, _) -> (x1, x2)+ }++instance Comp1 (a, b, c) a where comp1 = S { getS = \ (x1, _, _) -> x1+ , setS = \ x1 (_, x2, x3) -> (x1, x2, x3)+ }++instance Comp2 (a, b, c) b where comp2 = S { getS = \ (_, x2, _) -> x2+ , setS = \ x2 (x1, _, x3) -> (x1, x2, x3)+ }++instance Comp3 (a, b, c) c where comp3 = S { getS = \ (_, _, x3) -> x3+ , setS = \ x3 (x1, x2, _) -> (x1, x2, x3)+ }++-- ------------------------------------------------------------+
src/Data/Tree/NTree/TypeDefs.hs view
@@ -27,6 +27,7 @@ import Control.DeepSeq +import Data.Binary import Data.Tree.Class import Data.Typeable @@ -50,6 +51,13 @@ instance (NFData a) => NFData (NTree a) where rnf (NTree n cl) = rnf n `seq` rnf cl++instance (Binary a) => Binary (NTree a) where+ put (NTree n cs) = put n >> put cs+ get = do+ n <- get+ cs <- get+ return (NTree n cs) -- | NTree implements class Functor
− src/Text/XML/HXT/Arrow.hs
@@ -1,64 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.Arrow- Copyright : Copyright (C) 2006-2010 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : stable- Portability: portable-- The HXT arrow interface-- The application programming interface to the arrow modules of the Haskell XML Toolbox.- This module exports all important arrows for input, output, parsing, validating and transforming XML.- It also exports all basic datatypes and functions of the toolbox.---}---- --------------------------------------------------------------module Text.XML.HXT.Arrow- ( module Control.Arrow.ListArrows-- , module Text.XML.HXT.DOM.Interface-- , module Text.XML.HXT.Arrow.XmlArrow- , module Text.XML.HXT.Arrow.XmlIOStateArrow-- , module Text.XML.HXT.Arrow.DocumentInput- , module Text.XML.HXT.Arrow.DocumentOutput- , module Text.XML.HXT.Arrow.Edit- , module Text.XML.HXT.Arrow.GeneralEntitySubstitution- , module Text.XML.HXT.Arrow.Namespace- , module Text.XML.HXT.Arrow.ProcessDocument- , module Text.XML.HXT.Arrow.ReadDocument- , module Text.XML.HXT.Arrow.WriteDocument- , module Text.XML.HXT.Arrow.Pickle-- , module Text.XML.HXT.Version- )-where--import Control.Arrow.ListArrows -- arrow classes--import Data.Atom () -- import this explicitly--import Text.XML.HXT.DOM.Interface-import Text.XML.HXT.Arrow.DocumentInput-import Text.XML.HXT.Arrow.DocumentOutput-import Text.XML.HXT.Arrow.Edit-import Text.XML.HXT.Arrow.GeneralEntitySubstitution-import Text.XML.HXT.Arrow.Namespace-import Text.XML.HXT.Arrow.Pickle-import Text.XML.HXT.Arrow.ProcessDocument-import Text.XML.HXT.Arrow.ReadDocument-import Text.XML.HXT.Arrow.WriteDocument-import Text.XML.HXT.Arrow.XmlArrow-import Text.XML.HXT.Arrow.XmlIOStateArrow-import Text.XML.HXT.Arrow.XmlRegex () -- import this explicitly--import Text.XML.HXT.Version---- ------------------------------------------------------------
+ src/Text/XML/HXT/Arrow/Binary.hs view
@@ -0,0 +1,69 @@+-- ------------------------------------------------------------++{- |+ Module : Text.XML.HXT.Arrow.Binary+ Copyright : Copyright (C) 2008 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : experimental+ Portability: portable++ De-/Serialisation arrows for XmlTrees and other arbitrary values with a Binary instance+-}++-- ------------------------------------------------------------++module Text.XML.HXT.Arrow.Binary+ ( readBinaryValue+ , writeBinaryValue+ )+where++import Control.Arrow ()+import Control.Arrow.ArrowExc+import Control.Arrow.ArrowList+import Control.Arrow.ArrowIO++import Control.DeepSeq++import Data.Binary+import qualified Data.ByteString.Lazy as B++import Text.XML.HXT.Arrow.XmlState.ErrorHandling+import Text.XML.HXT.Arrow.XmlState.TypeDefs++-- ------------------------------------------------------------++readBinaryValue :: (NFData a, Binary a) => String -> IOStateArrow s b a+readBinaryValue file = flip decodeBinaryValue file $< getSysVar theBinaryDeCompression++-- | Read a serialied value from a file, optionally decompress it and decode the value+-- In case of an error, the error message is issued and the arrow fails++decodeBinaryValue :: (NFData a, Binary a) => DeCompressionFct -> String -> IOStateArrow s b a+decodeBinaryValue decompress file+ = arrIO0 ( do+ r <- dec+ rnf r `seq` return r+ )+ `catchA`+ issueExc "readBinaryValue"+ where+ dec = B.readFile file >>= return . decode . decompress++-- | Serialize a value, optionally compress it, and write it to a file.+-- In case of an error, the error message is issued and the arrow fails++writeBinaryValue :: (Binary a) => String -> IOStateArrow s a ()+writeBinaryValue file = flip encodeBinaryValue file $< getSysVar theBinaryCompression++encodeBinaryValue :: (Binary a) => CompressionFct -> String -> IOStateArrow s a ()+encodeBinaryValue compress file+ = arrIO enc+ `catchA`+ issueExc "writeBinaryXmlTree"+ where+ enc = B.writeFile file . compress . encode++-- ------------------------------------------------------------
src/Text/XML/HXT/Arrow/DTDProcessing.hs view
@@ -8,7 +8,6 @@ Maintainer : Uwe Schmidt (uwe@fh-wedel.de) Stability : experimental Portability: portable- Version : $Id: DTDProcessing.hs,v 1.9 2006/05/11 14:47:19 hxml Exp $ DTD processing function for including external parts of a DTD@@ -34,7 +33,7 @@ import qualified Text.XML.HXT.DOM.XmlNode as XN import Text.XML.HXT.Arrow.XmlArrow-import Text.XML.HXT.Arrow.XmlIOStateArrow+import Text.XML.HXT.Arrow.XmlState import Text.XML.HXT.Arrow.ParserInterface ( parseXmlDTDdecl@@ -127,7 +126,7 @@ processRoot = ( traceMsg 1 ("processDTD: process parameter entities") >>>- setParamString a_standalone ""+ setSysAttrString a_standalone "" >>> ( addDocType `whenNot`
src/Text/XML/HXT/Arrow/DocumentInput.hs view
@@ -8,7 +8,6 @@ Maintainer : Uwe Schmidt (uwe@fh-wedel.de) Stability : experimental Portability: portable- Version : $Id$ State arrows for document input -}@@ -22,36 +21,37 @@ , getEncoding , getTextEncoding , decodeDocument+ , addInputError ) where -import Control.Arrow -- arrow classes-import Control.Arrow.ArrowList-import Control.Arrow.ArrowIf-import Control.Arrow.ArrowTree-import Control.Arrow.ArrowIO-import Control.Arrow.ListArrow--import Data.List ( isPrefixOf )--import System.FilePath ( takeExtension )+import Control.Arrow -- arrow classes+import Control.Arrow.ArrowList+import Control.Arrow.ArrowIf+import Control.Arrow.ArrowTree+import Control.Arrow.ArrowIO+import Control.Arrow.ListArrow -import Text.XML.HXT.DOM.Unicode ( getDecodingFct+import Data.List ( isPrefixOf )+import Data.String.Unicode ( getDecodingFct , guessEncoding , normalizeNL ) +import System.FilePath ( takeExtension )+ import qualified Text.XML.HXT.IO.GetFILE as FILE-import qualified Text.XML.HXT.IO.GetHTTPLibCurl as LibCURL -import Text.XML.HXT.DOM.Interface+import Text.XML.HXT.DOM.Interface -import Text.XML.HXT.Arrow.ParserInterface ( parseXmlDocEncodingSpec+import Text.XML.HXT.Arrow.ParserInterface+ ( parseXmlDocEncodingSpec , parseXmlEntityEncodingSpec , removeEncodingSpec )-import Text.XML.HXT.Arrow.XmlArrow-import Text.XML.HXT.Arrow.XmlIOStateArrow+import Text.XML.HXT.Arrow.XmlArrow+import Text.XML.HXT.Arrow.XmlState+import Text.XML.HXT.Arrow.XmlState.TypeDefs -- ---------------------------------------------------------- @@ -101,10 +101,7 @@ getFileContents :: IOStateArrow s XmlTree XmlTree getFileContents- = applyA ( ( ( getAttrValue a_strict_input- >>>- arr isTrueValue- )+ = applyA ( ( getSysVar theStrictInput &&& ( getAttrValue transferURI >>>@@ -116,7 +113,7 @@ >>> arrIO (uncurry FILE.getCont) >>>- ( arr (uncurry addError) -- io error occured+ ( arr (uncurry addInputError) -- io error occured ||| arr addTxtContent -- content read )@@ -126,20 +123,18 @@ getStdinContents :: IOStateArrow s XmlTree XmlTree getStdinContents- = applyA ( getAttrValue a_strict_input- >>>- arr isTrueValue+ = applyA ( getSysVar theStrictInput >>> arrIO FILE.getStdinCont >>>- ( arr (uncurry addError) -- io error occured+ ( arr (uncurry addInputError) -- io error occured ||| arr addTxtContent -- content read ) ) -addError :: [(String, String)] -> String -> IOStateArrow s XmlTree XmlTree-addError al e+addInputError :: Attributes -> String -> IOStateArrow s XmlTree XmlTree+addInputError al e = issueFatal e >>> seqA (map (uncurry addAttr) al)@@ -150,7 +145,7 @@ addMimeType = addMime $< ( getAttrValue transferURI >>>- ( uriToMime $< getSysParam xio_mimeTypes )+ ( uriToMime $< getMimeTypeTable ) ) where addMime mt@@ -168,41 +163,7 @@ getHttpContents :: IOStateArrow s XmlTree XmlTree getHttpContents- = getCont $<< ( getAttrValue transferURI- &&&- ( ( getAttrlAsAssoc -- get all attributes of root node- &&&- getAllParamsString -- get all system params- )- >>^ uncurry addEntries -- merge them, attributes overwrite system params- )- )- where- getAttrlAsAssoc -- get the attributes as assoc list- = listA ( getAttrl- >>> ( getName- &&&- xshow getChildren- )- )-- getCont uri options- = applyA ( ( traceMsg 2 ( "get HTTP via libcurl, uri=" ++ show uri ++ " options=" ++ show options )- >>>- arrIO0 ( LibCURL.getCont options uri )- )- >>>- ( arr (uncurry addError)- |||- arr addContent- )- )-- addContent :: (AssocList String String, String) -> IOStateArrow s XmlTree XmlTree- addContent (al, c)- = replaceChildren (txt c)- >>>- seqA (map (uncurry addAttr) al)+ = withoutUserState $ applyA $ getSysVar theHttpHandler getURIContents :: IOStateArrow s XmlTree XmlTree getURIContents@@ -349,7 +310,7 @@ arr guessEncoding , getAttrValue transferEncoding -- 2. guess: take the transfer encoding , getAttrValue a_encoding -- 3. guess: take encoding parameter in root node- , getParamString a_encoding -- 4. guess: take encoding parameter in global state+ , getSysVar theInputEncoding -- 4. guess: take encoding parameter in global state , constA utf8 -- default : utf8 ] >. (head . filter (not . null)) -- make the filter deterministic: take 1. entry from list of guesses@@ -358,7 +319,7 @@ getTextEncoding = catA [ getAttrValue transferEncoding -- 1. guess: take the transfer encoding , getAttrValue a_encoding -- 2. guess: take encoding parameter in root node- , getParamString a_encoding -- 3. guess: take encoding parameter in global state+ , getSysVar theInputEncoding -- 3. guess: take encoding parameter in global state , constA isoLatin1 -- default : no encoding ] >. (head . filter (not . null)) -- make the filter deterministic: take 1. entry from list of guesses@@ -379,7 +340,7 @@ found df = traceMsg 2 ("decodeDocument: encoding is " ++ show enc) >>>- ( decodeText df $< getAttrValue a_ignore_encoding_errors )+ ( decodeText df $< getSysVar theEncodingErrors ) >>> addAttr transferEncoding enc @@ -388,7 +349,7 @@ >>> setDocumentStatusFromSystemState "decoding document" - decodeText df ignoreErrs+ decodeText df withEncErrors = processChildren ( getText -- get the document content >>> arr df -- decode the text, result is (string, [errMsg])@@ -396,9 +357,8 @@ ^>> mkText ) <+>- ( if isTrueValue ignoreErrs- then none -- encoding errors are ignored- else+ ( if withEncErrors+ then ( arrL snd -- take the error messages >>> arr ((enc ++) . (" encoding error" ++)) -- prefix with enc error@@ -407,6 +367,7 @@ >>> none -- neccessary for type match with <+> )+ else none ) ) )
src/Text/XML/HXT/Arrow/DocumentOutput.hs view
@@ -31,12 +31,11 @@ import Control.Arrow.ArrowIO import Control.Arrow.ListArrow -import Text.XML.HXT.DOM.Unicode ( getOutputEncodingFct )+import Data.String.Unicode ( getOutputEncodingFct )+ import Text.XML.HXT.DOM.Interface import Text.XML.HXT.Arrow.XmlArrow-import Text.XML.HXT.Arrow.XmlIOStateArrow- import Text.XML.HXT.Arrow.Edit ( addHeadlineToXmlDoc , addXmlPi , addXmlPiEncoding@@ -44,6 +43,8 @@ , numberLinesInXmlDoc , treeRepOfXmlDoc )+import Text.XML.HXT.Arrow.XmlState+import Text.XML.HXT.Arrow.XmlState.TypeDefs import System.IO ( Handle , IOMode(..)@@ -54,7 +55,6 @@ , hClose , stdout )- import System.IO.Error ( try ) -- ------------------------------------------------------------@@ -63,45 +63,47 @@ putXmlDocument :: Bool -> String -> IOStateArrow s XmlTree XmlTree putXmlDocument textMode dst- = perform ( xshow getChildren+ = perform putDoc+ where+ putDoc+ = xshow getChildren+ >>>+ arrIO (\ s -> try ( hPutDocument (\h -> hPutStrLn h s)))+ >>>+ ( ( traceMsg 1 ("io error, document not written to " ++ outFile) >>>- arrIO (\ s -> try ( hPutDocument (\h -> hPutStrLn h s)))+ arr show >>> mkError c_fatal >>>- ( ( traceMsg 1 ("io error, document not written to " ++ outFile)- >>>- arr show >>> mkError c_fatal- >>>- filterErrorMsg- )- |||- ( traceMsg 2 ("document written to " ++ outFile)- >>>- none- )- )+ filterErrorMsg )- where- isStdout = null dst || dst == "-"+ |||+ ( traceMsg 2 ("document written to " ++ outFile)+ >>>+ none+ )+ )+ where+ isStdout = null dst || dst == "-" - outFile = if isStdout- then "stdout"- else show dst+ outFile = if isStdout+ then "stdout"+ else show dst - hPutDocument :: (Handle -> IO ()) -> IO ()- hPutDocument action- | isStdout- = do- hSetBinaryMode stdout (not textMode)- action stdout- hSetBinaryMode stdout False- | otherwise- = do- handle <- ( if textMode- then openFile- else openBinaryFile- ) dst WriteMode- action handle- hClose handle+ hPutDocument :: (Handle -> IO ()) -> IO ()+ hPutDocument action+ | isStdout+ = do+ hSetBinaryMode stdout (not textMode)+ action stdout+ hSetBinaryMode stdout False+ | otherwise+ = do+ handle <- ( if textMode+ then openFile+ else openBinaryFile+ ) dst WriteMode+ action handle+ hClose handle -- | -- write the tree representation of a document to a file@@ -135,9 +137,9 @@ getEncodingParam :: IOStateArrow s XmlTree String getEncodingParam- = catA [ getParamString a_output_encoding -- 4. guess: take output encoding parameter from global state- , getParamString a_encoding -- 5. guess: take encoding parameter from global state- , constA utf8 -- default : utf8+ = catA [ getSysVar theOutputEncoding -- 4. guess: take output encoding parameter from global state+ , getSysVar theInputEncoding -- 5. guess: take encoding parameter from global state+ , constA utf8 -- default : utf8 ] >. (head . filter (not . null))
src/Text/XML/HXT/Arrow/Edit.hs view
@@ -66,10 +66,11 @@ import Control.Arrow.ArrowTree import Control.Arrow.ListArrow +import Data.Char.Properties.XMLCharProps ( isXmlSpaceChar )+ import Text.XML.HXT.Arrow.XmlArrow import Text.XML.HXT.DOM.Interface import qualified Text.XML.HXT.DOM.XmlNode as XN-import Text.XML.HXT.DOM.Unicode ( isXmlSpaceChar ) import Text.XML.HXT.DOM.FormatXmlTree ( formatXmlTree ) import Text.XML.HXT.Parser.HtmlParsec ( emptyHtmlTags ) import Text.XML.HXT.Parser.XmlEntities ( xmlEntities )@@ -110,7 +111,7 @@ canonicalize1Node = (deep isPi `when` isDTD) -- remove DTD parts, except PIs >>>- (none `when` toBeRemoved) -- remove unintersting nodes+ (none `when` toBeRemoved) -- remove uninteresting nodes >>> ( processAttrl ( processChildren transfCharRef >>>
src/Text/XML/HXT/Arrow/GeneralEntitySubstitution.hs view
@@ -8,7 +8,6 @@ Maintainer : Uwe Schmidt (uwe@fh-wedel.de) Stability : experimental Portability: portable- Version : $Id: GeneralEntitySubstitution.hs,v 1.13 2006/05/01 18:56:24 hxml Exp $ general entity substitution @@ -26,8 +25,9 @@ import Control.Arrow.ArrowTree import Text.XML.HXT.DOM.Interface+ import Text.XML.HXT.Arrow.XmlArrow-import Text.XML.HXT.Arrow.XmlIOStateArrow+import Text.XML.HXT.Arrow.XmlState import Text.XML.HXT.Arrow.ParserInterface ( parseXmlAttrValue
src/Text/XML/HXT/Arrow/Namespace.hs view
@@ -109,14 +109,14 @@ -- ------------------------------------------------------------ --- | generate unique namespaces and add all namespace declarations to the root element+-- | generate unique namespaces and add all namespace declarations to all top nodes containing a namespace declaration+-- Usually the top node containing namespace declarations is the root node, but this isn't mandatory. -- -- Calls 'cleanupNamespaces' with 'collectNamespaceDecl' -uniqueNamespaces :: ArrowXml a => a XmlTree XmlTree-uniqueNamespaces- = fromLA $- cleanupNamespaces collectNamespaceDecl+uniqueNamespaces :: ArrowXml a => a XmlTree XmlTree+uniqueNamespaces = fromLA $+ cleanupNamespaces' collectNamespaceDecl -- | generate unique namespaces and add all namespace declarations for all prefix-uri pairs in all qualified names --@@ -124,10 +124,22 @@ -- Calls 'cleanupNamespaces' with @ collectNamespaceDecl \<+> collectPrefixUriPairs @ uniqueNamespacesFromDeclAndQNames :: ArrowXml a => a XmlTree XmlTree-uniqueNamespacesFromDeclAndQNames- = fromLA $- cleanupNamespaces (collectNamespaceDecl <+> collectPrefixUriPairs)+uniqueNamespacesFromDeclAndQNames = fromLA $+ cleanupNamespaces' ( collectNamespaceDecl+ <+>+ collectPrefixUriPairs+ ) +cleanupNamespaces' :: LA XmlTree (String, String) -> LA XmlTree XmlTree+cleanupNamespaces' collectNamespaces = processTopDownUntil+ ( hasNamespaceDecl `guards` cleanupNamespaces collectNamespaces )+ where+ hasNamespaceDecl = isElem+ >>>+ getAttrl+ >>>+ isNamespaceDeclAttr+ -- | does the real work for namespace cleanup. -- -- The parameter is used for collecting namespace uris and prefixes from the input tree@@ -148,7 +160,7 @@ changeQName renamePrefix -- update namespace prefix of element names ) >>>- attachEnv env1 -- all all namespaces as attributes to the root node attribute list+ attachEnv env1 -- add all namespaces as attributes to the root node attribute list where renamePrefix :: QName -> QName renamePrefix n
src/Text/XML/HXT/Arrow/ParserInterface.hs view
@@ -1,8 +1,19 @@--- |--- interface to the HXT XML and DTD parsers------ version: $Id: ParserInterface.hs,v 1.1 2006/05/01 18:56:24 hxml Exp $+-- ------------------------------------------------------------ +{- |+ Module : Text.XML.HXT.Arrow.ParserInterface+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ interface to the HXT XML and DTD parsers+-}++-- ------------------------------------------------------------+ module Text.XML.HXT.Arrow.ParserInterface ( module Text.XML.HXT.Arrow.ParserInterface ) where@@ -19,11 +30,9 @@ import Text.XML.HXT.DOM.Interface import Text.XML.HXT.Arrow.XmlArrow -import qualified Text.XML.HXT.Parser.TagSoup as TS import qualified Text.XML.HXT.Parser.HtmlParsec as HP import qualified Text.XML.HXT.Parser.XmlParsec as XP import qualified Text.XML.HXT.Parser.XmlDTDParser as DP-import qualified Text.XML.HXT.DTDValidation.Validation as VA -- ------------------------------------------------------------ @@ -68,25 +77,6 @@ parseHtmlContent :: ArrowList a => a String XmlTree parseHtmlContent = arrL HP.parseHtmlContent--parseHtmlTagSoup :: ArrowList a => Bool -> Bool -> Bool -> Bool -> Bool -> a (String, String) XmlTree-parseHtmlTagSoup withNamespaces withWarnings preserveCmt removeWS asHtml- = arr2L (TS.parseHtmlTagSoup withNamespaces withWarnings preserveCmt removeWS asHtml)---- --------------------------------------------------------------validateDoc :: ArrowList a => a XmlTree XmlTree-validateDoc = fromLA ( VA.validate- `when`- VA.getDTDSubset -- validate only when DTD decl is present- )--transformDoc :: ArrowList a => a XmlTree XmlTree-transformDoc = fromLA VA.transform---- old stuff--- validateDoc = arrL VA.validate--- transformDoc = arrL VA.transform -- ------------------------------------------------------------
src/Text/XML/HXT/Arrow/Pickle.hs view
@@ -8,7 +8,6 @@ Maintainer : Uwe Schmidt (uwe@fh-wedel.de) Stability : experimental Portability: portable- Version : $Id$ Pickler functions for converting between user defined data types and XmlTree data. Usefull for persistent storage and retreival@@ -50,6 +49,7 @@ -- from Text.XML.HXT.Arrow.Pickle.Xml , pickleDoc , unpickleDoc+ , showPickled , PU(..) , XmlPickler@@ -57,9 +57,29 @@ , xp4Tuple , xp5Tuple , xp6Tuple+ , xp7Tuple+ , xp8Tuple+ , xp9Tuple+ , xp10Tuple+ , xp11Tuple+ , xp12Tuple+ , xp13Tuple+ , xp14Tuple+ , xp15Tuple+ , xp16Tuple+ , xp17Tuple+ , xp18Tuple+ , xp19Tuple+ , xp20Tuple+ , xp21Tuple+ , xp22Tuple+ , xp23Tuple+ , xp24Tuple+ , xpAddFixedAttr , xpAlt , xpAttr+ , xpTextAttr , xpAttrFixed , xpAttrImplied , xpChoice@@ -102,10 +122,12 @@ import Control.Arrow.ListArrows import Text.XML.HXT.DOM.Interface-import Text.XML.HXT.Arrow.XmlArrow-import Text.XML.HXT.Arrow.XmlIOStateArrow+ import Text.XML.HXT.Arrow.ReadDocument import Text.XML.HXT.Arrow.WriteDocument+import Text.XML.HXT.Arrow.XmlArrow+import Text.XML.HXT.Arrow.XmlState+import Text.XML.HXT.Arrow.XmlState.TypeDefs import Text.XML.HXT.Arrow.Pickle.Xml import Text.XML.HXT.Arrow.Pickle.Schema@@ -123,21 +145,25 @@ -- An option evaluated by this arrow is 'a_addDTD'. -- If 'a_addDTD' is set ('v_1'), the pickler DTD is added as an inline DTD into the document. -xpickleDocument :: PU a -> Attributes -> String -> IOStateArrow s a XmlTree-xpickleDocument xp al dest- = xpickleVal xp+xpickleDocument :: PU a -> SysConfigList -> String -> IOStateArrow s a XmlTree+xpickleDocument xp config dest+ = localSysEnv+ $+ configSysVars config >>>+ xpickleVal xp+ >>> traceMsg 1 "xpickleVal applied" >>>- ( if lookup1 a_addDTD al == v_1- then replaceChildren ( (constA undefined >>> xpickleDTD xp >>> getChildren)- <+>- getChildren- )- else this- )+ ifA ( getSysAttr a_addDTD >>> isA (== v_1) )+ ( replaceChildren ( (constA undefined >>> xpickleDTD xp >>> getChildren)+ <+>+ getChildren+ )+ )+ this >>>- writeDocument al dest+ writeDocument [] dest -- | Option for generating and adding DTD when document is pickled @@ -154,9 +180,9 @@ -- when applied with the appropriate options. When during pickling indentation is switched on, -- the whitespace must be removed during unpickling. -xunpickleDocument :: PU a -> Attributes -> String -> IOStateArrow s b a-xunpickleDocument xp al src- = readDocument al src+xunpickleDocument :: PU a -> SysConfigList -> String -> IOStateArrow s b a+xunpickleDocument xp conf src+ = readDocument conf src >>> traceMsg 1 ("xunpickleVal for " ++ show src ++ " started") >>>@@ -166,11 +192,11 @@ -- | Write out the DTD generated out of a pickler. Calls 'xpicklerDTD' -xpickleWriteDTD :: PU b -> Attributes -> String -> IOStateArrow s b XmlTree-xpickleWriteDTD xp al dest+xpickleWriteDTD :: PU b -> SysConfigList -> String -> IOStateArrow s b XmlTree+xpickleWriteDTD xp config dest = xpickleDTD xp >>>- writeDocument al dest+ writeDocument config dest -- | The arrow for generating the DTD out of a pickler --@@ -204,7 +230,7 @@ >>> writeDocumentToString [] >>>- readFromString [(a_validate, v_1)]+ readFromString [withValidate True] >>> ( xunpickleVal xp `orElse`@@ -240,5 +266,3 @@ thePicklerDTD = dtdDescrToXml . dtdDescr . theSchema -- --------------------------------------------------------------
src/Text/XML/HXT/Arrow/Pickle/DTD.hs view
@@ -26,7 +26,7 @@ import Text.XML.HXT.DOM.Interface import Text.XML.HXT.Arrow.Pickle.Schema-import Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C+import Text.XML.HXT.XMLSchema.DataTypeLibW3CNames -- ------------------------------------------------------------
src/Text/XML/HXT/Arrow/Pickle/Schema.hs view
@@ -23,7 +23,7 @@ where import Text.XML.HXT.DOM.TypeDefs-import Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C+import Text.XML.HXT.XMLSchema.DataTypeLibW3CNames import Data.List ( sort )
src/Text/XML/HXT/Arrow/Pickle/Xml.hs view
@@ -1,3 +1,5 @@+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}+ -- ------------------------------------------------------------ {- |@@ -38,6 +40,8 @@ module Text.XML.HXT.Arrow.Pickle.Xml where +import Control.Arrow.ListArrows+ import Data.Maybe import Data.Map (Map) import qualified Data.Map as M@@ -45,11 +49,12 @@ import Text.XML.HXT.DOM.Interface import qualified Text.XML.HXT.DOM.XmlNode as XN -import Control.Arrow.ListArrows-import Text.XML.HXT.Arrow.XmlArrow+import Text.XML.HXT.Arrow.Edit (xshowEscapeXml) import Text.XML.HXT.Arrow.Pickle.Schema import Text.XML.HXT.Arrow.ReadDocument (xread)-import Text.XML.HXT.Arrow.Edit (xshowEscapeXml)+import Text.XML.HXT.Arrow.WriteDocument (writeDocumentToString)+import Text.XML.HXT.Arrow.XmlArrow+import Text.XML.HXT.Arrow.XmlState -- ------------------------------------------------------------ @@ -119,6 +124,13 @@ -- ------------------------------------------------------------ +-- | Pickles a value, then writes the document to a string.++showPickled :: (XmlPickler a) => SysConfigList -> a -> String+showPickled a = concat . (pickleDoc xpickle >>> runLA (writeDocumentToString a))++-- ------------------------------------------------------------+ -- | The zero pickler -- -- Encodes nothing, fails always during unpickling@@ -220,6 +232,8 @@ xpWrapMaybe :: (a -> Maybe b, b -> a) -> PU a -> PU b xpWrapMaybe (i, j) pa = (xpSeq j pa (xpLiftMaybe . i)) { theSchema = theSchema pa } +-- ------------------------------------------------------------+ -- | pickle a pair of values sequentially -- -- Used for pairs or together with wrap for pickling@@ -268,6 +282,191 @@ toSix ~(a, ~(b, ~(c, ~(d, ~(e, f))))) = (a, b, c, d, e, f ) fromSix ~(a, b, c, d, e, f) = (a, (b, (c, (d, (e, f))))) +-- ------------------------------------------------------------++-- | Like 'xpPair' and 'xpTriple' but for 7-tuples+--+-- Thanks to Tony Morris for doing xp7Tuple, ..., xp24Tuple.++xp7Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU (a, b, c, d, e, f, g)+xp7Tuple a b c d e f g+ = xpWrap ( \ (a, (b, c, d, e, f, g)) -> (a, b, c, d, e, f, g)+ , \ (a, b, c, d, e, f, g) -> (a, (b, c, d, e, f, g))+ )+ (xpPair a (xp6Tuple b c d e f g))++xp8Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU (a, b, c, d, e, f, g, h)+xp8Tuple a b c d e f g h+ = xpWrap ( \ ((a, b), (c, d, e, f, g, h)) -> (a, b, c, d, e, f, g, h)+ , \ (a, b, c, d, e, f, g, h) -> ((a, b), (c, d, e, f, g, h))+ )+ (xpPair (xpPair a b) (xp6Tuple c d e f g h))++xp9Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU (a, b, c, d, e, f, g, h, i)+xp9Tuple a b c d e f g h i+ = xpWrap ( \ ((a, b, c), (d, e, f, g, h, i)) -> (a, b, c, d, e, f, g, h, i)+ , \ (a, b, c, d, e, f, g, h, i) -> ((a, b, c), (d, e, f, g, h, i))+ )+ (xpPair (xpTriple a b c) (xp6Tuple d e f g h i))++xp10Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU (a, b, c, d, e, f, g, h, i, j)+xp10Tuple a b c d e f g h i j+ = xpWrap ( \ ((a, b, c, d), (e, f, g, h, i, j)) -> (a, b, c, d, e, f, g, h, i, j)+ , \ (a, b, c, d, e, f, g, h, i, j) -> ((a, b, c, d), (e, f, g, h, i, j))+ )+ (xpPair (xp4Tuple a b c d) (xp6Tuple e f g h i j))++xp11Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU (a, b, c, d, e, f, g, h, i, j, k)+xp11Tuple a b c d e f g h i j k+ = xpWrap ( \ ((a, b, c, d, e), (f, g, h, i, j, k)) -> (a, b, c, d, e, f, g, h, i, j, k)+ , \ (a, b, c, d, e, f, g, h, i, j, k) -> ((a, b, c, d, e), (f, g, h, i, j, k))+ )+ (xpPair (xp5Tuple a b c d e) (xp6Tuple f g h i j k))++xp12Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU (a, b, c, d, e, f, g, h, i, j, k, l)+xp12Tuple a b c d e f g h i j k l+ = xpWrap ( \ ((a, b, c, d, e, f), (g, h, i, j, k, l)) -> (a, b, c, d, e, f, g, h, i, j, k, l)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l) -> ((a, b, c, d, e, f), (g, h, i, j, k, l))+ )+ (xpPair (xp6Tuple a b c d e f) (xp6Tuple g h i j k l))++xp13Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU m -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m)+xp13Tuple a b c d e f g h i j k l m+ = xpWrap ( \ (a, (b, c, d, e, f, g), (h, i, j, k, l, m)) -> (a, b, c, d, e, f, g, h, i, j, k, l, m)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l, m) -> (a, (b, c, d, e, f, g), (h, i, j, k, l, m))+ )+ (xpTriple a (xp6Tuple b c d e f g) (xp6Tuple h i j k l m))++xp14Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU m -> PU n -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n)+xp14Tuple a b c d e f g h i j k l m n+ = xpWrap ( \ ((a, b), (c, d, e, f, g, h), (i, j, k, l, m, n)) -> (a, b, c, d, e, f, g, h, i, j, k, l, m, n)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l, m, n) -> ((a, b), (c, d, e, f, g, h), (i, j, k, l, m, n))+ )+ (xpTriple (xpPair a b) (xp6Tuple c d e f g h) (xp6Tuple i j k l m n))++xp15Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU m -> PU n -> PU o ->+ PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)+xp15Tuple a b c d e f g h i j k l m n o+ = xpWrap ( \ ((a, b, c), (d, e, f, g, h, i), (j, k, l, m, n, o)) -> (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) -> ((a, b, c), (d, e, f, g, h, i), (j, k, l, m, n, o))+ )+ (xpTriple (xpTriple a b c) (xp6Tuple d e f g h i) (xp6Tuple j k l m n o))++xp16Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU m -> PU n -> PU o ->+ PU p -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)+xp16Tuple a b c d e f g h i j k l m n o p+ = xpWrap ( \ ((a, b, c, d), (e, f, g, h, i, j), (k, l, m, n, o, p)) -> (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) -> ((a, b, c, d), (e, f, g, h, i, j), (k, l, m, n, o, p))+ )+ (xpTriple (xp4Tuple a b c d) (xp6Tuple e f g h i j) (xp6Tuple k l m n o p))++xp17Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU m -> PU n -> PU o ->+ PU p -> PU q -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)+xp17Tuple a b c d e f g h i j k l m n o p q+ = xpWrap ( \ ((a, b, c, d, e), (f, g, h, i, j, k), (l, m, n, o, p, q)) -> (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) -> ((a, b, c, d, e), (f, g, h, i, j, k), (l, m, n, o, p, q))+ )+ (xpTriple (xp5Tuple a b c d e) (xp6Tuple f g h i j k) (xp6Tuple l m n o p q))++xp18Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU m -> PU n -> PU o ->+ PU p -> PU q -> PU r -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)+xp18Tuple a b c d e f g h i j k l m n o p q r+ = xpWrap ( \ ((a, b, c, d, e, f), (g, h, i, j, k, l), (m, n, o, p, q, r)) -> (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r) -> ((a, b, c, d, e, f), (g, h, i, j, k, l), (m, n, o, p, q, r))+ )+ (xpTriple (xp6Tuple a b c d e f) (xp6Tuple g h i j k l) (xp6Tuple m n o p q r))++xp19Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU m -> PU n -> PU o ->+ PU p -> PU q -> PU r -> PU s -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)+xp19Tuple a b c d e f g h i j k l m n o p q r s+ = xpWrap ( \ (a, (b, c, d, e, f, g), (h, i, j, k, l, m), (n, o, p, q, r, s)) -> (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) -> (a, (b, c, d, e, f, g), (h, i, j, k, l, m), (n, o, p, q, r, s))+ )+ (xp4Tuple a (xp6Tuple b c d e f g) (xp6Tuple h i j k l m) (xp6Tuple n o p q r s))++xp20Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU m -> PU n -> PU o ->+ PU p -> PU q -> PU r -> PU s -> PU t ->+ PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)+xp20Tuple a b c d e f g h i j k l m n o p q r s t+ = xpWrap ( \ ((a, b), (c, d, e, f, g, h), (i, j, k, l, m, n), (o, p, q, r, s, t)) -> (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) -> ((a, b), (c, d, e, f, g, h), (i, j, k, l, m, n), (o, p, q, r, s, t))+ )+ (xp4Tuple (xpPair a b) (xp6Tuple c d e f g h) (xp6Tuple i j k l m n) (xp6Tuple o p q r s t))++xp21Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU m -> PU n -> PU o ->+ PU p -> PU q -> PU r -> PU s -> PU t ->+ PU u -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u)+xp21Tuple a b c d e f g h i j k l m n o p q r s t u+ = xpWrap ( \ ((a, b, c), (d, e, f, g, h, i), (j, k, l, m, n, o), (p, q, r, s, t, u)) -> (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u) -> ((a, b, c), (d, e, f, g, h, i), (j, k, l, m, n, o), (p, q, r, s, t, u))+ )+ (xp4Tuple (xpTriple a b c) (xp6Tuple d e f g h i) (xp6Tuple j k l m n o) (xp6Tuple p q r s t u))++xp22Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU m -> PU n -> PU o ->+ PU p -> PU q -> PU r -> PU s -> PU t ->+ PU u -> PU v -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v)+xp22Tuple a b c d e f g h i j k l m n o p q r s t u v+ = xpWrap ( \ ((a, b, c, d), (e, f, g, h, i, j), (k, l, m, n, o, p), (q, r, s, t, u, v)) -> (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v) -> ((a, b, c, d), (e, f, g, h, i, j), (k, l, m, n, o, p), (q, r, s, t, u, v))+ )+ (xp4Tuple (xp4Tuple a b c d) (xp6Tuple e f g h i j) (xp6Tuple k l m n o p) (xp6Tuple q r s t u v))++xp23Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU m -> PU n -> PU o ->+ PU p -> PU q -> PU r -> PU s -> PU t ->+ PU u -> PU v -> PU w -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w)+xp23Tuple a b c d e f g h i j k l m n o p q r s t u v w+ = xpWrap ( \ ((a, b, c, d, e), (f, g, h, i, j, k), (l, m, n, o, p, q), (r, s, t, u, v, w)) -> (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w) -> ((a, b, c, d, e), (f, g, h, i, j, k), (l, m, n, o, p, q), (r, s, t, u, v, w))+ )+ (xp4Tuple (xp5Tuple a b c d e) (xp6Tuple f g h i j k) (xp6Tuple l m n o p q) (xp6Tuple r s t u v w))++-- | Hopefully no one needs a xp25Tuple++xp24Tuple :: PU a -> PU b -> PU c -> PU d -> PU e ->+ PU f -> PU g -> PU h -> PU i -> PU j ->+ PU k -> PU l -> PU m -> PU n -> PU o ->+ PU p -> PU q -> PU r -> PU s -> PU t ->+ PU u -> PU v -> PU w -> PU x -> PU (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x)+xp24Tuple a b c d e f g h i j k l m n o p q r s t u v w x+ = xpWrap ( \ ((a, b, c, d, e, f), (g, h, i, j, k, l), (m, n, o, p, q, r), (s, t, u, v, w, x)) -> (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x)+ , \ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x) -> ((a, b, c, d, e, f), (g, h, i, j, k, l), (m, n, o, p, q, r), (s, t, u, v, w, x))+ )+ (xp4Tuple (xp6Tuple a b c d e f) (xp6Tuple g h i j k l) (xp6Tuple m n o p q r) (xp6Tuple s t u v w x))++-- ------------------------------------------------------------++ -- | Pickle a string into an XML text node -- -- One of the most often used primitive picklers. Attention:@@ -623,6 +822,10 @@ xpAttr :: String -> PU a -> PU a xpAttr = xpAttrQN . mkName +-- | A text attribute.+xpTextAttr :: String -> PU String+xpTextAttr = flip xpAttr xpText+ -- | Add an optional attribute for an optional value (Maybe a). xpAttrImplied :: String -> PU a -> PU (Maybe a)@@ -692,3 +895,42 @@ xpickle = xpOption xpickle -- ------------------------------------------------------------++-- ------------------------------------------------------------+{-+-- | Extra library functions for HXT.+module Text.XML.HXT.Extras(+ showPickled,+ textAttr,+ xp7Tuple,+ xp8Tuple,+ xp9Tuple,+ xp10Tuple,+ xp11Tuple,+ xp12Tuple,+ xp13Tuple,+ xp14Tuple,+ xp15Tuple,+ xp16Tuple,+ xp17Tuple,+ xp18Tuple,+ xp19Tuple,+ xp20Tuple,+ xp21Tuple,+ xp22Tuple,+ xp23Tuple,+ xp24Tuple+ ) where++import Text.XML.HXT.Arrow++-- | Pickles a value then writes the document to a string.+showPickled :: (XmlPickler a) => Attributes -> a -> String+showPickled a = concat . (pickleDoc xpickle >>> runLA (writeDocumentToString a))++-- | A text attribute.+textAttr :: String -> PU String+textAttr = flip xpAttr xpText+-}+-- ------------------------------------------------------------+
src/Text/XML/HXT/Arrow/ProcessDocument.hs view
@@ -8,7 +8,6 @@ Maintainer : Uwe Schmidt (uwe@fh-wedel.de) Stability : experimental Portability: portable- Version : $Id: ProcessDocument.hs,v 1.3 2006/08/30 16:20:52 hxml Exp $ Compound arrows for reading, parsing, validating and writing XML documents @@ -22,6 +21,7 @@ , parseHtmlDocument , validateDocument , propagateAndValidateNamespaces+ , andValidateNamespaces , getDocumentContents ) where@@ -30,40 +30,39 @@ import Control.Arrow.ArrowList import Control.Arrow.ArrowIf import Control.Arrow.ArrowTree+import Control.Arrow.ListArrow ( fromLA ) import Text.XML.HXT.DOM.Interface+ import Text.XML.HXT.Arrow.XmlArrow-import Text.XML.HXT.Arrow.XmlIOStateArrow+import Text.XML.HXT.Arrow.XmlState+import Text.XML.HXT.Arrow.XmlState.TypeDefs -import Text.XML.HXT.Arrow.ParserInterface- ( parseXmlDoc- , parseHtmlDoc- , parseHtmlTagSoup- , substHtmlEntityRefs- , validateDoc- , transformDoc- )+import Text.XML.HXT.Arrow.ParserInterface ( parseXmlDoc+ , parseHtmlDoc+ , substHtmlEntityRefs+ ) -import Text.XML.HXT.Arrow.Edit- ( transfAllCharRef- )+import Text.XML.HXT.Arrow.Edit ( transfAllCharRef+ ) import Text.XML.HXT.Arrow.GeneralEntitySubstitution- ( processGeneralEntities- )+ ( processGeneralEntities+ ) -import Text.XML.HXT.Arrow.DTDProcessing- ( processDTD- )+import Text.XML.HXT.Arrow.DTDProcessing ( processDTD+ ) -import Text.XML.HXT.Arrow.DocumentInput- ( getXmlContents- )+import Text.XML.HXT.Arrow.DocumentInput ( getXmlContents+ ) -import Text.XML.HXT.Arrow.Namespace- ( propagateNamespaces- , validateNamespaces- )+import Text.XML.HXT.Arrow.Namespace ( propagateNamespaces+ , validateNamespaces+ )+import Text.XML.HXT.DTDValidation.Validation ( validate+ , getDTDSubset+ , transform+ ) -- ------------------------------------------------------------ @@ -87,7 +86,7 @@ -} parseXmlDocument :: Bool -> IOStateArrow s XmlTree XmlTree-parseXmlDocument validate+parseXmlDocument validate' = ( replaceChildren ( ( getAttrValue a_source &&& xshow getChildren@@ -106,7 +105,7 @@ >>> transfAllCharRef >>>- ( if validate+ ( if validate' then validateDocument else this )@@ -129,19 +128,14 @@ -} -parseHtmlDocument :: Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> IOStateArrow s XmlTree XmlTree-parseHtmlDocument withTagSoup withNamespaces warnings preserveCmt removeWhitespace asHtml+parseHtmlDocument :: IOStateArrow s XmlTree XmlTree+parseHtmlDocument = ( perform ( getAttrValue a_source >>> traceValue 1 (("parseHtmlDoc: parse HTML document " ++) . show) ) >>>- replaceChildren ( ( getAttrValue a_source -- get source name- &&&- xshow getChildren- ) -- get string to be parsed- >>>- parseHtml- )+ ( parseHtml $< getSysVar theTagSoup ) >>>- removeWarnings+ ( removeWarnings $< getSysVar (theWarnings .&&&. theTagSoup )+ ) >>> setDocumentStatusFromSystemState "parse HTML document" >>>@@ -156,20 +150,24 @@ ) `when` documentStatusOk where- parseHtml- | withTagSoup = traceMsg 1 ("parse document with tagsoup " ++- ( if asHtml then "HT" else "X" ) ++ "ML parser"- )- >>>- parseHtmlTagSoup withNamespaces warnings preserveCmt removeWhitespace asHtml+ parseHtml withTagSoup'+ | withTagSoup' = withoutUserState $< getSysVar theTagSoupParser -- withoutUserState parseHtmlTagSoup | otherwise = traceMsg 1 ("parse document with parsec HTML parser") >>>- parseHtmlDoc -- run parser+ replaceChildren+ ( ( getAttrValue a_source -- get source name+ &&&+ xshow getChildren+ ) -- get string to be parsed+ >>>+ parseHtmlDoc -- run parser+ ) >>> substHtmlEntityRefs -- substitute entity refs- removeWarnings- | withTagSoup++ removeWarnings (warnings, withTagSoup')+ | withTagSoup' && not warnings = this | otherwise = processTopDownWithAttrl@@ -209,9 +207,11 @@ >>> setDocumentStatusFromSystemState "document validation" >>>+ traceMsg 1 "document validated, transforming doc with respect to DTD"+ >>> transformDoc >>>- traceMsg 1 "document validated"+ traceMsg 1 "document transformed" >>> traceSource >>>@@ -245,7 +245,14 @@ >>> traceDoc "propagating namespaces done" >>>- traceMsg 1 "validating namespaces"+ andValidateNamespaces+ )+ `when`+ documentStatusOk++andValidateNamespaces :: IOStateArrow s XmlTree XmlTree+andValidateNamespaces+ = ( traceMsg 1 "validating namespaces" >>> ( setDocumentStatusFromSystemState "namespace propagation" `when`@@ -269,16 +276,25 @@ For supported protocols see 'Text.XML.HXT.Arrow.DocumentInput.getXmlContents' -} -getDocumentContents :: Attributes -> String -> IOStateArrow s b XmlTree-getDocumentContents options src+getDocumentContents :: String -> IOStateArrow s b XmlTree+getDocumentContents src = root [] [] >>> addAttr a_source src >>>- seqA (map (uncurry addAttr) options) -- add all options to doc root- >>> -- e.g. getXmlContents needs some of these traceMsg 1 ("readDocument: start processing document " ++ show src) >>> getXmlContents++-- ------------------------------------------------------------++validateDoc :: ArrowList a => a XmlTree XmlTree+validateDoc = fromLA ( validate+ `when`+ getDTDSubset -- validate only when DTD decl is present+ )++transformDoc :: ArrowList a => a XmlTree XmlTree+transformDoc = fromLA transform -- ------------------------------------------------------------
src/Text/XML/HXT/Arrow/ReadDocument.hs view
@@ -6,11 +6,10 @@ License : MIT Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : experimental+ Stability : stable Portability: portable- Version : $Id: ReadDocument.hs,v 1.10 2006/11/24 07:41:37 hxml Exp $ -Compound arrows for reading an XML\/HTML document or an XML\/HTML string+ Compound arrows for reading an XML\/HTML document or an XML\/HTML string -} @@ -28,179 +27,167 @@ import Control.Arrow.ListArrows -import Data.Char ( isDigit ) import Text.XML.HXT.DOM.Interface-import Text.XML.HXT.Arrow.XmlArrow-import Text.XML.HXT.Arrow.XmlIOStateArrow +import Text.XML.HXT.Arrow.XmlArrow import Text.XML.HXT.Arrow.Edit ( canonicalizeAllNodes , canonicalizeForXPath , canonicalizeContents , rememberDTDAttrl , removeDocWhiteSpace )- import Text.XML.HXT.Arrow.ParserInterface- import Text.XML.HXT.Arrow.ProcessDocument ( getDocumentContents , parseXmlDocument , parseHtmlDocument , propagateAndValidateNamespaces+ , andValidateNamespaces )--import Text.XML.HXT.RelaxNG.Validator ( validateDocumentWithRelaxSchema )+import Text.XML.HXT.Arrow.XmlState+import Text.XML.HXT.Arrow.XmlState.TypeDefs -- -------------------------------------------------------------+-- {- | the main document input filter -this filter can be configured by an option list, a value of type 'Text.XML.HXT.DOM.TypeDefs.Attributes'--available options:--* 'a_parse_html': use HTML parser, else use XML parser (default)--- 'a_tagsoup' : use light weight and lazy parser based on tagsoup lib--- 'a_parse_by_mimetype' : select the parser by the mime type of the document- (pulled out of the HTTP header). When the mime type is set to \"text\/html\"- the HTML parser (parsec or tagsoup) is taken, when it\'s set to- \"text\/xml\" or \"text\/xhtml\" the XML parser (parsec or tagsoup) is taken.- If the mime type is something else no further processing is performed,- the contents is given back to the application in form of a single text node.- If the default document encoding ('a_encoding') is set to isoLatin1, this even enables processing- of arbitray binary data.--- 'a_validate' : validate document againsd DTD (default), else skip validation--- 'a_relax_schema' : validate document with Relax NG, the options value is the schema URI- this implies using XML parser, no validation against DTD, and canonicalisation--- 'a_check_namespaces' : check namespaces, else skip namespace processing (default)--- 'a_canonicalize' : canonicalize document (default), else skip canonicalization--- 'a_preserve_comment' : preserve comments during canonicalization, else remove comments (default)--- 'a_remove_whitespace' : remove all whitespace, used for document indentation, else skip this step (default)--- 'a_indent' : indent document by inserting whitespace, else skip this step (default)--- 'a_issue_warnings' : issue warnings, when parsing HTML (default), else ignore HTML parser warnings--- 'a_issue_errors' : issue all error messages on stderr (default), or ignore all error messages--- 'a_ignore_encoding_errors': ignore all encoding errors, default is issue all encoding errors--- 'a_ignore_none_xml_contents': ignore document contents of none XML\/HTML documents.- This option can be useful for implementing crawler like applications, e.g. an URL checker.- In those cases net traffic can be reduced.--- 'a_trace' : trace level: values: 0 - 4--- 'a_proxy' : proxy for http access, e.g. www-cache:3128--- 'a_redirect' : automatically follow redirected URIs, default is yes+this filter can be configured by a list of configuration options, a value of type 'Text.XML.HXT.XmlState.TypeDefs.SysConfig' -- 'a_use_curl' : obsolete and ignored, HTTP acccess is always done with curl bindings for libcurl+for all available options see module 'Text.XML.HXT.XmlState.SystemConfig' -- 'a_strict_input' : file input is done strictly using the 'Data.ByteString' input functions. This ensures correct closing of files, especially when working with- the tagsoup parser and not processing the whole input data. Default is off. The @ByteString@ input usually is not faster than the buildin @hGetContents@- for strings.+- @withValidate yes\/no@ :+ switch on\/off DTD validation. Only for XML parsed documents, not for HTML parsing. -- 'a_options_curl' : deprecated but for compatibility reasons still supported.- More options passed to the curl binding.- Instead of using this option to set a whole bunch of options at once for curl- it is recomended to use the @curl-.*@ options syntax described below.+- @withParseHTML yes\/no@ :+ switch on HTML parsing. -- 'a_encoding' : default document encoding ('utf8', 'isoLatin1', 'usAscii', 'iso8859_2', ... , 'iso8859_16', ...).- Only XML, HTML and text documents are decoded,- default decoding for XML\/HTML is utf8, for text iso latin1 (no decoding).- The whole content is returned in a single text node.+- @withParseByMimeType yes\/no@ :+ select XML\/HTML parser by document mime type.+ text\/xml and text\/xhtml are parsed as XML, text\/html as HTML. -- 'a_mime_types' : set the mime type table for file input with given file. The format of this config file must be in the syntax of a debian linux \"mime.types\" config file+- @withCheckNamespaces yes\/no@ :+ Switch on\/off namespace propagation and checking -- 'a_if_modified_since' : read document conditionally, only if the document is newer than the given date and time argument, the contents is delivered,- else just the root node with the meta data is returned. The date and time must be given in "System.Locale.rfc822DateFormat".+- @withInputEncoding <encoding-spec>@ :+ Set default encoding. -- curl options : the HTTP interface with libcurl can be configured with a lot of options. To support these options in an easy way, there is a naming convetion:- Every option, which has the prefix @curl@ and the rest of the name forms an option as described in the curl man page, is passed to the curl binding lib.- See 'Text.XML.HXT.IO.GetHTTPLibCurl.getCont' for examples. Currently most of the options concerning HTTP requests are implemented.+- @withTagSoup@ :+ use light weight and lazy parser based on tagsoup lib.+ This is only available when package hxt-tagsoup is installed and+ 'Text.XML.HXT.TagSoup' is imported -All attributes not evaluated by readDocument are stored in the created document root node for easy access of the various-options in e.g. the input\/output modules+- @withRelaxNG <schema.rng>@ :+ validate document with Relax NG, the parameter is for the schema URI.+ This implies using XML parser, no validation against DTD, and canonicalisation. -If the document name is the empty string or an uri of the form \"stdin:\", the document is read from standard input.+- @withCurl [<curl-option>...]@ :+ Use the libCurl binding for HTTP access.+ This is only available when package hxt-curl is installed and+ 'Text.XML.HXT.Curl' is imported+ +- @withHTTP [<http-option>...]@ :+ Use the Haskell HTTP package for HTTP access.+ This is only available when package hxt-http is installed and+ 'Text.XML.HXT.HTTP' is imported examples: -> readDocument [ ] "test.xml"+> readDocument [] "test.xml" reads and validates a document \"test.xml\", no namespace propagation, only canonicalization is performed -> readDocument [ (a_validate, "0")-> , (a_encoding, isoLatin1)-> , (a_parse_by_mimetype, "1")-> ] "http://localhost/test.php"+> ...+> import Text.XML.HXT.Curl+> ...+>+> readDocument [ withValidate no+> , withInputEncoding isoLatin1+> , withParseByMimeType yes+> , withCurl []+> ] \"http:\/\/localhost\/test.php\" reads document \"test.php\", parses it as HTML or XML depending on the mimetype given from the server, but without validation, default encoding 'isoLatin1'.-+HTTP access is done via libCurl. -> readDocument [ (a_parse_html, "1")-> , (a_encoding, isoLatin1)+> readDocument [ withParseHTML yes+> , withInputEncoding isoLatin1 > ] "" reads a HTML document from standard input, no validation is done when parsing HTML, default encoding is 'isoLatin1',-parsing is done with tagsoup parser, but input is read strictly -> readDocument [ (a_encoding, isoLatin1)-> , (a_mime_type, "/etc/mime.types")-> , (a_tagsoup, "1")-> , (a_strict_input, "1")+> readDocument [ withInputEncoding isoLatin1+> , withValidate no+> , withMimeTypeFile "/etc/mime.types"+> , withStrictInput yes > ] "test.svg" -reads an SVG document from standard input, sets the mime type by looking in the system mimetype config file, default encoding is 'isoLatin1',-parsing is done with the lightweight tagsoup parser, which implies no validation.+reads an SVG document from \"test.svg\", sets the mime type by looking in the system mimetype config file,+default encoding is 'isoLatin1', -> readDocument [ (a_parse_html, "1")-> , (a_proxy, "www-cache:3128")-> , (a_curl, "1")-> , (a_issue_warnings, "0")+> ...+> import Text.XML.HXT.Curl+> import Text.XML.HXT.TagSoup+> ...+>+> readDocument [ withParseHTML yes+> , withTagSoup+> , withProxy "www-cache:3128"+> , withCurl []+> , withWarnings no > ] "http://www.haskell.org/" -reads Haskell homepage with HTML parser ignoring any warnings, with http access via external program curl and proxy \"www-cache\" at port 3128+reads Haskell homepage with HTML parser, ignoring any warnings+(at the time of writing, there were some HTML errors),+with http access via libCurl interface+and proxy \"www-cache\" at port 3128,+parsing is done with tagsoup HTML parser.+This requires packages \"hxt-curl\" and \"hxt-tagsoup\" to be installed -> readDocument [ (a_validate, "1")-> , (a_check_namespace, "1")-> , (a_remove_whitespace, "1")-> , (a_trace, "2")+> readDocument [ withValidate yes+> , withCheckNamespaces yes+> , withRemoveWS yes+> , withTrace 2+> , withHTTP [] > ] "http://www.w3c.org/" -read w3c home page (xhtml), validate and check namespaces, remove whitespace between tags, trace activities with level 2+read w3c home page (xhtml), validate and check namespaces, remove whitespace between tags, trace activities with level 2.+HTTP access is done with Haskell HTTP package for minimal complete examples see 'Text.XML.HXT.Arrow.WriteDocument.writeDocument' and 'runX', the main starting point for running an XML arrow. -} -readDocument :: Attributes -> String -> IOStateArrow s b XmlTree-readDocument userOptions src- = case getTraceLev of- Nothing -> readDocument' userOptions src- Just l -> withTraceLevel l $ readDocument' userOptions src- where- getTraceLev = do- s <- lookup a_trace $ userOptions- if not (null s) && all isDigit s- then return (read s)- else fail "not a number"+readDocument :: SysConfigList -> String -> IOStateArrow s b XmlTree+readDocument config src+ = localSysEnv+ $+ readDocument' config src -readDocument' :: Attributes -> String -> IOStateArrow s b XmlTree-readDocument' userOptions src- = loadMineTypes (lookup1 a_mime_types userOptions)+readDocument' :: SysConfigList -> String -> IOStateArrow s b XmlTree+readDocument' config src+ = configSysVars config >>>- getDocumentContents options src+ readD $< getSysVar theWithCache+ where+ readD True = constA undefined -- just for generalizing the signature to: IOStateArrow s b XmlTree+ >>> -- instead of IOStateArrow s XmlTree XmlTree+ (withoutUserState $< (getSysVar theCacheRead >>^ ($ src)))+ readD False = readDocument'' src++readDocument'' :: String -> IOStateArrow s b XmlTree+readDocument'' src+ = getDocumentContents src >>>- ( processDoc $< getMimeType )+ ( processDoc+ $<<+ ( getMimeType+ &&&+ getSysVar (theParseByMimeType .&&&.+ theParseHTML .&&&.+ theAcceptedMimeTypes .&&&.+ theRelaxValidate+ )+ )+ ) >>> traceMsg 1 ("readDocument: " ++ show src ++ " processed") >>>@@ -208,48 +195,40 @@ >>> traceTree where- options- = addEntries userOptions defaultOptions-- defaultOptions- = [ ( a_parse_html, v_0 )- , ( a_tagsoup, v_0 )- , ( a_strict_input, v_0 )- , ( a_validate, v_1 )- , ( a_issue_warnings, v_1 )- , ( a_check_namespaces, v_0 )- , ( a_canonicalize, v_1 )- , ( a_preserve_comment, v_0 )- , ( a_remove_whitespace, v_0 )- , ( a_parse_by_mimetype, v_0 )- , ( a_ignore_encoding_errors, v_0 )- , ( a_ignore_none_xml_contents, v_0 )- , ( a_accept_mimetypes, "" )- ]-- loadMineTypes "" = this- loadMineTypes f = setMimeTypeTableFromFile f- getMimeType = getAttrValue transferMimeType >>^ stringToLower - processDoc mimeType+ processDoc mimeType (parseByMimeType, (parseHtml, (acceptedMimeTypes, validateWithRelax))) = traceMsg 1 (unwords [ "readDocument:", show src , "(mime type:", show mimeType, ") will be processed"]) >>>- ( if isAcceptedMimeType (lookup1 a_accept_mimetypes options) mimeType+ ( if isAcceptedMimeType acceptedMimeTypes mimeType then ( ifA (fromLA hasEmptyBody) ( replaceChildren none ) -- empty response, e.g. in if-modified-since request- ( parse+ ( ( parse $< getSysVar (theValidate .&&&.+ theIgnoreNoneXmlContents .&&&.+ theTagSoup+ )+ ) >>> ( if isXmlOrHtml- then ( checknamespaces+ then ( ( checknamespaces $< getSysVar (theCheckNamespaces .&&&.+ theTagSoup+ )+ ) >>> rememberDTDAttrl >>>- canonicalize+ ( canonicalize $< getSysVar (thePreserveComment .&&&.+ theCanonicalize .&&&.+ theTagSoup+ )+ ) >>>- whitespace+ ( whitespace $< getSysVar (theRemoveWS .&&&.+ theTagSoup+ )+ ) >>> relax )@@ -272,7 +251,7 @@ ( getChildren >>> isWhiteSpace ) ) - isAcceptedMimeType :: String -> String -> Bool+ isAcceptedMimeType :: [String] -> String -> Bool isAcceptedMimeType mts mt | null mts ||@@ -280,9 +259,7 @@ | otherwise = foldr (matchMt mt') False $ mts' where mt' = parseMt mt- mts' = words- >>>- map parseMt+ mts' = map parseMt $ mts parseMt = break (== '/')@@ -293,75 +270,73 @@ (mi == mis || mis == "*") ) || r- parse+ parse (validate, (removeNoneXml, withTagSoup'))+ | not isXmlOrHtml = if removeNoneXml+ then replaceChildren none -- don't parse, if mime type is not XML nor HTML+ else this -- but remove contents when option is set+ | isHtml- ||- withTagSoup = parseHtmlDocument -- parse as HTML or with tagsoup XML- withTagSoup- withNamespaces- issueW- (not (hasOption a_canonicalize) && preserveCmt)- removeWS- isHtml- | validateWithRelax = parseXmlDocument False -- for Relax NG use XML parser without validation- | isXml = parseXmlDocument validate -- parse as XML- | removeNoneXml = replaceChildren none -- don't parse, if mime type is not XML nor HTML- | otherwise = this -- but remove contents when option is set- checknamespaces- | (withNamespaces && not withTagSoup)+ ||+ withTagSoup' = configSysVar (setS theLowerCaseNames isHtml)+ >>>+ parseHtmlDocument -- parse as HTML or with tagsoup XML++ | isXml = parseXmlDocument (not validateWithRelax && validate) -- parse as XML+ | otherwise = this -- suppress warning++ checknamespaces (withNamespaces, withTagSoup')+ | withNamespaces+ &&+ withTagSoup' = andValidateNamespaces -- propagation is done in tagsoup++ | withNamespaces ||- validateWithRelax = propagateAndValidateNamespaces+ validateWithRelax = propagateAndValidateNamespaces -- RelaxNG requires correct namespaces+ | otherwise = this- canonicalize- | withTagSoup = this -- tagsoup already removes redundant stuff++ canonicalize (preserveCmt, (canonicalize', withTagSoup'))+ | withTagSoup' = this -- tagsoup already removes redundant stuff | validateWithRelax = canonicalizeAllNodes- | hasOption a_canonicalize+ | canonicalize' && preserveCmt = canonicalizeForXPath- | hasOption a_canonicalize = canonicalizeAllNodes+ | canonicalize' = canonicalizeAllNodes | otherwise = this+ relax- | validateWithRelax = validateDocumentWithRelaxSchema options relaxSchema+ | validateWithRelax = withoutUserState $< getSysVar theRelaxValidator | otherwise = this- whitespace++ whitespace (removeWS, withTagSoup') | removeWS &&- not withTagSoup = removeDocWhiteSpace -- tagsoup already removes whitespace+ not withTagSoup' = removeDocWhiteSpace -- tagsoup already removes whitespace | otherwise = this- validateWithRelax = hasEntry a_relax_schema options- relaxSchema = lookup1 a_relax_schema options- parseHtml = hasOption a_parse_html- isHtml = parseHtml -- force HTML- ||- ( parseByMimeType && isHtmlMimeType mimeType )- isXml = ( not parseByMimeType && not parseHtml )- ||- ( parseByMimeType- &&- ( isXmlMimeType mimeType- ||- null mimeType- ) -- mime type is XML or not known- )++ isHtml = ( not parseByMimeType && parseHtml ) -- force HTML+ ||+ ( parseByMimeType && isHtmlMimeType mimeType )++ isXml = ( not parseByMimeType && not parseHtml )+ ||+ ( parseByMimeType+ &&+ ( isXmlMimeType mimeType+ ||+ null mimeType+ ) -- mime type is XML or not known+ )+ isXmlOrHtml = isHtml || isXml- parseByMimeType = hasOption a_parse_by_mimetype- validate = hasOption a_validate- withNamespaces = hasOption a_check_namespaces- withTagSoup = hasOption a_tagsoup- issueW = hasOption a_issue_warnings- removeWS = hasOption a_remove_whitespace- preserveCmt = hasOption a_preserve_comment- removeNoneXml = hasOption a_ignore_none_xml_contents- hasOption n = optionIsSet n options -- ------------------------------------------------------------ -- | -- the arrow version of 'readDocument', the arrow input is the source URI -readFromDocument :: Attributes -> IOStateArrow s String XmlTree-readFromDocument userOptions- = applyA ( arr $ readDocument userOptions )+readFromDocument :: SysConfigList -> IOStateArrow s String XmlTree+readFromDocument config = applyA ( arr $ readDocument config ) -- ------------------------------------------------------------ @@ -373,18 +348,19 @@ -- -- Default encoding: No encoding is done, the String argument is taken as Unicode string -readString :: Attributes -> String -> IOStateArrow s b XmlTree-readString userOptions content- = readDocument ( (a_encoding, unicodeString) : userOptions ) (stringProtocol ++ content)+readString :: SysConfigList -> String -> IOStateArrow s b XmlTree+readString config content+ = readDocument (withInputEncoding unicodeString : config)+ (stringProtocol ++ content) -- ------------------------------------------------------------ -- | -- the arrow version of 'readString', the arrow input is the source URI -readFromString :: Attributes -> IOStateArrow s String XmlTree-readFromString userOptions- = applyA ( arr $ readString userOptions )+readFromString :: SysConfigList -> IOStateArrow s String XmlTree+readFromString config+ = applyA ( arr $ readString config ) -- ------------------------------------------------------------
src/Text/XML/HXT/Arrow/WriteDocument.hs view
@@ -17,6 +17,7 @@ module Text.XML.HXT.Arrow.WriteDocument ( writeDocument+ , writeDocument' , writeDocumentToString , prepareContents )@@ -28,9 +29,13 @@ import Control.Arrow.ArrowTree import Text.XML.HXT.DOM.Interface-import Text.XML.HXT.Arrow.XmlArrow-import Text.XML.HXT.Arrow.XmlIOStateArrow +import Text.XML.HXT.Arrow.XmlArrow+import Text.XML.HXT.Arrow.XmlState+import Text.XML.HXT.Arrow.XmlState.TypeDefs+import Text.XML.HXT.Arrow.XmlState.RunIOStateArrow+ ( initialSysState+ ) import Text.XML.HXT.Arrow.Edit ( escapeHtmlDoc , escapeXmlDoc , haskellRepOfXmlDoc@@ -40,13 +45,13 @@ , removeDocWhiteSpace , treeRepOfXmlDoc )- import Text.XML.HXT.Arrow.DocumentOutput ( putXmlDocument , encodeDocument , encodeDocument' ) -- ------------------------------------------------------------+-- {- | the main filter for writing documents@@ -57,38 +62,39 @@ if @ destination @ is the empty string or \"-\", stdout is used as output device -available options are+for available options see 'Text.XML.HXT.Arrow.XmlState.SystemConfig' -* 'a_indent' : indent document for readability, (default: no indentation) -- 'a_remove_whitespace' : remove all redundant whitespace for shorten text (default: no removal)--- 'a_output_encoding' : encoding of document, default is 'a_encoding' or 'utf8'--- 'a_output_xml' : (default) issue XML: quote special XML chars \>,\<,\",\',& where neccessary+- @withOutputXML@ :+ (default) issue XML: quote special XML chars \>,\<,\",\',& where neccessary add XML processing instruction- and encode document with respect to 'a_output_encoding',- if explicitly switched of, the plain text is issued, this is useful- for non XML output, e.g. generated Haskell code, LaTex, Java, ...+ and encode document with respect to output encoding, -- 'a_output_html' : issue XHTML: quote alle XML chars, use HTML entity refs or char refs for none ASCII chars+- @withOutputHTML@ :+ issue HTML: translate all special XML chars and all HTML chars with a corresponding entity reference+ into entity references. Do not generate empty elements, e.g. @<script .../>@ for HTML elements, that are allowed+ to contain a none empty body. Result is for the example is @<script ...></script>@.+ The short form introduces trouble in various browsers. -- 'a_no_empty_elements' : do not write the short form \<name .../\> for empty elements. When 'a_output_html' is set,- the always empty HTML elements are still written in short form, but not the others, as e.g. the script element.- Empty script elements, like \<script href=\"...\"/\>, are always a problem for firefox and others.- When XML output is generated with this option, all empty elements are written in the long form.+- @withOutputXHTML@ :+ same as @withOutputHTML@, but all none ASCII chars are substituted by char references. -- 'a_no_empty_elem_for' : do not generate empty elements for the element names given in the comma separated list of this option value.- This option overwrites the above described 'a_no_empty_elements' option+- @withOutputPLAIN@ :+ Do not substitute any chars. This is useful when generating something else than XML/HTML, e.g. Haskell source code. -- 'a_add_default_dtd' : if the document to be written was build by reading another document containing a Document Type Declaration,- this DTD is inserted into the output document (default: no insert)+- @withXmlPi yes/no@ :+ Add a @<?xml version=... encoding=... ?>@ processing instruction to the beginning of the document.+ Default is yes. -- 'a_no_xml_pi' : suppress generation of \<?xml ... ?\> processing instruction+- @withAddDefaultDTD@ :+ if the document to be written was build by reading another document containing a Document Type Declaration,+ this DTD is inserted into the output document (default: no insert) -- 'a_show_tree' : show tree representation of document (for debugging)+- @withShowTree yes/no@ :+ show DOM tree representation of document (for debugging) -- 'a_show_haskell' : show Haskell representaion of document (for debugging)+- @withShowHaskell yes/no@ :+ show Haskell representaion of document (for debugging) a minimal main program for copying a document has the following structure:@@ -96,7 +102,7 @@ > module Main > where >-> import Text.XML.HXT.Arrow+> import Text.XML.HXT.Core > > main :: IO () > main@@ -107,46 +113,66 @@ > ) > return () -an example for copying a document to standard output with tracing and evaluation of+an example for copying a document from the web to standard output with global trace level 1, input trace level 2,+output encoding isoLatin1,+and evaluation of error code is: > module Main > where >-> import Text.XML.HXT.Arrow+> import Text.XML.HXT.Core+> import Text.XML.HXT.Curl+> -- or+> -- import Text.XML.HXT.HTTP > import System.Exit > > main :: IO () > main > = do-> [rc] <- runX ( readDocument [ (a_trace, "1")-> ] "hello.xml"-> >>>-> writeDocument [ (a_output_encoding, isoLatin1)-> ] "-" -- output to stdout-> >>>-> getErrStatus-> )+> [rc] <- runX+> ( configSysVars [ withTrace 1 -- set the defaults for all read-,+> , withCurl [] -- write- and other operations+> -- or withHTTP []+> ]+> >>>+> readDocument [ withTrace 2 -- use these additional+> , withParseHTML yes -- options only for this read+> ]+> "http://www.haskell.org/"+> >>>+> writeDocument [ withOutputEncoding isoLatin1+> ]+> "" -- output to stdout+> >>>+> getErrStatus+> ) > exitWith ( if rc >= c_err > then ExitFailure 1 > else ExitSuccess > ) -} -writeDocument :: Attributes -> String -> IOStateArrow s XmlTree XmlTree-writeDocument userOptions dst- = perform ( traceMsg 1 ("writeDocument: destination is " ++ show dst)- >>>- prepareContents userOptions encodeDocument- >>>- putXmlDocument textMode dst- >>>- traceMsg 1 "writeDocument: finished"- )+writeDocument :: SysConfigList -> String -> IOStateArrow s XmlTree XmlTree+writeDocument config dst+ = localSysEnv+ $+ configSysVars config+ >>>+ perform ( (flip writeDocument') dst $< getSysVar theTextMode )++writeDocument' :: Bool -> String -> IOStateArrow s XmlTree XmlTree+writeDocument' textMode dst+ = ( traceMsg 1 ("writeDocument: destination is " ++ show dst)+ >>>+ ( (flip prepareContents) encodeDocument $< getSysVar idS )+ >>>+ putXmlDocument textMode dst+ >>>+ traceMsg 1 "writeDocument: finished"+ ) `when` documentStatusOk- where- textMode = optionIsSet a_text_mode userOptions -- ------------------------------------------------------------ @@ -154,7 +180,7 @@ -- Convert a document into a string. Formating is done the same way -- and with the same options as in 'writeDocument'. Default output encoding is -- no encoding, that means the result is a normal unicode encode haskell string.--- The default may be overwritten with the 'Text.XML.HXT.XmlKeywords.a_output_encoding' option.+-- The default may be overwritten with the 'Text.XML.HXT.Arrow.XmlState.SystemConfig.withOutputEncoding' option. -- The XML PI can be suppressed by the 'Text.XML.HXT.XmlKeywords.a_no_xml_pi' option. -- -- This arrow fails, when the encoding scheme is not supported.@@ -162,13 +188,13 @@ -- The XML PI is suppressed, if not explicitly turned on with an -- option @ (a_no_xml_pi, v_0) @ -writeDocumentToString :: ArrowXml a => Attributes -> a XmlTree String-writeDocumentToString userOptions- = prepareContents ( addEntries- userOptions- [ (a_output_encoding, unicodeString)- , (a_no_xml_pi, v_1)- ]+writeDocumentToString :: ArrowXml a => SysConfigList -> a XmlTree String+writeDocumentToString config+ = prepareContents ( foldr (>>>) id (withOutputEncoding unicodeString :+ withXmlPi no :+ config+ )+ $ initialSysState ) encodeDocument' >>> xshow getChildren@@ -178,70 +204,59 @@ -- | -- indent and format output -prepareContents :: ArrowXml a => Attributes -> (Bool -> String -> a XmlTree XmlTree) -> a XmlTree XmlTree-prepareContents userOptions encodeDoc+prepareContents :: ArrowXml a => XIOSysState -> (Bool -> String -> a XmlTree XmlTree) -> a XmlTree XmlTree+prepareContents config encodeDoc = indent >>> addDtd >>> format where- formatEmptyElems- | not (null noEmptyElemFor) = preventEmptyElements noEmptyElemFor- | hasOption a_no_empty_elements- ||- hasOption a_output_xhtml = preventEmptyElements []- | otherwise = const this+ indent' = getS theIndent config+ removeWS' = getS theRemoveWS config+ showTree' = getS theShowTree config+ showHaskell' = getS theShowHaskell config+ outHtml' = getS theOutputFmt config == HTMLoutput+ outXhtml' = getS theOutputFmt config == XHTMLoutput+ outXml' = getS theOutputFmt config == XMLoutput+ noPi' = not $ getS theXmlPi config+ noEEsFor' = getS theNoEmptyElemFor config+ addDDTD' = getS theAddDefaultDTD config+ outEnc' = getS theOutputEncoding config+ addDtd- | hasOption a_add_default_dtd = addDefaultDTDecl+ | addDDTD' = addDefaultDTDecl | otherwise = this indent- | hasOption a_indent = indentDoc -- document indentation- | hasOption a_remove_whitespace = removeDocWhiteSpace -- remove all whitespace between tags+ | indent' = indentDoc -- document indentation+ | removeWS' = removeDocWhiteSpace -- remove all whitespace between tags | otherwise = this format- | hasOption a_show_tree = treeRepOfXmlDoc- | hasOption a_show_haskell = haskellRepOfXmlDoc- | hasOption a_output_html = formatEmptyElems True+ | showTree' = treeRepOfXmlDoc+ | showHaskell' = haskellRepOfXmlDoc+ | outHtml' = preventEmptyElements noEEsFor' True >>> escapeHtmlDoc -- escape al XML and HTML chars >= 128 >>> encodeDoc -- convert doc into text with respect to output encoding with ASCII as default- suppressXmlPi ( lookupDef usAscii a_output_encoding options )- | hasOption a_output_xml = formatEmptyElems (hasOption a_output_xhtml)+ noPi' ( if null outEnc' then usAscii else outEnc' )++ | outXhtml' = preventEmptyElements noEEsFor' True >>> escapeXmlDoc -- escape lt, gt, amp, quot, >>> encodeDoc -- convert doc into text with respect to output encoding- suppressXmlPi ( lookupDef "" a_output_encoding options )+ noPi' outEnc'+ | outXml' = ( if null noEEsFor'+ then this+ else preventEmptyElements noEEsFor' False+ )+ >>>+ escapeXmlDoc -- escape lt, gt, amp, quot,+ >>>+ encodeDoc -- convert doc into text with respect to output encoding+ noPi' outEnc' | otherwise = this-- suppressXmlPi -- remove <?xml ... ?> when set- = hasOption a_no_xml_pi-- noEmptyElemFor- = words- . map (\ c -> if c == ',' then ' ' else c)- . lookup1 a_no_empty_elem_for- $ options-- hasOption n- = optionIsSet n options-- options = addEntries- userOptions- [ ( a_indent, v_0 )- , ( a_remove_whitespace, v_0 )- , ( a_output_xml, v_1 )- , ( a_show_tree, v_0 )- , ( a_show_haskell, v_0 )- , ( a_output_html, v_0 )- , ( a_output_xhtml, v_0 )- , ( a_no_xml_pi, v_0 )- , ( a_no_empty_elements, v_0 )- , ( a_no_empty_elem_for, "" )- , ( a_add_default_dtd, v_0 )- ] -- ------------------------------------------------------------
src/Text/XML/HXT/Arrow/XmlArrow.hs view
@@ -31,11 +31,10 @@ import Control.Arrow.IOListArrow import Control.Arrow.IOStateListArrow +import Data.Char.Properties.XMLCharProps ( isXmlSpaceChar ) import Data.Maybe import Text.XML.HXT.DOM.Interface-import Text.XML.HXT.DOM.Unicode ( isXmlSpaceChar- ) import qualified Text.XML.HXT.DOM.XmlNode as XN import qualified Text.XML.HXT.DOM.ShowXml as XS
− src/Text/XML/HXT/Arrow/XmlIOStateArrow.hs
@@ -1,989 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.Arrow.XmlIOStateArrow- Copyright : Copyright (C) 2010 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : stable- Portability: portable-- the basic state arrows for XML processing-- A state is needed for global processing options,- like encoding options, document base URI, trace levels- and error message handling-- The state is separated into a user defined state- and a system state. The system state contains variables- for error message handling, for tracing, for the document base- for accessing XML documents with relative references, e.g. DTDs,- and a global key value store. This assoc list has strings as keys- and lists of XmlTrees as values. It is used to store arbitrary- XML and text values, e.g. user defined global options.-- The user defined part of the store is in the default case empty, defined as ().- It can be extended with an arbitray data type---}---- --------------------------------------------------------------module Text.XML.HXT.Arrow.XmlIOStateArrow- ( -- * Data Types- XIOState(..),- XIOSysState(..),- IOStateArrow,- IOSArrow,-- -- * Running Arrows- initialState,- initialSysState,- runX,-- -- * User State Manipulation- getUserState,- setUserState,- changeUserState,- withExtendedUserState,- withOtherUserState,-- -- * Global System State Access- getSysParam,- changeSysParam,-- setParamList,- setParam,- unsetParam,- getParam,- getAllParams,- getAllParamsString,- setParamString,- getParamString,- setParamInt,- getParamInt,-- -- * Error Message Handling- clearErrStatus,- setErrStatus,- getErrStatus,- setErrMsgStatus,- setErrorMsgHandler,-- errorMsgStderr,- errorMsgCollect,- errorMsgStderrAndCollect,- errorMsgIgnore,-- getErrorMessages,-- filterErrorMsg,- issueWarn,- issueErr,- issueFatal,- setDocumentStatus,- setDocumentStatusFromSystemState,- documentStatusOk,-- -- * Document Base- setBaseURI,- getBaseURI,- changeBaseURI,- setDefaultBaseURI,- getDefaultBaseURI,- runInLocalURIContext,-- -- * Tracing- setTraceLevel,- getTraceLevel,- withTraceLevel,- setTraceCmd,- getTraceCmd,- trace,- traceMsg,- traceValue,- traceString,- traceSource,- traceTree,- traceDoc,- traceState,-- -- * URI Manipulation- expandURIString,- expandURI,- mkAbsURI,-- getFragmentFromURI,- getPathFromURI,- getPortFromURI,- getQueryFromURI,- getRegNameFromURI,- getSchemeFromURI,- getUserInfoFromURI,-- -- * Mime Type Handling- setMimeTypeTable,- setMimeTypeTableFromFile- )-where--import Control.Arrow -- arrow classes-import Control.Arrow.ArrowList-import Control.Arrow.ArrowIf-import Control.Arrow.ArrowTree-import Control.Arrow.ArrowIO-import Control.Arrow.IOStateListArrow--import Control.Monad ( mzero- , mplus )-import Control.DeepSeq--import Text.XML.HXT.DOM.Interface-import Text.XML.HXT.Arrow.XmlArrow--import Text.XML.HXT.Arrow.Edit ( addHeadlineToXmlDoc- , treeRepOfXmlDoc- , indentDoc- )--import Data.Maybe--import Network.URI ( URI- , escapeURIChar- , isUnescapedInURI- , nonStrictRelativeTo- , parseURIReference- , uriAuthority- , uriFragment- , uriPath- , uriPort- , uriQuery- , uriRegName- , uriScheme- , uriUserInfo- )--import System.IO ( hPutStrLn- , hFlush- , stderr- )--import System.Directory ( getCurrentDirectory )---- -------------------------------------------------------------{- $datatypes -}----- |--- predefined system state data type with all components for the--- system functions, like trace, error handling, ...--data XIOSysState = XIOSys { xio_trace :: ! Int- , xio_traceCmd :: Int -> String -> IO ()- , xio_errorStatus :: ! Int- , xio_errorModule :: ! String- , xio_errorMsgHandler :: String -> IO ()- , xio_errorMsgCollect :: ! Bool- , xio_errorMsgList :: ! XmlTrees- , xio_baseURI :: ! String- , xio_defaultBaseURI :: ! String- , xio_attrList :: ! (AssocList String XmlTrees)- , xio_mimeTypes :: MimeTypeTable- }--instance NFData XIOSysState where- rnf (XIOSys tr _trc es em _emh emc eml bu du al _mt)- = rnf tr `seq` rnf es `seq` rnf em `seq` rnf emc `seq` rnf eml `seq` rnf bu `seq` rnf du `seq` rnf al---- |--- state datatype consists of a system state and a user state--- the user state is not fixed--data XIOState us = XIOState { xio_sysState :: ! XIOSysState- , xio_userState :: ! us- }--instance (NFData us) => NFData (XIOState us) where- rnf (XIOState sys usr) = rnf sys `seq` rnf usr---- |--- The arrow type for stateful arrows--type IOStateArrow s b c = IOSLA (XIOState s) b c---- |--- The arrow for stateful arrows with no user defined state--type IOSArrow b c = IOStateArrow () b c---- ----------------------------------------------------------------- | the default global state, used as initial state when running an 'IOSArrow' with 'runIOSLA' or--- 'runX'--initialState :: us -> XIOState us-initialState s = XIOState { xio_sysState = initialSysState- , xio_userState = s- }--initialSysState :: XIOSysState-initialSysState = XIOSys { xio_trace = 0- , xio_traceCmd = traceOutputToStderr- , xio_errorStatus = c_ok- , xio_errorModule = ""- , xio_errorMsgHandler = hPutStrLn stderr- , xio_errorMsgCollect = False- , xio_errorMsgList = []- , xio_baseURI = ""- , xio_defaultBaseURI = ""- , xio_attrList = []- , xio_mimeTypes = defaultMimeTypeTable- }---- ---------------------------------------------------------------- |--- apply an 'IOSArrow' to an empty root node with 'initialState' () as initial state------ the main entry point for running a state arrow with IO------ when running @ runX f@ an empty XML root node is applied to @f@.--- usually @f@ will start with a constant arrow (ignoring the input), e.g. a 'Text.XML.HXT.Arrow.ReadDocument.readDocument' arrow.------ for usage see examples with 'Text.XML.HXT.Arrow.WriteDocument.writeDocument'------ if input has to be feed into the arrow use 'Control.Arrow.IOStateListArrow.runIOSLA' like in @ runIOSLA f emptyX inputDoc @--runX :: IOSArrow XmlTree c -> IO [c]-runX = runXIOState (initialState ())--runXIOState :: XIOState s -> IOStateArrow s XmlTree c -> IO [c]-runXIOState s0 f- = do- (_finalState, res) <- runIOSLA (emptyRoot >>> f) s0 undefined- return res- where- emptyRoot = root [] []---- --------------------------------------------------------------{- user state -}---- | read the user defined part of the state--getUserState :: IOStateArrow s b s-getUserState- = IOSLA $ \ s _ ->- return (s, [xio_userState s])---- | change the user defined part of the state--changeUserState :: (b -> s -> s) -> IOStateArrow s b b-changeUserState cf- = IOSLA $ \ s v ->- let s' = s { xio_userState = cf v (xio_userState s) }- in return (s', [v])---- | set the user defined part of the state--setUserState :: IOStateArrow s s s-setUserState- = changeUserState const---- | extend user state------ Run an arrow with an extended user state component, The old component--- is stored together with a new one in a pair, the arrow is executed with this--- extended state, and the augmented state component is removed form the state--- when the arrow has finished its execution--withExtendedUserState :: s1 -> IOStateArrow (s1, s0) b c -> IOStateArrow s0 b c-withExtendedUserState initS1 f- = IOSLA $ \ s0 x ->- do- ~(finalS, res) <- runIOSLA f ( XIOState { xio_sysState = xio_sysState s0- , xio_userState = (initS1, xio_userState s0)- }- ) x- return ( XIOState { xio_sysState = xio_sysState finalS- , xio_userState = snd (xio_userState finalS)- }- , res- )---- | change the type of user state------ This conversion is useful, when running a state arrow with another--- structure of the user state, e.g. with () when executing some IO arrows--withOtherUserState :: s1 -> IOStateArrow s1 b c -> IOStateArrow s0 b c-withOtherUserState s1 f- = IOSLA $ \ s x ->- do- (s', res) <- runIOSLA f ( XIOState { xio_sysState = xio_sysState s- , xio_userState = s1- }- ) x- return ( XIOState { xio_sysState = xio_sysState s'- , xio_userState = xio_userState s- }- , res- )---- --------------------------------------------------------------{- $system state params -}--getSysParam :: (XIOSysState -> c) -> IOStateArrow s b c-getSysParam f- = IOSLA $ \ s _x ->- return (s, (:[]) . f . xio_sysState $ s)--changeSysParam :: (b -> XIOSysState -> XIOSysState) -> IOStateArrow s b b-changeSysParam cf- = ( IOSLA $ \ s v ->- let s' = changeSysState (cf v) s- in return (s', [v])- )- where- changeSysState css s = s { xio_sysState = css (xio_sysState s) }---- | store a single XML tree in global state under a given attribute name--setParam :: String -> IOStateArrow s XmlTree XmlTree-setParam n- = (:[]) ^>> setParamList n---- | store a list of XML trees in global system state under a given attribute name--setParamList :: String -> IOStateArrow s XmlTrees XmlTree-setParamList n- = changeSysParam addE- >>>- arrL id- where- addE x s = s { xio_attrList = addEntry n x (xio_attrList s) }---- | remove an entry in global state, arrow input remains unchanged--unsetParam :: String -> IOStateArrow s b b-unsetParam n- = changeSysParam delE- where- delE _ s = s { xio_attrList = delEntry n (xio_attrList s) }---- | read an attribute value from global state--getParam :: String -> IOStateArrow s b XmlTree-getParam n- = getAllParams- >>>- arrL (lookup1 n)---- | read all attributes from global state--getAllParams :: IOStateArrow s b (AssocList String XmlTrees)-getAllParams- = getSysParam xio_attrList---- | read all attributes from global state--- and convert the values to strings--getAllParamsString :: IOStateArrow s b (AssocList String String)-getAllParamsString- = getAllParams- >>>- listA ( unlistA- >>>- second (xshow unlistA)- )--setParamString :: String -> String -> IOStateArrow s b b-setParamString n v- = perform ( txt v- >>>- setParam n- )---- | read a string value from global state,--- if parameter not set \"\" is returned--getParamString :: String -> IOStateArrow s b String-getParamString n- = xshow (getParam n)---- | store an int value in global state--setParamInt :: String -> Int -> IOStateArrow s b b-setParamInt n v- = setParamString n (show v)---- | read an int value from global state------ > getParamInt 0 myIntAttr--getParamInt :: Int -> String -> IOStateArrow s b Int-getParamInt def n- = getParamString n- >>^- (\ x -> if null x then def else read x)---- ---------------------------------------------------------------- | reset global error variable--changeErrorStatus :: (Int -> Int -> Int) -> IOStateArrow s Int Int-changeErrorStatus f- = changeSysParam (\ l s -> s { xio_errorStatus = f l (xio_errorStatus s) })--clearErrStatus :: IOStateArrow s b b-clearErrStatus- = perform (constA 0 >>> changeErrorStatus min)---- | set global error variable--setErrStatus :: IOStateArrow s Int Int-setErrStatus- = changeErrorStatus max---- | read current global error status--getErrStatus :: IOStateArrow s XmlTree Int-getErrStatus- = getSysParam xio_errorStatus---- | raise the global error status level to that of the input tree--setErrMsgStatus :: IOStateArrow s XmlTree XmlTree-setErrMsgStatus- = perform ( getErrorLevel- >>>- setErrStatus- )---- | set the error message handler and the flag for collecting the errors--setErrorMsgHandler :: Bool -> (String -> IO ()) -> IOStateArrow s b b-setErrorMsgHandler c f- = changeSysParam cf- where- cf _ s = s { xio_errorMsgHandler = f- , xio_errorMsgCollect = c }---- | error message handler for output to stderr--sysErrorMsg :: IOStateArrow s XmlTree XmlTree-sysErrorMsg- = perform ( getErrorLevel &&& getErrorMsg- >>>- arr formatErrorMsg- >>>- ( IOSLA $ \ s e ->- do- (xio_errorMsgHandler . xio_sysState $ s) e- return (s, undefined)- )- )- where- formatErrorMsg (level, msg) = "\n" ++ errClass level ++ ": " ++ msg- errClass l- = fromMaybe "fatal error" . lookup l $ msgList- where- msgList = [ (c_ok, "no error")- , (c_warn, "warning")- , (c_err, "error")- , (c_fatal, "fatal error")- ]----- | the default error message handler: error output to stderr--errorMsgStderr :: IOStateArrow s b b-errorMsgStderr = setErrorMsgHandler False (hPutStrLn stderr)---- | error message handler for collecting errors--errorMsgCollect :: IOStateArrow s b b-errorMsgCollect = setErrorMsgHandler True (const $ return ())---- | error message handler for output to stderr and collecting--errorMsgStderrAndCollect :: IOStateArrow s b b-errorMsgStderrAndCollect = setErrorMsgHandler True (hPutStrLn stderr)---- | error message handler for ignoring errors--errorMsgIgnore :: IOStateArrow s b b-errorMsgIgnore = setErrorMsgHandler False (const $ return ())---- |--- if error messages are collected by the error handler for--- processing these messages by the calling application,--- this arrow reads the stored messages and clears the error message store--getErrorMessages :: IOStateArrow s b XmlTree-getErrorMessages- = getSysParam (reverse . xio_errorMsgList) -- reverse the list of errors- >>>- clearErrorMsgList -- clear the error list in the system state- >>>- arrL id--clearErrorMsgList :: IOStateArrow s b b-clearErrorMsgList- = changeSysParam (\ _ s -> s { xio_errorMsgList = [] } )--addToErrorMsgList :: IOStateArrow s XmlTree XmlTree-addToErrorMsgList- = changeSysParam cf- where- cf t s = if xio_errorMsgCollect s- then s { xio_errorMsgList = t : xio_errorMsgList s }- else s---- ---------------------------------------------------------------- |--- filter error messages from input trees and issue errors--filterErrorMsg :: IOStateArrow s XmlTree XmlTree-filterErrorMsg- = ( setErrMsgStatus- >>>- sysErrorMsg- >>>- addToErrorMsgList- >>>- none- )- `when`- isError---- | generate a warnig message--issueWarn :: String -> IOStateArrow s b b-issueWarn msg = perform (warn msg >>> filterErrorMsg)---- | generate an error message-issueErr :: String -> IOStateArrow s b b-issueErr msg = perform (err msg >>> filterErrorMsg)---- | generate a fatal error message, e.g. document not found--issueFatal :: String -> IOStateArrow s b b-issueFatal msg = perform (fatal msg >>> filterErrorMsg)---- |--- add the error level and the module where the error occured--- to the attributes of a document root node and remove the children when level is greater or equal to 'c_err'.--- called by 'setDocumentStatusFromSystemState' when the system state indicates an error--setDocumentStatus :: Int -> String -> IOStateArrow s XmlTree XmlTree-setDocumentStatus level msg- = ( addAttrl ( sattr a_status (show level)- <+>- sattr a_module msg- )- >>>- ( if level >= c_err- then setChildren []- else this- )- )- `when`- isRoot---- |--- check whether the error level attribute in the system state--- is set to error, in this case the children of the document root are--- removed and the module name where the error occured and the error level are added as attributes with 'setDocumentStatus'--- else nothing is changed--setDocumentStatusFromSystemState :: String -> IOStateArrow s XmlTree XmlTree-setDocumentStatusFromSystemState msg- = setStatus $< getErrStatus- where- setStatus level- | level <= c_warn = this- | otherwise = setDocumentStatus level msg----- |--- check whether tree is a document root and the status attribute has a value less than 'c_err'--documentStatusOk :: ArrowXml a => a XmlTree XmlTree-documentStatusOk- = isRoot- >>>- ( (getAttrValue a_status- >>>- isA (\ v -> null v || ((read v)::Int) <= c_warn)- )- `guards`- this- )---- ---------------------------------------------------------------- | set the base URI of a document, used e.g. for reading includes, e.g. external entities,--- the input must be an absolute URI--setBaseURI :: IOStateArrow s String String-setBaseURI- = changeSysParam (\ b s -> s { xio_baseURI = b } )- >>>- traceValue 2 (("setBaseURI: new base URI is " ++) . show)---- | read the base URI from the globale state--getBaseURI :: IOStateArrow s b String-getBaseURI- = getSysParam xio_baseURI- >>>- ( ( getDefaultBaseURI- >>>- setBaseURI- >>>- getBaseURI- )- `when`- isA null -- set and get it, if not yet done- )---- | change the base URI with a possibly relative URI, can be used for--- evaluating the xml:base attribute. Returns the new absolute base URI.--- Fails, if input is not parsable with parseURIReference------ see also: 'setBaseURI', 'mkAbsURI'--changeBaseURI :: IOStateArrow s String String-changeBaseURI- = mkAbsURI- >>>- setBaseURI---- | set the default base URI, if parameter is null, the system base (@ file:\/\/\/\<cwd\>\/ @) is used,--- else the parameter, must be called before any document is read--setDefaultBaseURI :: String -> IOStateArrow s b String-setDefaultBaseURI base- = ( if null base- then arrIO getDir- else constA base- )- >>>- changeSysParam (\ b s -> s { xio_defaultBaseURI = b } )- >>>- traceValue 2 (("setDefaultBaseURI: new default base URI is " ++) . show)- where- getDir _ = do- cwd <- getCurrentDirectory- return ("file://" ++ normalize cwd ++ "/")-- -- under Windows getCurrentDirectory returns something like: "c:\path\to\file"- -- backslaches are not allowed in URIs and paths must start with a /- -- so this is transformed into "/c:/path/to/file"-- normalize wd'@(d : ':' : _)- | d `elem` ['A'..'Z'] || d `elem` ['a'..'z']- = '/' : concatMap win32ToUriChar wd'- normalize wd'- = concatMap escapeNonUriChar wd'-- win32ToUriChar '\\' = "/"- win32ToUriChar c = escapeNonUriChar c-- escapeNonUriChar c = escapeURIChar isUnescapedInURI c -- from Network.URI----- | get the default base URI--getDefaultBaseURI :: IOStateArrow s b String-getDefaultBaseURI- = getSysParam xio_defaultBaseURI -- read default uri in system state- >>>- ( setDefaultBaseURI "" -- set the default uri in system state- >>>- getDefaultBaseURI ) `when` isA null -- when uri not yet set---- ---------------------------------------------------------------- | remember base uri, run an arrow and restore the base URI, used with external entity substitution--runInLocalURIContext :: IOStateArrow s b c -> IOStateArrow s b c-runInLocalURIContext f- = ( getBaseURI &&& this )- >>>- ( this *** listA f )- >>>- ( setBaseURI *** this )- >>>- arrL snd---- ---------------------------------------------------------------- | set the global trace level--setTraceLevel :: Int -> IOStateArrow s b b-setTraceLevel l- = changeSysParam (\ _ s -> s { xio_trace = l } )---- | read the global trace level--getTraceLevel :: IOStateArrow s b Int-getTraceLevel- = getSysParam xio_trace---- | set the global trace command. This command does the trace output--setTraceCmd :: (Int -> String -> IO ()) -> IOStateArrow s b b-setTraceCmd c- = changeSysParam (\ _ s -> s { xio_traceCmd = c } )---- | acces the command for trace output--getTraceCmd :: IOStateArrow a b (Int -> String -> IO ())-getTraceCmd- = getSysParam xio_traceCmd---- | run an arrow with a given trace level, the old trace level is restored after the arrow execution--withTraceLevel :: Int -> IOStateArrow s b c -> IOStateArrow s b c-withTraceLevel level f- = ( getTraceLevel &&& this )- >>>- ( setTraceLevel level *** listA f )- >>>- ( restoreTraceLevel *** this )- >>>- arrL snd- where- restoreTraceLevel :: IOStateArrow s Int Int- restoreTraceLevel- = setTraceLevel $< this---- | apply a trace arrow and issue message to stderr--trace :: Int -> IOStateArrow s b String -> IOStateArrow s b b-trace level trc- = perform ( trc- >>>- ( getTraceCmd &&& this )- >>>- arrIO (\ (cmd, msg) -> cmd level msg)- )- `when` ( getTraceLevel- >>>- isA (>= level)- )--traceOutputToStderr :: Int -> String -> IO ()-traceOutputToStderr _level msg- = do- hPutStrLn stderr msg- hFlush stderr---- | trace the current value transfered in a sequence of arrows.------ The value is formated by a string conversion function. This is a substitute for--- the old and less general traceString function--traceValue :: Int -> (b -> String) -> IOStateArrow s b b-traceValue level trc- = trace level (arr $ (('-' : "- (" ++ show level ++ ") ") ++) . trc)---- | an old alias for 'traceValue'--traceString :: Int -> (b -> String) -> IOStateArrow s b b-traceString = traceValue---- | issue a string message as trace--traceMsg :: Int -> String -> IOStateArrow s b b-traceMsg level msg- = traceValue level (const msg)---- | issue the source representation of a document if trace level >= 3------ for better readability the source is formated with indentDoc--traceSource :: IOStateArrow s XmlTree XmlTree-traceSource- = trace 3 $- xshow- ( choiceA [ isRoot :-> ( indentDoc- >>>- getChildren- )- , isElem :-> ( root [] [this]- >>> indentDoc- >>> getChildren- >>> isElem- )- , this :-> this- ]- )---- | issue the tree representation of a document if trace level >= 4-traceTree :: IOStateArrow s XmlTree XmlTree-traceTree- = trace 4 $- xshow ( treeRepOfXmlDoc- >>>- addHeadlineToXmlDoc- >>>- getChildren- )---- | trace a main computation step--- issue a message when trace level >= 1, issue document source if level >= 3, issue tree when level is >= 4--traceDoc :: String -> IOStateArrow s XmlTree XmlTree-traceDoc msg- = traceMsg 1 msg- >>>- traceSource- >>>- traceTree---- | trace the global state--traceState :: IOStateArrow s b b-traceState- = perform ( xshow ( (getAllParams >>. concat)- >>>- applyA (arr formatParam)- )- >>>- traceValue 2 ("global state:\n" ++)- )- where- -- formatParam :: (String, XmlTrees) -> IOStateArrow s b1 XmlTree- formatParam (n, v)- = mkelem "param" [sattr "name" n] [arrL (const v)] <+> txt "\n"---- -------------------------------------------------------------- | parse a URI reference, in case of a failure,--- try to escape unescaped chars, convert backslashes to slashes for windows paths,--- and try parsing again--parseURIReference' :: String -> Maybe URI-parseURIReference' uri- = parseURIReference uri- `mplus`- ( if unesc- then parseURIReference uri'- else mzero- )- where- unesc = not . all isUnescapedInURI $ uri-- escape '\\' = "/"- escape c = escapeURIChar isUnescapedInURI c-- uri' = concatMap escape uri---- | compute the absolut URI for a given URI and a base URI--expandURIString :: String -> String -> Maybe String-expandURIString uri base- = do- base' <- parseURIReference' base- uri' <- parseURIReference' uri- abs' <- nonStrictRelativeTo uri' base'- return $ show abs'---- | arrow variant of 'expandURIString', fails if 'expandURIString' returns Nothing--expandURI :: ArrowXml a => a (String, String) String-expandURI- = arrL (maybeToList . uncurry expandURIString)---- | arrow for expanding an input URI into an absolute URI using global base URI, fails if input is not a legal URI--mkAbsURI :: IOStateArrow s String String-mkAbsURI- = ( this &&& getBaseURI ) >>> expandURI---- | arrow for selecting the scheme (protocol) of the URI, fails if input is not a legal URI.------ See Network.URI for URI components--getSchemeFromURI :: ArrowList a => a String String-getSchemeFromURI = getPartFromURI scheme- where- scheme = init . uriScheme---- | arrow for selecting the registered name (host) of the URI, fails if input is not a legal URI--getRegNameFromURI :: ArrowList a => a String String-getRegNameFromURI = getPartFromURI host- where- host = maybe "" uriRegName . uriAuthority---- | arrow for selecting the port number of the URI without leading \':\', fails if input is not a legal URI--getPortFromURI :: ArrowList a => a String String-getPortFromURI = getPartFromURI port- where- port = dropWhile (==':') . maybe "" uriPort . uriAuthority---- | arrow for selecting the user info of the URI without trailing \'\@\', fails if input is not a legal URI--getUserInfoFromURI :: ArrowList a => a String String-getUserInfoFromURI = getPartFromURI ui- where- ui = reverse . dropWhile (=='@') . reverse . maybe "" uriUserInfo . uriAuthority---- | arrow for computing the path component of an URI, fails if input is not a legal URI--getPathFromURI :: ArrowList a => a String String-getPathFromURI = getPartFromURI uriPath---- | arrow for computing the query component of an URI, fails if input is not a legal URI--getQueryFromURI :: ArrowList a => a String String-getQueryFromURI = getPartFromURI uriQuery---- | arrow for computing the fragment component of an URI, fails if input is not a legal URI--getFragmentFromURI :: ArrowList a => a String String-getFragmentFromURI = getPartFromURI uriFragment---- | arrow for computing the path component of an URI, fails if input is not a legal URI--getPartFromURI :: ArrowList a => (URI -> String) -> a String String-getPartFromURI sel- = arrL (maybeToList . getPart)- where- getPart s = do- uri <- parseURIReference' s- return (sel uri)---- ---------------------------------------------------------------- | set the table mapping of file extensions to mime types in the system state------ Default table is defined in 'Text.XML.HXT.DOM.MimeTypeDefaults'.--- This table is used when reading loacl files, (file: protocol) to determine the mime type--setMimeTypeTable :: MimeTypeTable -> IOStateArrow s b b-setMimeTypeTable mtt- = changeSysParam (\ _ s -> s {xio_mimeTypes = mtt})---- | set the table mapping of file extensions to mime types by an external config file------ The config file must follow the conventions of /etc/mime.types on a debian linux system,--- that means all empty lines and all lines starting with a # are ignored. The other lines--- must consist of a mime type followed by a possible empty list of extensions.--- The list of extenstions and mime types overwrites the default list in the system state--- of the IOStateArrow--setMimeTypeTableFromFile :: FilePath -> IOStateArrow s b b-setMimeTypeTableFromFile file- = setMimeTypeTable $< arrIO0 ( readMimeTypeTable file)---- ------------------------------------------------------------
+ src/Text/XML/HXT/Arrow/XmlOptions.hs view
@@ -0,0 +1,242 @@+-- ------------------------------------------------------------++{- |+ Module : Text.XML.HXT.Arrow.XmlOptions+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ system configuration and common options options++-}++-- ------------------------------------------------------------++module Text.XML.HXT.Arrow.XmlOptions+where++import Text.XML.HXT.DOM.Interface++import Text.XML.HXT.Arrow.XmlState.TypeDefs+import Text.XML.HXT.Arrow.XmlState.SystemConfig++import Data.Maybe++import System.Console.GetOpt++-- ------------------------------------------------------------+--++-- |+-- commonly useful options for XML input+--+-- can be used for option definition with haskell getopt+--+-- defines options: 'a_trace', 'a_proxy', 'a_use_curl', 'a_do_not_use_curl', 'a_options_curl', 'a_encoding',+-- 'a_issue_errors', 'a_do_not_issue_errors', 'a_parse_html', 'a_parse_by_mimetype', 'a_issue_warnings', 'a_do_not_issue_warnings',+-- 'a_parse_xml', 'a_validate', 'a_do_not_validate', 'a_canonicalize', 'a_do_not_canonicalize',+--- 'a_preserve_comment', 'a_do_not_preserve_comment', 'a_check_namespaces', 'a_do_not_check_namespaces',+-- 'a_remove_whitespace', 'a_do_not_remove_whitespace'++inputOptions :: [OptDescr SysConfig]+inputOptions+ = [ Option "t" [a_trace] (OptArg trc "LEVEL") "trace level (0-4), default 1"+ , Option "p" [a_proxy] (ReqArg withProxy "PROXY") "proxy for http access (e.g. \"www-cache:3128\")"+ , Option "" [a_redirect] (NoArg (withRedirect True)) "automatically follow redirected URIs"+ , Option "" [a_no_redirect] (NoArg (withRedirect False)) "switch off following redirected URIs"+ , Option "" [a_default_baseuri] (ReqArg withDefaultBaseURI "URI") "default base URI, default: \"file:///<cwd>/\""+ , Option "e" [a_encoding] (ReqArg withInputEncoding "CHARSET") ( "default document encoding (" ++ utf8 ++ ", " ++ isoLatin1 ++ ", " ++ usAscii ++ ", ...)" )+ , Option "" [a_mime_types] (ReqArg withMimeTypeFile "FILE") "set mime type configuration file, e.g. \"/etc/mime.types\""+ , Option "" [a_issue_errors] (NoArg (withErrors True)) "issue all error messages on stderr (default)"+ , Option "" [a_do_not_issue_errors] (NoArg (withErrors False)) "ignore all error messages"+ , Option "" [a_ignore_encoding_errors] (NoArg (withEncodingErrors False)) "ignore encoding errors"+ , Option "" [a_ignore_none_xml_contents] (NoArg (withIgnoreNoneXmlContents True)) "discards all contents of none XML/HTML documents, only the meta info remains in the doc tree"+ , Option "" [a_accept_mimetypes] (ReqArg withMT "MIMETYPES") "only accept documents matching the given comma separated list of mimetype specs"+ , Option "H" [a_parse_html] (NoArg (withParseHTML True)) "parse input as HTML, try to interprete everything as HTML, no validation"+ , Option "M" [a_parse_by_mimetype] (NoArg (withParseByMimeType True)) "parse dependent on mime type: text/html as HTML, text/xml and text/xhtml and others as XML, else no parse"+ , Option "" [a_parse_xml] (NoArg (withParseHTML False)) "parse input as XML, (default)"+ , Option "" [a_strict_input] (NoArg (withStrictInput True)) "read input files strictly, this ensures closing the files correctly even if not read completely"+ , Option "" [a_issue_warnings] (NoArg (withWarnings True)) "issue warnings, when parsing HTML (default)"+ , Option "Q" [a_do_not_issue_warnings] (NoArg (withWarnings False)) "ignore warnings, when parsing HTML"+ , Option "" [a_validate] (NoArg (withValidate True)) "document validation when parsing XML (default)"+ , Option "w" [a_do_not_validate] (NoArg (withValidate False)) "only wellformed check, no validation"+ , Option "" [a_canonicalize] (NoArg (withCanonicalize True)) "canonicalize document, remove DTD, comment, transform CDATA, CharRef's, ... (default)"+ , Option "c" [a_do_not_canonicalize] (NoArg (withCanonicalize False)) "do not canonicalize document, don't remove DTD, comment, don't transform CDATA, CharRef's, ..."+ , Option "C" [a_preserve_comment] (NoArg (withPreserveComment True)) "don't remove comments during canonicalisation"+ , Option "" [a_do_not_preserve_comment] (NoArg (withPreserveComment False)) "remove comments during canonicalisation (default)"+ , Option "n" [a_check_namespaces] (NoArg (withCheckNamespaces True)) "tag tree with namespace information and check namespaces"+ , Option "" [a_do_not_check_namespaces] (NoArg (withCheckNamespaces False)) "ignore namespaces (default)"+ , Option "r" [a_remove_whitespace] (NoArg (withRemoveWS True)) "remove redundant whitespace, simplifies tree and processing"+ , Option "" [a_do_not_remove_whitespace] (NoArg (withRemoveWS False)) "don't remove redundant whitespace (default)"+ ]+ where+ withMT = withAcceptedMimeTypes . words . map (\ x -> if x == ',' then ' ' else x)+ trc = withTrace . max 0 . min 9 . (read :: String -> Int) . ('0':) . filter (`elem` "0123456789") . fromMaybe v_1++-- |+-- commonly useful options for XML output+--+-- defines options: 'a_indent', 'a_output_encoding', 'a_output_html' and others++outputOptions :: [OptDescr SysConfig]+outputOptions+ = [ Option "f" [a_output_file] (ReqArg (withSysAttr a_output_file) "FILE") "output file for resulting document (default: stdout)"+ , Option "i" [a_indent] (NoArg (withIndent True)) "indent XML output for readability"+ , Option "o" [a_output_encoding] (ReqArg withOutputEncoding "CHARSET") ( "encoding of output (" ++ utf8 ++ ", " ++ isoLatin1 ++ ", " ++ usAscii ++ ")" )+ , Option "" [a_output_xml] (NoArg withOutputXML ) "output of none ASCII chars as HTMl entity references"+ , Option "" [a_output_html] (NoArg withOutputHTML ) "output of none ASCII chars as HTMl entity references"+ , Option "" [a_output_xhtml] (NoArg withOutputXHTML ) "output of HTML elements with empty content (script, ...) done in format <elem...></elem> instead of <elem/>"+ , Option "" [a_output_plain] (NoArg withOutputPLAIN ) "output of HTML elements with empty content (script, ...) done in format <elem...></elem> instead of <elem/>"+ , Option "" [a_no_xml_pi] (NoArg (withXmlPi False)) ("output without <?xml ...?> processing instruction, useful in combination with --" ++ show a_output_html)+ , Option "" [a_no_empty_elem_for] (ReqArg (withNoEmptyElemFor . words') "NAMES") "output of empty elements done in format <elem...></elem> only for given list of element names"+ , Option "" [a_add_default_dtd] (NoArg (withAddDefaultDTD True)) "add the document type declaration given in the input document"+ , Option "" [a_text_mode] (NoArg (withTextMode True)) "output in text mode"+ ]+ where+ words'+ = words+ . map (\ c -> if c == ',' then ' ' else c)++-- |+-- commonly useful options+--+-- defines options: 'a_verbose', 'a_help'++generalOptions :: [OptDescr SysConfig]+generalOptions+ = [ Option "v" [a_verbose] (NoArg (withSysAttr a_verbose v_1)) "verbose output"+ , Option "h?" [a_help] (NoArg (withSysAttr a_help v_1)) "this message"+ ]++-- |+-- defines 'a_version' option++versionOptions :: [OptDescr SysConfig]+versionOptions+ = [ Option "V" [a_version] (NoArg (withSysAttr a_version v_1)) "show program version"+ ]++-- |+-- debug output options++showOptions :: [OptDescr SysConfig]+showOptions+ = [ Option "" [a_show_tree] (NoArg (withShowTree True)) "output tree representation instead of document source"+ , Option "" [a_show_haskell] (NoArg (withShowHaskell True)) "output internal Haskell representation instead of document source"+ ]++-- ------------------------------------------------------------++a_accept_mimetypes,+ a_add_default_dtd,+ a_canonicalize,+ a_check_namespaces,+ a_collect_errors,+ a_default_baseuri,+ a_do_not_canonicalize,+ a_do_not_check_namespaces,+ a_do_not_issue_errors,+ a_do_not_issue_warnings,+ a_do_not_preserve_comment,+ a_do_not_remove_whitespace,+ a_do_not_validate,+ a_error,+ a_error_log,+ a_help,+ a_if_modified_since,+ a_if_unmodified_since,+ a_ignore_encoding_errors,+ a_ignore_none_xml_contents,+ a_indent,+ a_issue_errors,+ a_issue_warnings,+ a_mime_types,+ a_no_empty_elements,+ a_no_empty_elem_for,+ a_no_redirect,+ a_no_xml_pi,+ a_output_file,+ a_output_xml,+ a_output_html,+ a_output_xhtml,+ a_output_plain,+ a_parse_by_mimetype,+ a_parse_html,+ a_parse_xml,+ a_preserve_comment,+ a_proxy,+ a_redirect,+ a_remove_whitespace,+ a_show_haskell,+ a_show_tree,+ a_strict_input,+ a_text_mode,+ a_trace,+ a_validate,+ a_verbose :: String++a_accept_mimetypes = "accept-mimetypes"+a_add_default_dtd = "add-default-dtd"+a_canonicalize = "canonicalize"+a_check_namespaces = "check-namespaces"+a_collect_errors = "collect-errors"+a_default_baseuri = "default-base-URI"+a_do_not_canonicalize = "do-not-canonicalize"+a_do_not_check_namespaces = "do-not-check-namespaces"+a_do_not_issue_errors = "do-not-issue-errors"+a_do_not_issue_warnings = "do-not-issue-warnings"+a_do_not_preserve_comment = "do-not-preserve-comment"+a_do_not_remove_whitespace = "do-not-remove-whitespace"+a_do_not_validate = "do-not-validate"+a_error = "error"+a_error_log = "errorLog"+a_help = "help"+a_if_modified_since = "if-modified-since"+a_if_unmodified_since = "if-unmodified-since"+a_ignore_encoding_errors = "ignore-encoding-errors"+a_ignore_none_xml_contents = "ignore-none-xml-contents"+a_indent = "indent"+a_issue_warnings = "issue-warnings"+a_issue_errors = "issue-errors"+a_mime_types = "mimetypes"+a_no_empty_elements = "no-empty-elements"+a_no_empty_elem_for = "no-empty-elem-for"+a_no_redirect = "no-redirect"+a_no_xml_pi = "no-xml-pi"+a_output_file = "output-file"+a_output_html = "output-html"+a_output_xhtml = "output-xhtml"+a_output_xml = "output-xml"+a_output_plain = "output-plain"+a_parse_by_mimetype = "parse-by-mimetype"+a_parse_html = "parse-html"+a_parse_xml = "parse-xml"+a_preserve_comment = "preserve-comment"+a_proxy = "proxy"+a_redirect = "redirect"+a_remove_whitespace = "remove-whitespace"+a_show_haskell = "show-haskell"+a_show_tree = "show-tree"+a_strict_input = "strict-input"+a_text_mode = "text-mode"+a_trace = "trace"+a_validate = "validate"+a_verbose = "verbose"++-- ------------------------------------------------------------++-- |+-- select options from a predefined list of option desciptions++selectOptions :: [String] -> [OptDescr a] -> [OptDescr a]+selectOptions ol os+ = concat . map (\ on -> filter (\ (Option _ ons _ _) -> on `elem` ons) os) $ ol++removeOptions :: [String] -> [OptDescr a] -> [OptDescr a]+removeOptions ol os+ = filter (\ (Option _ ons _ _) -> not . any (`elem` ol) $ ons ) os++-- ------------------------------------------------------------
src/Text/XML/HXT/Arrow/XmlRegex.hs view
@@ -28,7 +28,9 @@ , mkDot , mkStar , mkAlt+ , mkAlts , mkSeq+ , mkSeqs , mkRep , mkRng , mkOpt@@ -61,7 +63,7 @@ -- ('mkStar', mkRep', 'mkRng') and choice ('mkAlt', 'mkOpt') matchRegexA :: XmlRegex -> LA XmlTree XmlTree -> LA XmlTree XmlTrees-matchRegexA re ts = ts >>. (\ s -> maybe [] (const [s]) . matchXmlRegex re $ s)+matchRegexA re ts = ts >>. (\ s -> maybe [s] (const []) . matchXmlRegex re $ s) -- | split the sequence of trees computed by the filter a into --@@ -131,8 +133,8 @@ mkPrimA :: LA XmlTree XmlTree -> XmlRegex mkPrimA a = mkPrim (not . null . runLA a) -mkDot :: XmlRegex-mkDot = Dot+mkDot :: XmlRegex+mkDot = Dot mkStar :: XmlRegex -> XmlRegex mkStar (Zero _) = mkUnit -- {}* == ()@@ -159,6 +161,9 @@ mkAlt (Alt e1 e2) e3 = mkAlt e1 (mkAlt e2 e3) -- associativity mkAlt e1 e2 = Alt e1 e2 +mkAlts :: [XmlRegex] -> XmlRegex+mkAlts = foldr mkAlt (mkZero "")+ mkSeq :: XmlRegex -> XmlRegex -> XmlRegex mkSeq e1@(Zero _) _e2 = e1 mkSeq _e1 e2@(Zero _) = e2@@ -166,6 +171,9 @@ mkSeq e1 Unit = e1 mkSeq (Seq e1 e2) e3 = mkSeq e1 (mkSeq e2 e3) mkSeq e1 e2 = Seq e1 e2++mkSeqs :: [XmlRegex] -> XmlRegex+mkSeqs = foldr mkSeq mkUnit mkRep :: Int -> XmlRegex -> XmlRegex mkRep 0 e = mkStar e
+ src/Text/XML/HXT/Arrow/XmlState.hs view
@@ -0,0 +1,157 @@+-- ------------------------------------------------------------++{- |+ Module : Text.XML.HXT.Arrow.XmlState+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ the interface for the basic state maipulation functions+-}++-- ------------------------------------------------------------++module Text.XML.HXT.Arrow.XmlState+ ( -- * Data Types+ XIOState+ , XIOSysState+ , IOStateArrow+ , IOSArrow+ , SysConfig+ , SysConfigList+ ,+ -- * User State Manipulation+ getUserState+ , setUserState+ , changeUserState+ , withExtendedUserState+ , withOtherUserState+ , withoutUserState+ ,+ -- * Run IO State arrows+ runX+ ,+ -- * Global System State Configuration and Access+ configSysVars+ , setSysAttr+ , unsetSysAttr+ , getSysAttr+ , getAllSysAttrs+ , setSysAttrString+ , setSysAttrInt+ , getSysAttrInt+ , getConfigAttr+ ,+ -- * Error Handling+ clearErrStatus+ , setErrStatus+ , getErrStatus+ , setErrMsgStatus+ , setErrorMsgHandler+ , errorMsgStderr+ , errorMsgCollect+ , errorMsgStderrAndCollect+ , errorMsgIgnore+ , getErrorMessages+ , filterErrorMsg+ , issueWarn+ , issueErr+ , issueFatal+ , issueExc+ , setDocumentStatus+ , setDocumentStatusFromSystemState+ , documentStatusOk++ , -- * Tracing+ setTraceLevel+ , getTraceLevel+ , withTraceLevel+ , setTraceCmd+ , getTraceCmd+ , trace+ , traceMsg+ , traceValue+ , traceString+ , traceSource+ , traceTree+ , traceDoc++ , -- * Document Base+ setBaseURI+ , getBaseURI+ , changeBaseURI+ , setDefaultBaseURI+ , getDefaultBaseURI+ , runInLocalURIContext++ , -- * URI Manipulation+ expandURIString+ , expandURI+ , mkAbsURI+ , getFragmentFromURI+ , getPathFromURI+ , getPortFromURI+ , getQueryFromURI+ , getRegNameFromURI+ , getSchemeFromURI+ , getUserInfoFromURI++ , -- * Mime Type Handling+ getMimeTypeTable+ , setMimeTypeTable+ , setMimeTypeTableFromFile++ , -- System Configuration and options+ yes+ , no++ , withAcceptedMimeTypes+ , withAddDefaultDTD+ , withSysAttr+ , withCanonicalize+ , withCompression+ , withCheckNamespaces+ , withDefaultBaseURI+ , withEncodingErrors+ , withErrors+ , withIgnoreNoneXmlContents+ , withIndent+ , withInputEncoding+ , withInputOption+ , withInputOptions+ , withMimeTypeFile+ , withNoEmptyElemFor+ , withXmlPi+ , withOutputEncoding+ , withOutputXML+ , withOutputHTML+ , withOutputXHTML+ , withOutputPLAIN+ , withParseByMimeType+ , withParseHTML+ , withPreserveComment+ , withProxy+ , withRedirect+ , withRemoveWS+ , withShowHaskell+ , withShowTree+ , withStrictInput+ , withTextMode+ , withTrace+ , withValidate+ , withWarnings+ )+where++import Text.XML.HXT.Arrow.XmlState.ErrorHandling+import Text.XML.HXT.Arrow.XmlState.MimeTypeTable+import Text.XML.HXT.Arrow.XmlState.RunIOStateArrow+import Text.XML.HXT.Arrow.XmlState.SystemConfig+import Text.XML.HXT.Arrow.XmlState.TraceHandling+import Text.XML.HXT.Arrow.XmlState.TypeDefs+import Text.XML.HXT.Arrow.XmlState.URIHandling++-- ------------------------------------------------------------
+ src/Text/XML/HXT/Arrow/XmlState/ErrorHandling.hs view
@@ -0,0 +1,252 @@+-- ------------------------------------------------------------++{- |+ Module : Text.XML.HXT.Arrow.XmlState.ErrorHandling+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ the basic state arrows for XML processing++ A state is needed for global processing options,+ like encoding options, document base URI, trace levels+ and error message handling++ The state is separated into a user defined state+ and a system state. The system state contains variables+ for error message handling, for tracing, for the document base+ for accessing XML documents with relative references, e.g. DTDs,+ and a global key value store. This assoc list has strings as keys+ and lists of XmlTrees as values. It is used to store arbitrary+ XML and text values, e.g. user defined global options.++ The user defined part of the store is in the default case empty, defined as ().+ It can be extended with an arbitray data type++-}++-- ------------------------------------------------------------++module Text.XML.HXT.Arrow.XmlState.ErrorHandling+where++import Control.Arrow -- arrow classes+import Control.Arrow.ArrowList+import Control.Arrow.ArrowIf+import Control.Arrow.ArrowTree+import Control.Arrow.ArrowIO++import Control.Exception ( SomeException )++import Data.Maybe++import Text.XML.HXT.DOM.Interface++import Text.XML.HXT.Arrow.XmlArrow+import Text.XML.HXT.Arrow.XmlState.TypeDefs++import System.IO ( hPutStrLn+ , hFlush+ , stderr+ )++-- ------------------------------------------------------------++changeErrorStatus :: (Int -> Int -> Int) -> IOStateArrow s Int Int+changeErrorStatus f = chgSysVar theErrorStatus f++-- | reset global error variable++clearErrStatus :: IOStateArrow s b b+clearErrStatus = configSysVar $ setS theErrorStatus 0++-- | set global error variable++setErrStatus :: IOStateArrow s Int Int+setErrStatus = changeErrorStatus max++-- | read current global error status++getErrStatus :: IOStateArrow s XmlTree Int+getErrStatus = getSysVar theErrorStatus++-- ------------------------------------------------------------++-- | raise the global error status level to that of the input tree++setErrMsgStatus :: IOStateArrow s XmlTree XmlTree+setErrMsgStatus = perform+ ( getErrorLevel >>> setErrStatus )++-- | set the error message handler and the flag for collecting the errors++setErrorMsgHandler :: Bool -> (String -> IO ()) -> IOStateArrow s b b+setErrorMsgHandler c f = configSysVar $ setS (theErrorMsgCollect .&&&. theErrorMsgHandler) (c, f)++-- | error message handler for output to stderr++sysErrorMsg :: IOStateArrow s XmlTree XmlTree+sysErrorMsg = perform+ ( getErrorLevel &&& getErrorMsg+ >>>+ arr formatErrorMsg+ >>>+ getSysVar theErrorMsgHandler &&& this+ >>>+ arrIO (\ (h, msg) -> h msg)+ )+ where+ formatErrorMsg (level, msg) = "\n" ++ errClass level ++ ": " ++ msg+ errClass l = fromMaybe "fatal error" . lookup l $ msgList+ where+ msgList = [ (c_ok, "no error")+ , (c_warn, "warning")+ , (c_err, "error")+ , (c_fatal, "fatal error")+ ]+++-- | the default error message handler: error output to stderr++errorMsgStderr :: IOStateArrow s b b+errorMsgStderr = setErrorMsgHandler False (\ x ->+ do hPutStrLn stderr x+ hFlush stderr+ )++-- | error message handler for collecting errors++errorMsgCollect :: IOStateArrow s b b+errorMsgCollect = setErrorMsgHandler True (const $ return ())++-- | error message handler for output to stderr and collecting++errorMsgStderrAndCollect :: IOStateArrow s b b+errorMsgStderrAndCollect = setErrorMsgHandler True (hPutStrLn stderr)++-- | error message handler for ignoring errors++errorMsgIgnore :: IOStateArrow s b b+errorMsgIgnore = setErrorMsgHandler False (const $ return ())++-- |+-- if error messages are collected by the error handler for+-- processing these messages by the calling application,+-- this arrow reads the stored messages and clears the error message store++getErrorMessages :: IOStateArrow s b XmlTree+getErrorMessages = getSysVar theErrorMsgList+ >>>+ configSysVar (setS theErrorMsgList [])+ >>>+ arrL reverse++addToErrorMsgList :: IOStateArrow s XmlTree XmlTree+addToErrorMsgList = chgSysVar+ ( theErrorMsgCollect .&&&. theErrorMsgList )+ ( \ e (cs, es) -> (cs, if cs then e : es else es) )++-- ------------------------------------------------------------++-- |+-- filter error messages from input trees and issue errors++filterErrorMsg :: IOStateArrow s XmlTree XmlTree+filterErrorMsg = ( setErrMsgStatus+ >>>+ sysErrorMsg+ >>>+ addToErrorMsgList+ >>>+ none+ )+ `when`+ isError++-- | generate a warnig message++issueWarn :: String -> IOStateArrow s b b+issueWarn msg = perform (warn msg >>> filterErrorMsg)++-- | generate an error message+issueErr :: String -> IOStateArrow s b b+issueErr msg = perform (err msg >>> filterErrorMsg)++-- | generate a fatal error message, e.g. document not found++issueFatal :: String -> IOStateArrow s b b+issueFatal msg = perform (fatal msg >>> filterErrorMsg)++-- | Default exception handler: issue a fatal error message and fail.+--+-- The parameter can be used to specify where the error occured++issueExc :: String -> IOStateArrow s SomeException b+issueExc m = ( issueFatal $< arr ((msg ++) . show) )+ >>>+ none+ where+ msg | null m = "Exception: "+ | otherwise = "Exception in " ++ m ++ ": "++-- |+-- add the error level and the module where the error occured+-- to the attributes of a document root node and remove the children when level is greater or equal to 'c_err'.+-- called by 'setDocumentStatusFromSystemState' when the system state indicates an error++setDocumentStatus :: Int -> String -> IOStateArrow s XmlTree XmlTree+setDocumentStatus level msg+ = ( addAttrl ( sattr a_status (show level)+ <+>+ sattr a_module msg+ )+ >>>+ ( if level >= c_err+ then setChildren []+ else this+ )+ )+ `when`+ isRoot++-- |+-- check whether the error level attribute in the system state+-- is set to error, in this case the children of the document root are+-- removed and the module name where the error occured and the error level are added as attributes with 'setDocumentStatus'+-- else nothing is changed++setDocumentStatusFromSystemState :: String -> IOStateArrow s XmlTree XmlTree+setDocumentStatusFromSystemState msg+ = setStatus $< getErrStatus+ where+ setStatus level+ | level <= c_warn = this+ | otherwise = setDocumentStatus level msg+++-- |+-- check whether tree is a document root and the status attribute has a value less than 'c_err'++documentStatusOk :: ArrowXml a => a XmlTree XmlTree+documentStatusOk = isRoot+ >>>+ ( (getAttrValue a_status+ >>>+ isA (\ v -> null v || ((read v)::Int) <= c_warn)+ )+ `guards`+ this+ )++-- ------------------------------------------------------------++errorOutputToStderr :: String -> IO ()+errorOutputToStderr msg+ = do+ hPutStrLn stderr msg+ hFlush stderr++-- ------------------------------------------------------------
+ src/Text/XML/HXT/Arrow/XmlState/MimeTypeTable.hs view
@@ -0,0 +1,60 @@+-- ------------------------------------------------------------++{- |+ Module : Text.XML.HXT.Arrow.XmlState.MimeTypeTable+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ the mime type configuration functions++-}++-- ------------------------------------------------------------++module Text.XML.HXT.Arrow.XmlState.MimeTypeTable+where++import Control.Arrow -- arrow classes+import Control.Arrow.ArrowList+import Control.Arrow.ArrowIO++import Text.XML.HXT.DOM.Interface++import Text.XML.HXT.Arrow.XmlState.TypeDefs++-- ------------------------------------------------------------++-- | set the table mapping of file extensions to mime types in the system state+--+-- Default table is defined in 'Text.XML.HXT.DOM.MimeTypeDefaults'.+-- This table is used when reading loacl files, (file: protocol) to determine the mime type++setMimeTypeTable :: MimeTypeTable -> IOStateArrow s b b+setMimeTypeTable mtt = configSysVar $ setS (theMimeTypes .&&&. theMimeTypeFile) (mtt, "")++-- | set the table mapping of file extensions to mime types by an external config file+--+-- The config file must follow the conventions of /etc/mime.types on a debian linux system,+-- that means all empty lines and all lines starting with a # are ignored. The other lines+-- must consist of a mime type followed by a possible empty list of extensions.+-- The list of extenstions and mime types overwrites the default list in the system state+-- of the IOStateArrow++setMimeTypeTableFromFile :: FilePath -> IOStateArrow s b b+setMimeTypeTableFromFile file = configSysVar $ setS theMimeTypeFile file++-- | read the system mimetype table++getMimeTypeTable :: IOStateArrow s b MimeTypeTable+getMimeTypeTable = getMime $< getSysVar (theMimeTypes .&&&. theMimeTypeFile)+ where+ getMime (mtt, "") = constA mtt+ getMime (_, mtf) = perform (setMimeTypeTable $< arrIO0 ( readMimeTypeTable mtf))+ >>>+ getMimeTypeTable++-- ------------------------------------------------------------
+ src/Text/XML/HXT/Arrow/XmlState/RunIOStateArrow.hs view
@@ -0,0 +1,218 @@+-- ------------------------------------------------------------++{- |+ Module : Text.XML.HXT.Arrow.XmlState.RunIOStateArrow+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ run an io state arrow+-}++-- ------------------------------------------------------------++module Text.XML.HXT.Arrow.XmlState.RunIOStateArrow+where++import Control.Arrow -- arrow classes+import Control.Arrow.IOStateListArrow++import Text.XML.HXT.DOM.Interface++import Text.XML.HXT.Arrow.XmlArrow+import Text.XML.HXT.Arrow.XmlState.ErrorHandling+import Text.XML.HXT.Arrow.XmlState.TraceHandling+import Text.XML.HXT.Arrow.XmlState.TypeDefs++-- ------------------------------------------------------------++-- |+-- apply an 'IOSArrow' to an empty root node with 'initialState' () as initial state+--+-- the main entry point for running a state arrow with IO+--+-- when running @ runX f@ an empty XML root node is applied to @f@.+-- usually @f@ will start with a constant arrow (ignoring the input), e.g. a 'Text.XML.HXT.Arrow.ReadDocument.readDocument' arrow.+--+-- for usage see examples with 'Text.XML.HXT.Arrow.WriteDocument.writeDocument'+--+-- if input has to be feed into the arrow use 'Control.Arrow.IOStateListArrow.runIOSLA' like in @ runIOSLA f emptyX inputDoc @++runX :: IOSArrow XmlTree c -> IO [c]+runX = runXIOState (initialState ())+++runXIOState :: XIOState s -> IOStateArrow s XmlTree c -> IO [c]+runXIOState s0 f+ = do+ (_finalState, res) <- runIOSLA (emptyRoot >>> f) s0 undefined+ return res+ where+ emptyRoot = root [] []+++-- | the default global state, used as initial state when running an 'IOSArrow' with 'runIOSLA' or+-- 'runX'++initialState :: us -> XIOState us+initialState s = XIOState { xioSysState = initialSysState+ , xioUserState = s+ }++-- ------------------------------------------------------------++initialSysState :: XIOSysState+initialSysState = XIOSys+ { xioSysWriter = initialSysWriter+ , xioSysEnv = initialSysEnv+ }++initialSysWriter :: XIOSysWriter+initialSysWriter = XIOwrt+ { xioErrorMsgList = []+ }++initialSysEnv :: XIOSysEnv+initialSysEnv = XIOEnv+ { xioTraceLevel = 0+ , xioTraceCmd = traceOutputToStderr+ , xioErrorStatus = c_ok+ , xioErrorMsgHandler = errorOutputToStderr+ , xioErrorMsgCollect = False+ , xioBaseURI = ""+ , xioDefaultBaseURI = ""+ , xioAttrList = []+ , xioInputConfig = initialInputConfig+ , xioParseConfig = initialParseConfig+ , xioOutputConfig = initialOutputConfig+ , xioRelaxConfig = initialRelaxConfig+ , xioCacheConfig = initialCacheConfig+ }++initialInputConfig :: XIOInputConfig+initialInputConfig = XIOIcgf+ { xioStrictInput = False+ , xioEncodingErrors = True+ , xioInputEncoding = ""+ , xioHttpHandler = dummyHTTPHandler+ , xioInputOptions = []+ , xioRedirect = False+ , xioProxy = ""+ }++initialParseConfig :: XIOParseConfig+initialParseConfig = XIOPcfg+ { xioMimeTypes = defaultMimeTypeTable+ , xioMimeTypeFile = ""+ , xioAcceptedMimeTypes = []+ , xioWarnings = True+ , xioRemoveWS = False+ , xioParseByMimeType = False+ , xioParseHTML = False+ , xioLowerCaseNames = False+ , xioTagSoup = False+ , xioPreserveComment = False+ , xioValidate = True+ , xioCheckNamespaces = False+ , xioCanonicalize = True+ , xioIgnoreNoneXmlContents = False+ , xioTagSoupParser = dummyTagSoupParser+ }++initialOutputConfig :: XIOOutputConfig+initialOutputConfig = XIOOcfg+ { xioIndent = False+ , xioOutputEncoding = ""+ , xioOutputFmt = XMLoutput+ , xioXmlPi = True+ , xioNoEmptyElemFor = []+ , xioAddDefaultDTD = False+ , xioTextMode = False+ , xioShowTree = False+ , xioShowHaskell = False+ }++initialRelaxConfig :: XIORelaxConfig+initialRelaxConfig = XIORxc+ { xioRelaxValidate = False+ , xioRelaxSchema = ""+ , xioRelaxCheckRestr = True+ , xioRelaxValidateExtRef = True+ , xioRelaxValidateInclude = True+ , xioRelaxCollectErrors = True+ , xioRelaxNoOfErrors = 0+ , xioRelaxDefineId = 0+ , xioRelaxAttrList = []+ , xioRelaxValidator = dummyRelaxValidator+ }++initialCacheConfig :: XIOCacheConfig+initialCacheConfig = XIOCch+ { xioBinaryCompression = id+ , xioBinaryDeCompression = id+ , xioWithCache = False+ , xioCacheDir = ""+ , xioDocumentAge = 0+ , xioCache404Err = False+ , xioCacheRead = dummyCacheRead+ }++-- ------------------------------------------------------------++dummyHTTPHandler :: IOSArrow XmlTree XmlTree+dummyHTTPHandler = ( issueFatal $+ unlines $+ [ "HTTP handler not configured,"+ , "please install package hxt-curl and use 'withCurl' config option"+ , "or install package hxt-http and use 'withHTTP' config option"+ ]+ )+ >>>+ addAttr transferMessage "HTTP handler not configured"+ >>>+ addAttr transferStatus "999"+++dummyTagSoupParser :: IOSArrow b b+dummyTagSoupParser = issueFatal $+ unlines $+ [ "TagSoup parser not configured,"+ , "please install package hxt-tagsoup"+ , " and use 'withTagSoup' parser config option from this package"+ ]++dummyRelaxValidator :: IOSArrow b b+dummyRelaxValidator = issueFatal $+ unlines $+ [ "RelaxNG validator not configured,"+ , "please install package hxt-relaxng"+ , " and use 'withRelaxNG' config option from this package"+ ]++dummyCacheRead :: String -> IOSArrow b b+dummyCacheRead = const $+ issueFatal $+ unlines $+ [ "Document cache not configured,"+ , "please install package hxt-cache and use 'withCache' config option"+ ]++-- ------------------------------------------------------------++getConfigAttr :: String -> SysConfigList -> String+getConfigAttr n c = lookup1 n $ tl+ where+ s = (foldr (>>>) id c) initialSysState+ tl = getS theAttrList s++-- ----------------------------------------++theSysConfigComp :: Selector XIOSysState a -> Selector SysConfig a+theSysConfigComp sel = S { getS = \ cf -> getS sel (cf initialSysState)+ , setS = \ val cf -> setS sel val . cf+ }++-- ------------------------------------------------------------
+ src/Text/XML/HXT/Arrow/XmlState/SystemConfig.hs view
@@ -0,0 +1,234 @@+-- ------------------------------------------------------------++{- |+ Module : Text.XML.HXT.Arrow.XmlState.SystemConfig+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ system configuration and common options options++-}++-- ------------------------------------------------------------++module Text.XML.HXT.Arrow.XmlState.SystemConfig+where++import Control.Arrow++import Text.XML.HXT.DOM.Interface++import Text.XML.HXT.Arrow.XmlState.ErrorHandling+import Text.XML.HXT.Arrow.XmlState.TypeDefs++-- ------------------------------++-- config options++-- | @withTace level@ : system option, set the trace level, (0..4)++withTrace :: Int -> SysConfig+withTrace = setS theTraceLevel++-- | @withSysAttr key value@ : store an arbitarty key value pair in system state++withSysAttr :: String -> String -> SysConfig+withSysAttr n v = chgS theAttrList (addEntry n v)++withAcceptedMimeTypes :: [String] -> SysConfig+withAcceptedMimeTypes = setS theAcceptedMimeTypes++-- | @withMimeTypeFile filename@ : input option,+-- set the mime type table for @file:@ documents by given file.+-- The format of this config file must be in the syntax of a debian linux \"mime.types\" config file++withMimeTypeFile :: String -> SysConfig+withMimeTypeFile = setS theMimeTypeFile++-- | @withWarnings yes/no@ : system option, issue warnings during reading, HTML parsing and processing,+-- default is 'yes'++withWarnings :: Bool -> SysConfig+withWarnings = setS theWarnings++-- | @withErrors yes/no@ : system option for suppressing error messages, default is 'no'++withErrors :: Bool -> SysConfig+withErrors b = setS theErrorMsgHandler h+ where+ h | b = errorOutputToStderr+ | otherwise = const $ return ()++-- | @withRemoveWS yes/no@ : read and write option, remove all whitespace, used for document indentation, default is 'no'++withRemoveWS :: Bool -> SysConfig+withRemoveWS = setS theRemoveWS++-- | @withPreserveComment yes/no@ : read option, preserve comments during canonicalization, default is 'no'++withPreserveComment :: Bool -> SysConfig+withPreserveComment = setS thePreserveComment++-- | @withParseByMimeType yes/no@ : read option, select the parser by the mime type of the document+-- (pulled out of the HTTP header).+--+-- When the mime type is set to \"text\/html\"+-- the configured HTML parser is taken, when it\'s set to+-- \"text\/xml\" or \"text\/xhtml\" the configured XML parser is taken.+-- If the mime type is something else, no further processing is performed,+-- the contents is given back to the application in form of a single text node.+-- If the default document encoding is set to isoLatin1, this even enables processing+-- of arbitray binary data.++withParseByMimeType :: Bool -> SysConfig+withParseByMimeType = setS theParseByMimeType++-- | @withParseHTML yes/no@: read option, use HTML parser, default is 'no' (use XML parser)++withParseHTML :: Bool -> SysConfig+withParseHTML = setS theParseHTML++-- | @withValidate yes/no@: read option, validate document againsd DTD, default is 'yes'++withValidate :: Bool -> SysConfig+withValidate = setS theValidate++-- | @withCheckNamespaces yes/no@: read option, check namespaces, default is 'no'++withCheckNamespaces :: Bool -> SysConfig+withCheckNamespaces = setS theCheckNamespaces++-- | @withCanonicalize yes/no@ : read option, canonicalize document, default is 'yes'++withCanonicalize :: Bool -> SysConfig+withCanonicalize = setS theCanonicalize++-- | @withIgnoreNoneXmlContents yes\/no@ : input option, ignore document contents of none XML\/HTML documents.+--+-- This option can be useful for implementing crawler like applications, e.g. an URL checker.+-- In those cases net traffic can be reduced.++withIgnoreNoneXmlContents :: Bool -> SysConfig+withIgnoreNoneXmlContents = setS theIgnoreNoneXmlContents++-- ------------------------------------------------------------++-- | @withStrictInput yes/no@ : input option, input of file and HTTP contents is read eagerly, default is 'no'++withStrictInput :: Bool -> SysConfig+withStrictInput = setS theStrictInput++-- | @withEncodingErrors yes/no@ : input option, ignore all encoding errors, default is 'no'++withEncodingErrors :: Bool -> SysConfig+withEncodingErrors = setS theEncodingErrors++-- | @withInputEncoding encodingName@ : input option+--+-- Set default document encoding ('utf8', 'isoLatin1', 'usAscii', 'iso8859_2', ... , 'iso8859_16', ...).+-- Only XML, HTML and text documents are decoded,+-- default decoding for XML\/HTML is utf8, for text iso latin1 (no decoding).++withInputEncoding :: String -> SysConfig+withInputEncoding = setS theInputEncoding++-- | @withDefaultBaseURI URI@ , input option, set the default base URI+--+-- This option can be useful when parsing documents from stdin or contained in a string, and interpreting+-- relative URIs within the document++withDefaultBaseURI :: String -> SysConfig+withDefaultBaseURI = setS theDefaultBaseURI++withInputOption :: String -> String -> SysConfig+withInputOption n v = chgS theInputOptions (addEntry n v)++withInputOptions :: Attributes -> SysConfig+withInputOptions = foldr (>>>) id . map (uncurry withInputOption)++-- | @withRedirect yes/no@ : input option, automatically follow redirected URIs, default is 'yes'++withRedirect :: Bool -> SysConfig+withRedirect = setS theRedirect++-- | @withProxy \"host:port\"@ : input option, configure a proxy for HTTP access, e.g. www-cache:3128++withProxy :: String -> SysConfig+withProxy = setS theProxy++-- ------------------------------------------------------------++-- | @withIndent yes/no@ : output option, indent document before output, default is 'no'++withIndent :: Bool -> SysConfig+withIndent = setS theIndent++-- | @withOutputEncoding encoding@ , output option,+-- default is the default input encoding or utf8, if input encoding is not set++withOutputEncoding :: String -> SysConfig+withOutputEncoding = setS theOutputEncoding++-- | @withOutputXML@ : output option, default writing+--+-- Default is writing XML: quote special XML chars \>,\<,\",\',& where neccessary,+-- add XML processing instruction+-- and encode document with respect to 'withOutputEncoding'++withOutputXML :: SysConfig+withOutputXML = setS theOutputFmt XMLoutput++-- | Write XHTML: quote all special XML chars, use HTML entity refs or char refs for none ASCII chars++withOutputHTML :: SysConfig+withOutputHTML = setS theOutputFmt HTMLoutput++-- | Write XML: quote only special XML chars, don't substitute chars by HTML entities, and don\'t generate empty elements for HTML elements,+-- which may contain any contents, e.g. @<script src=...></script>@ instead of @<script src=... />@++withOutputXHTML :: SysConfig+withOutputXHTML = setS theOutputFmt XHTMLoutput++-- | suppreses all char and entitiy substitution++withOutputPLAIN :: SysConfig+withOutputPLAIN = setS theOutputFmt PLAINoutput++withXmlPi :: Bool -> SysConfig+withXmlPi = setS theXmlPi++withNoEmptyElemFor :: [String] -> SysConfig+withNoEmptyElemFor = setS theNoEmptyElemFor++withAddDefaultDTD :: Bool -> SysConfig+withAddDefaultDTD = setS theAddDefaultDTD++withTextMode :: Bool -> SysConfig+withTextMode = setS theTextMode++withShowTree :: Bool -> SysConfig+withShowTree = setS theShowTree++withShowHaskell :: Bool -> SysConfig+withShowHaskell = setS theShowHaskell++-- | Configure compression and decompression for binary serialization/deserialization.+-- First component is the compression function applied after serialization,+-- second the decompression applied before deserialization.++withCompression :: (CompressionFct, DeCompressionFct) -> SysConfig+withCompression = setS (theBinaryCompression .&&&. theBinaryDeCompression)++-- ------------------------------------------------------------++yes :: Bool+yes = True++no :: Bool+no = False++-- ------------------------------------------------------------
+ src/Text/XML/HXT/Arrow/XmlState/TraceHandling.hs view
@@ -0,0 +1,150 @@+-- ------------------------------------------------------------++{- |+ Module : Text.XML.HXT.Arrow.XmlState.TraceHandling+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ the trace arrows++-}++-- ------------------------------------------------------------++module Text.XML.HXT.Arrow.XmlState.TraceHandling+where++import Control.Arrow -- arrow classes+import Control.Arrow.ArrowList+import Control.Arrow.ArrowIf+import Control.Arrow.ArrowTree+import Control.Arrow.ArrowIO++import System.IO ( hPutStrLn+ , hFlush+ , stderr+ )++import Text.XML.HXT.DOM.Interface++import Text.XML.HXT.Arrow.XmlArrow+import Text.XML.HXT.Arrow.XmlState.TypeDefs+import Text.XML.HXT.Arrow.XmlState.SystemConfig++import Text.XML.HXT.Arrow.Edit ( addHeadlineToXmlDoc+ , treeRepOfXmlDoc+ , indentDoc+ )++-- ------------------------------------------------------------++-- | set the global trace level++setTraceLevel :: Int -> IOStateArrow s b b+setTraceLevel l = configSysVar $ withTrace l++-- | read the global trace level++getTraceLevel :: IOStateArrow s b Int+getTraceLevel = getSysVar theTraceLevel++-- | set the global trace command. This command does the trace output++setTraceCmd :: (Int -> String -> IO ()) -> IOStateArrow s b b+setTraceCmd c = configSysVar $ setS theTraceCmd c++-- | acces the command for trace output++getTraceCmd :: IOStateArrow a b (Int -> String -> IO ())+getTraceCmd = getSysVar theTraceCmd++-- | run an arrow with a given trace level, the old trace level is restored after the arrow execution++withTraceLevel :: Int -> IOStateArrow s b c -> IOStateArrow s b c+withTraceLevel level f = localSysEnv $ setTraceLevel level >>> f++-- | apply a trace arrow and issue message to stderr++trace :: Int -> IOStateArrow s b String -> IOStateArrow s b b+trace level trc = perform ( trc+ >>>+ ( getTraceCmd &&& this )+ >>>+ arrIO (\ (cmd, msg) -> cmd level msg)+ )+ `when` ( getTraceLevel+ >>>+ isA (>= level)+ )++-- | trace the current value transfered in a sequence of arrows.+--+-- The value is formated by a string conversion function. This is a substitute for+-- the old and less general traceString function++traceValue :: Int -> (b -> String) -> IOStateArrow s b b+traceValue level trc = trace level (arr $ (('-' : "- (" ++ show level ++ ") ") ++) . trc)++-- | an old alias for 'traceValue'++traceString :: Int -> (b -> String) -> IOStateArrow s b b+traceString = traceValue++-- | issue a string message as trace++traceMsg :: Int -> String -> IOStateArrow s b b+traceMsg level msg = traceValue level (const msg)++-- | issue the source representation of a document if trace level >= 3+--+-- for better readability the source is formated with indentDoc++traceSource :: IOStateArrow s XmlTree XmlTree+traceSource = trace 3 $+ xshow $+ choiceA [ isRoot :-> ( indentDoc+ >>>+ getChildren+ )+ , isElem :-> ( root [] [this]+ >>> indentDoc+ >>> getChildren+ >>> isElem+ )+ , this :-> this+ ]++-- | issue the tree representation of a document if trace level >= 4+traceTree :: IOStateArrow s XmlTree XmlTree+traceTree = trace 4 $+ xshow $+ treeRepOfXmlDoc+ >>>+ addHeadlineToXmlDoc+ >>>+ getChildren++-- | trace a main computation step+-- issue a message when trace level >= 1, issue document source if level >= 3, issue tree when level is >= 4++traceDoc :: String -> IOStateArrow s XmlTree XmlTree+traceDoc msg = traceMsg 1 msg+ >>>+ traceSource+ >>>+ traceTree++-- ----------------------------------------------------------++traceOutputToStderr :: Int -> String -> IO ()+traceOutputToStderr _level msg+ = do+ hPutStrLn stderr msg+ hFlush stderr++-- ----------------------------------------------------------+
+ src/Text/XML/HXT/Arrow/XmlState/TypeDefs.hs view
@@ -0,0 +1,809 @@+-- ------------------------------------------------------------++{- |+ Module : Text.XML.HXT.Arrow.XmlState.TypeDefs+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ the basic state arrows for XML processing++ A state is needed for global processing options,+ like encoding options, document base URI, trace levels+ and error message handling++ The state is separated into a user defined state+ and a system state. The system state contains variables+ for error message handling, for tracing, for the document base+ for accessing XML documents with relative references, e.g. DTDs,+ and a global key value store. This assoc list has strings as keys+ and lists of XmlTrees as values. It is used to store arbitrary+ XML and text values, e.g. user defined global options.++ The user defined part of the store is in the default case empty, defined as ().+ It can be extended with an arbitray data type++-}++-- ------------------------------------------------------------++module Text.XML.HXT.Arrow.XmlState.TypeDefs+ ( module Text.XML.HXT.Arrow.XmlState.TypeDefs+ , Selector(..)+ , chgS+ , idS+ , (.&&&.)+ )+where++import Control.Arrow -- arrow classes+import Control.Arrow.ArrowList+import Control.Arrow.IOStateListArrow+import Control.DeepSeq++import Data.ByteString.Lazy ( ByteString )+import Data.Char ( isDigit )+import Data.Function.Selector ( Selector(..)+ , chgS+ , idS+ , (.&&&.)+ )++import Text.XML.HXT.DOM.Interface++-- ------------------------------------------------------------+{- datatypes -}++-- |+-- state datatype consists of a system state and a user state+-- the user state is not fixed++data XIOState us = XIOState { xioSysState :: ! XIOSysState+ , xioUserState :: ! us+ }++instance (NFData us) => NFData (XIOState us) where+ rnf (XIOState sys usr) = rnf sys `seq` rnf usr++-- |+-- The arrow type for stateful arrows++type IOStateArrow s b c = IOSLA (XIOState s) b c++-- |+-- The arrow for stateful arrows with no user defined state++type IOSArrow b c = IOStateArrow () b c++-- ------------------------------------------------------------++-- user state functions++-- | read the user defined part of the state++getUserState :: IOStateArrow s b s+getUserState+ = IOSLA $ \ s _ ->+ return (s, [xioUserState s])++-- | change the user defined part of the state++changeUserState :: (b -> s -> s) -> IOStateArrow s b b+changeUserState cf+ = IOSLA $ \ s v ->+ let s' = s { xioUserState = cf v (xioUserState s) }+ in return (s', [v])++-- | set the user defined part of the state++setUserState :: IOStateArrow s s s+setUserState+ = changeUserState const++-- | extend user state+--+-- Run an arrow with an extended user state component, The old component+-- is stored together with a new one in a pair, the arrow is executed with this+-- extended state, and the augmented state component is removed form the state+-- when the arrow has finished its execution++withExtendedUserState :: s1 -> IOStateArrow (s1, s0) b c -> IOStateArrow s0 b c+withExtendedUserState initS1 f+ = IOSLA $ \ s0 x ->+ do+ ~(finalS, res) <- runIOSLA f ( XIOState { xioSysState = xioSysState s0+ , xioUserState = (initS1, xioUserState s0)+ }+ ) x+ return ( XIOState { xioSysState = xioSysState finalS+ , xioUserState = snd (xioUserState finalS)+ }+ , res+ )++-- | change the type of user state+--+-- This conversion is useful, when running a state arrow with another+-- structure of the user state, e.g. with () when executing some IO arrows++withOtherUserState :: s1 -> IOStateArrow s1 b c -> IOStateArrow s0 b c+withOtherUserState s1 f+ = IOSLA $ \ s x ->+ do+ (s', res) <- runIOSLA f ( XIOState { xioSysState = xioSysState s+ , xioUserState = s1+ }+ ) x+ return ( XIOState { xioSysState = xioSysState s'+ , xioUserState = xioUserState s+ }+ , res+ )++withoutUserState :: IOSArrow b c -> IOStateArrow s0 b c+withoutUserState = withOtherUserState ()++-- ------------------------------------------------------------++-- system state structure and acces functions++-- |+-- predefined system state data type with all components for the+-- system functions, like trace, error handling, ...++data XIOSysState = XIOSys { xioSysWriter :: ! XIOSysWriter+ , xioSysEnv :: ! XIOSysEnv+ }++instance NFData XIOSysState -- all fields of interest are strict++data XIOSysWriter = XIOwrt { xioErrorMsgList :: ! XmlTrees+ }++data XIOSysEnv = XIOEnv { xioTraceLevel :: ! Int+ , xioTraceCmd :: Int -> String -> IO ()+ , xioErrorStatus :: ! Int+ , xioErrorMsgHandler :: String -> IO ()+ , xioErrorMsgCollect :: ! Bool+ , xioBaseURI :: ! String+ , xioDefaultBaseURI :: ! String+ , xioAttrList :: ! Attributes+ , xioInputConfig :: ! XIOInputConfig+ , xioParseConfig :: ! XIOParseConfig+ , xioOutputConfig :: ! XIOOutputConfig+ , xioRelaxConfig :: ! XIORelaxConfig+ , xioCacheConfig :: ! XIOCacheConfig+ }++data XIOInputConfig = XIOIcgf { xioStrictInput :: ! Bool+ , xioEncodingErrors :: ! Bool+ , xioInputEncoding :: String+ , xioHttpHandler :: IOSArrow XmlTree XmlTree+ , xioInputOptions :: ! Attributes+ , xioRedirect :: ! Bool+ , xioProxy :: String+ }++data XIOParseConfig = XIOPcfg { xioMimeTypes :: MimeTypeTable+ , xioMimeTypeFile :: String+ , xioAcceptedMimeTypes :: [String]+ , xioWarnings :: ! Bool+ , xioRemoveWS :: ! Bool+ , xioParseByMimeType :: ! Bool+ , xioParseHTML :: ! Bool+ , xioLowerCaseNames :: ! Bool+ , xioPreserveComment :: ! Bool+ , xioValidate :: ! Bool+ , xioCheckNamespaces :: ! Bool+ , xioCanonicalize :: ! Bool+ , xioIgnoreNoneXmlContents :: ! Bool+ , xioTagSoup :: ! Bool+ , xioTagSoupParser :: IOSArrow XmlTree XmlTree+ }++data XIOOutputConfig = XIOOcfg { xioIndent :: ! Bool+ , xioOutputEncoding :: ! String+ , xioOutputFmt :: ! XIOXoutConfig+ , xioXmlPi :: ! Bool+ , xioNoEmptyElemFor :: ! [String]+ , xioAddDefaultDTD :: ! Bool+ , xioTextMode :: ! Bool+ , xioShowTree :: ! Bool+ , xioShowHaskell :: ! Bool+ }+data XIOXoutConfig = XMLoutput | XHTMLoutput | HTMLoutput | PLAINoutput+ deriving (Eq)++data XIORelaxConfig = XIORxc { xioRelaxValidate :: ! Bool+ , xioRelaxSchema :: String+ , xioRelaxCheckRestr :: ! Bool+ , xioRelaxValidateExtRef :: ! Bool+ , xioRelaxValidateInclude :: ! Bool+ , xioRelaxCollectErrors :: ! Bool+ , xioRelaxNoOfErrors :: ! Int+ , xioRelaxDefineId :: ! Int+ , xioRelaxAttrList :: AssocList String XmlTrees+ , xioRelaxValidator :: IOSArrow XmlTree XmlTree+ }++data XIOCacheConfig = XIOCch { xioBinaryCompression :: CompressionFct+ , xioBinaryDeCompression :: DeCompressionFct+ , xioWithCache :: ! Bool+ , xioCacheDir :: ! String+ , xioDocumentAge :: ! Int+ , xioCache404Err :: ! Bool+ , xioCacheRead :: String -> IOSArrow XmlTree XmlTree+ }++type CompressionFct = ByteString -> ByteString+type DeCompressionFct = ByteString -> ByteString++type SysConfig = XIOSysState -> XIOSysState+type SysConfigList = [SysConfig]++-- ----------------------------------------++theSysState :: Selector (XIOState us) XIOSysState+theSysState = S { getS = xioSysState+ , setS = \ x s -> s { xioSysState = x}+ }++theUserState :: Selector (XIOState us) us+theUserState = S { getS = xioUserState+ , setS = \ x s -> s { xioUserState = x}+ }++-- ----------------------------------------++theSysWriter :: Selector XIOSysState XIOSysWriter+theSysWriter = S { getS = xioSysWriter+ , setS = \ x s -> s { xioSysWriter = x}+ }++theErrorMsgList :: Selector XIOSysState XmlTrees+theErrorMsgList = theSysWriter+ >>>+ S { getS = xioErrorMsgList+ , setS = \ x s -> s { xioErrorMsgList = x }+ }++-- ----------------------------------------++theSysEnv :: Selector XIOSysState XIOSysEnv+theSysEnv = S { getS = xioSysEnv+ , setS = \ x s -> s { xioSysEnv = x}+ }++theInputConfig :: Selector XIOSysState XIOInputConfig+theInputConfig = theSysEnv+ >>>+ S { getS = xioInputConfig+ , setS = \ x s -> s { xioInputConfig = x}+ }++theStrictInput :: Selector XIOSysState Bool+theStrictInput = theInputConfig+ >>>+ S { getS = xioStrictInput+ , setS = \ x s -> s { xioStrictInput = x}+ }++theEncodingErrors :: Selector XIOSysState Bool+theEncodingErrors = theInputConfig+ >>>+ S { getS = xioEncodingErrors+ , setS = \ x s -> s { xioEncodingErrors = x}+ }++theInputEncoding :: Selector XIOSysState String+theInputEncoding = theInputConfig+ >>>+ S { getS = xioInputEncoding+ , setS = \ x s -> s { xioInputEncoding = x}+ }++theHttpHandler :: Selector XIOSysState (IOSArrow XmlTree XmlTree)+theHttpHandler = theInputConfig+ >>>+ S { getS = xioHttpHandler+ , setS = \ x s -> s { xioHttpHandler = x}+ }++theInputOptions :: Selector XIOSysState Attributes+theInputOptions = theInputConfig+ >>>+ S { getS = xioInputOptions+ , setS = \ x s -> s { xioInputOptions = x}+ }++theRedirect :: Selector XIOSysState Bool+theRedirect = theInputConfig+ >>>+ S { getS = xioRedirect+ , setS = \ x s -> s { xioRedirect = x}+ }++theProxy :: Selector XIOSysState String+theProxy = theInputConfig+ >>>+ S { getS = xioProxy+ , setS = \ x s -> s { xioProxy = x}+ }++-- ----------------------------------------++theOutputConfig :: Selector XIOSysState XIOOutputConfig+theOutputConfig = theSysEnv+ >>>+ S { getS = xioOutputConfig+ , setS = \ x s -> s { xioOutputConfig = x}+ }++theIndent :: Selector XIOSysState Bool+theIndent = theOutputConfig+ >>>+ S { getS = xioIndent+ , setS = \ x s -> s { xioIndent = x}+ }++theOutputEncoding :: Selector XIOSysState String+theOutputEncoding = theOutputConfig+ >>>+ S { getS = xioOutputEncoding+ , setS = \ x s -> s { xioOutputEncoding = x}+ }++theOutputFmt :: Selector XIOSysState XIOXoutConfig+theOutputFmt = theOutputConfig+ >>>+ S { getS = xioOutputFmt+ , setS = \ x s -> s { xioOutputFmt = x}+ }++theXmlPi :: Selector XIOSysState Bool+theXmlPi = theOutputConfig+ >>>+ S { getS = xioXmlPi+ , setS = \ x s -> s { xioXmlPi = x}+ }++theNoEmptyElemFor :: Selector XIOSysState [String]+theNoEmptyElemFor = theOutputConfig+ >>>+ S { getS = xioNoEmptyElemFor+ , setS = \ x s -> s { xioNoEmptyElemFor = x}+ }++theAddDefaultDTD :: Selector XIOSysState Bool+theAddDefaultDTD = theOutputConfig+ >>>+ S { getS = xioAddDefaultDTD+ , setS = \ x s -> s { xioAddDefaultDTD = x}+ }++theTextMode :: Selector XIOSysState Bool+theTextMode = theOutputConfig+ >>>+ S { getS = xioTextMode+ , setS = \ x s -> s { xioTextMode = x}+ }++theShowTree :: Selector XIOSysState Bool+theShowTree = theOutputConfig+ >>>+ S { getS = xioShowTree+ , setS = \ x s -> s { xioShowTree = x}+ }++theShowHaskell :: Selector XIOSysState Bool+theShowHaskell = theOutputConfig+ >>>+ S { getS = xioShowHaskell+ , setS = \ x s -> s { xioShowHaskell = x}+ }++-- ----------------------------------------++theRelaxConfig :: Selector XIOSysState XIORelaxConfig+theRelaxConfig = theSysEnv+ >>>+ S { getS = xioRelaxConfig+ , setS = \ x s -> s { xioRelaxConfig = x}+ }++theRelaxValidate :: Selector XIOSysState Bool+theRelaxValidate = theRelaxConfig+ >>>+ S { getS = xioRelaxValidate+ , setS = \ x s -> s { xioRelaxValidate = x}+ }++theRelaxSchema :: Selector XIOSysState String+theRelaxSchema = theRelaxConfig+ >>>+ S { getS = xioRelaxSchema+ , setS = \ x s -> s { xioRelaxSchema = x}+ }++theRelaxCheckRestr :: Selector XIOSysState Bool+theRelaxCheckRestr = theRelaxConfig+ >>>+ S { getS = xioRelaxCheckRestr+ , setS = \ x s -> s { xioRelaxCheckRestr = x}+ }++theRelaxValidateExtRef :: Selector XIOSysState Bool+theRelaxValidateExtRef = theRelaxConfig+ >>>+ S { getS = xioRelaxValidateExtRef+ , setS = \ x s -> s { xioRelaxValidateExtRef = x}+ }++theRelaxValidateInclude :: Selector XIOSysState Bool+theRelaxValidateInclude = theRelaxConfig+ >>>+ S { getS = xioRelaxValidateInclude+ , setS = \ x s -> s { xioRelaxValidateInclude = x}+ }++theRelaxCollectErrors :: Selector XIOSysState Bool+theRelaxCollectErrors = theRelaxConfig+ >>>+ S { getS = xioRelaxCollectErrors+ , setS = \ x s -> s { xioRelaxCollectErrors = x}+ }++theRelaxNoOfErrors :: Selector XIOSysState Int+theRelaxNoOfErrors = theRelaxConfig+ >>>+ S { getS = xioRelaxNoOfErrors+ , setS = \ x s -> s { xioRelaxNoOfErrors = x}+ }++theRelaxDefineId :: Selector XIOSysState Int+theRelaxDefineId = theRelaxConfig+ >>>+ S { getS = xioRelaxDefineId+ , setS = \ x s -> s { xioRelaxDefineId = x}+ }++theRelaxAttrList :: Selector XIOSysState (AssocList String XmlTrees)+theRelaxAttrList = theRelaxConfig+ >>>+ S { getS = xioRelaxAttrList+ , setS = \ x s -> s { xioRelaxAttrList = x}+ }++theRelaxValidator :: Selector XIOSysState (IOSArrow XmlTree XmlTree)+theRelaxValidator = theRelaxConfig+ >>>+ S { getS = xioRelaxValidator+ , setS = \ x s -> s { xioRelaxValidator = x}+ }++-- ----------------------------------------++theParseConfig :: Selector XIOSysState XIOParseConfig+theParseConfig = theSysEnv+ >>>+ S { getS = xioParseConfig+ , setS = \ x s -> s { xioParseConfig = x}+ }++theErrorStatus :: Selector XIOSysState Int+theErrorStatus = theSysEnv+ >>>+ S { getS = xioErrorStatus+ , setS = \ x s -> s { xioErrorStatus = x }+ }++theErrorMsgHandler :: Selector XIOSysState (String -> IO ())+theErrorMsgHandler = theSysEnv+ >>>+ S { getS = xioErrorMsgHandler+ , setS = \ x s -> s { xioErrorMsgHandler = x }+ }++theErrorMsgCollect :: Selector XIOSysState Bool+theErrorMsgCollect = theSysEnv+ >>>+ S { getS = xioErrorMsgCollect+ , setS = \ x s -> s { xioErrorMsgCollect = x }+ }++theBaseURI :: Selector XIOSysState String+theBaseURI = theSysEnv+ >>>+ S { getS = xioBaseURI+ , setS = \ x s -> s { xioBaseURI = x }+ }++theDefaultBaseURI :: Selector XIOSysState String+theDefaultBaseURI = theSysEnv+ >>>+ S { getS = xioDefaultBaseURI+ , setS = \ x s -> s { xioDefaultBaseURI = x }+ }++theTraceLevel :: Selector XIOSysState Int+theTraceLevel = theSysEnv+ >>>+ S { getS = xioTraceLevel+ , setS = \ x s -> s { xioTraceLevel = x }+ }++theTraceCmd :: Selector XIOSysState (Int -> String -> IO ())+theTraceCmd = theSysEnv+ >>>+ S { getS = xioTraceCmd+ , setS = \ x s -> s { xioTraceCmd = x }+ }++theTrace :: Selector XIOSysState (Int, Int -> String -> IO ())+theTrace = theTraceLevel .&&&. theTraceCmd++theAttrList :: Selector XIOSysState Attributes+theAttrList = theSysEnv+ >>>+ S { getS = xioAttrList+ , setS = \ x s -> s { xioAttrList = x }+ }++theMimeTypes :: Selector XIOSysState MimeTypeTable+theMimeTypes = theParseConfig+ >>>+ S { getS = xioMimeTypes+ , setS = \ x s -> s { xioMimeTypes = x }+ }++theMimeTypeFile :: Selector XIOSysState String+theMimeTypeFile = theParseConfig+ >>>+ S { getS = xioMimeTypeFile+ , setS = \ x s -> s { xioMimeTypeFile = x }+ }++theAcceptedMimeTypes :: Selector XIOSysState [String]+theAcceptedMimeTypes = theParseConfig+ >>>+ S { getS = xioAcceptedMimeTypes+ , setS = \ x s -> s { xioAcceptedMimeTypes = x }+ }++theWarnings :: Selector XIOSysState Bool+theWarnings = theParseConfig+ >>>+ S { getS = xioWarnings+ , setS = \ x s -> s { xioWarnings = x }+ }++theRemoveWS :: Selector XIOSysState Bool+theRemoveWS = theParseConfig+ >>>+ S { getS = xioRemoveWS+ , setS = \ x s -> s { xioRemoveWS = x }+ }++thePreserveComment :: Selector XIOSysState Bool+thePreserveComment = theParseConfig+ >>>+ S { getS = xioPreserveComment+ , setS = \ x s -> s { xioPreserveComment = x }+ }++theParseByMimeType :: Selector XIOSysState Bool+theParseByMimeType = theParseConfig+ >>>+ S { getS = xioParseByMimeType+ , setS = \ x s -> s { xioParseByMimeType = x }+ }++theParseHTML :: Selector XIOSysState Bool+theParseHTML = theParseConfig+ >>>+ S { getS = xioParseHTML+ , setS = \ x s -> s { xioParseHTML = x }+ }++theLowerCaseNames :: Selector XIOSysState Bool+theLowerCaseNames = theParseConfig+ >>>+ S { getS = xioLowerCaseNames+ , setS = \ x s -> s { xioLowerCaseNames = x }+ }++theValidate :: Selector XIOSysState Bool+theValidate = theParseConfig+ >>>+ S { getS = xioValidate+ , setS = \ x s -> s { xioValidate = x }+ }++theCheckNamespaces :: Selector XIOSysState Bool+theCheckNamespaces = theParseConfig+ >>>+ S { getS = xioCheckNamespaces+ , setS = \ x s -> s { xioCheckNamespaces = x }+ }++theCanonicalize :: Selector XIOSysState Bool+theCanonicalize = theParseConfig+ >>>+ S { getS = xioCanonicalize+ , setS = \ x s -> s { xioCanonicalize = x }+ }++theIgnoreNoneXmlContents :: Selector XIOSysState Bool+theIgnoreNoneXmlContents = theParseConfig+ >>>+ S { getS = xioIgnoreNoneXmlContents+ , setS = \ x s -> s { xioIgnoreNoneXmlContents = x }+ }++theTagSoup :: Selector XIOSysState Bool+theTagSoup = theParseConfig+ >>>+ S { getS = xioTagSoup+ , setS = \ x s -> s { xioTagSoup = x }+ }++theTagSoupParser :: Selector XIOSysState (IOSArrow XmlTree XmlTree)+theTagSoupParser = theParseConfig+ >>>+ S { getS = xioTagSoupParser+ , setS = \ x s -> s { xioTagSoupParser = x }+ }++-- ----------------------------------------++theCacheConfig :: Selector XIOSysState XIOCacheConfig+theCacheConfig = theSysEnv+ >>>+ S { getS = xioCacheConfig+ , setS = \ x s -> s { xioCacheConfig = x}+ }++theBinaryCompression :: Selector XIOSysState (ByteString -> ByteString)+theBinaryCompression = theCacheConfig+ >>>+ S { getS = xioBinaryCompression+ , setS = \ x s -> s { xioBinaryCompression = x}+ }++theBinaryDeCompression :: Selector XIOSysState (ByteString -> ByteString)+theBinaryDeCompression = theCacheConfig+ >>>+ S { getS = xioBinaryDeCompression+ , setS = \ x s -> s { xioBinaryDeCompression = x}+ }++theWithCache :: Selector XIOSysState Bool+theWithCache = theCacheConfig+ >>>+ S { getS = xioWithCache+ , setS = \ x s -> s { xioWithCache = x}+ }++theCacheDir :: Selector XIOSysState String+theCacheDir = theCacheConfig+ >>>+ S { getS = xioCacheDir+ , setS = \ x s -> s { xioCacheDir = x}+ }++theDocumentAge :: Selector XIOSysState Int+theDocumentAge = theCacheConfig+ >>>+ S { getS = xioDocumentAge+ , setS = \ x s -> s { xioDocumentAge = x}+ }++theCache404Err :: Selector XIOSysState Bool+theCache404Err = theCacheConfig+ >>>+ S { getS = xioCache404Err+ , setS = \ x s -> s { xioCache404Err = x}+ }++theCacheRead :: Selector XIOSysState (String -> IOSArrow XmlTree XmlTree)+theCacheRead = theCacheConfig+ >>>+ S { getS = xioCacheRead+ , setS = \ x s -> s { xioCacheRead = x}+ }++-- ------------------------------------------------------------++getSysVar :: Selector XIOSysState c -> IOStateArrow s b c+getSysVar sel = IOSLA $ \ s _x ->+ return (s, (:[]) . getS (theSysState >>> sel) $ s)++setSysVar :: Selector XIOSysState c -> IOStateArrow s c c+setSysVar sel = (\ v -> configSysVar $ setS sel v) $< this++chgSysVar :: Selector XIOSysState c -> (b -> c -> c) -> IOStateArrow s b b+chgSysVar sel op = (\ v -> configSysVar $ chgS sel (op v)) $< this++configSysVar :: SysConfig -> IOStateArrow s c c+configSysVar cf = IOSLA $ \ s v ->+ return (chgS theSysState cf s, [v])++configSysVars :: SysConfigList -> IOStateArrow s c c+configSysVars cfs = configSysVar $ foldr (>>>) id $ cfs++localSysVar :: Selector XIOSysState c -> IOStateArrow s a b -> IOStateArrow s a b+localSysVar sel f = IOSLA $ \ s0 v ->+ let sel' = theSysState >>> sel in+ let c0 = getS sel' s0 in+ do+ (s1, res) <- runIOSLA f s0 v+ return (setS sel' c0 s1, res)++localSysEnv :: IOStateArrow s a b -> IOStateArrow s a b+localSysEnv = localSysVar theSysEnv++incrSysVar :: Selector XIOSysState Int -> IOStateArrow s a Int+incrSysVar cnt = getSysVar cnt+ >>>+ arr (+1)+ >>>+ setSysVar cnt+ >>>+ arr (\ x -> x - 1)++-- ------------------------------++-- | store a string in global state under a given attribute name++setSysAttr :: String -> IOStateArrow s String String+setSysAttr n = chgSysVar theAttrList (addEntry n)++-- | remove an entry in global state, arrow input remains unchanged++unsetSysAttr :: String -> IOStateArrow s b b+unsetSysAttr n = configSysVar $ chgS theAttrList (delEntry n)++-- | read an attribute value from global state++getSysAttr :: String -> IOStateArrow s b String+getSysAttr n = getSysVar theAttrList+ >>^+ lookup1 n++-- | read all attributes from global state++getAllSysAttrs :: IOStateArrow s b Attributes+getAllSysAttrs = getSysVar theAttrList+++setSysAttrString :: String -> String -> IOStateArrow s b b+setSysAttrString n v = perform ( constA v+ >>>+ setSysAttr n+ )++-- | store an int value in global state++setSysAttrInt :: String -> Int -> IOStateArrow s b b+setSysAttrInt n v = setSysAttrString n (show v)++-- | read an int value from global state+--+-- > getSysAttrInt 0 myIntAttr++getSysAttrInt :: Int -> String -> IOStateArrow s b Int+getSysAttrInt def n = getSysAttr n+ >>^+ toInt def++toInt :: Int -> String -> Int+toInt def s+ | not (null s)+ &&+ all isDigit s = read s+ | otherwise = def++-- ------------------------------------------------------------
+ src/Text/XML/HXT/Arrow/XmlState/URIHandling.hs view
@@ -0,0 +1,239 @@+-- ------------------------------------------------------------++{- |+ Module : Text.XML.HXT.Arrow.XmlState.URIHandling+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ the basic state arrows for URI handling++-}++-- ------------------------------------------------------------++module Text.XML.HXT.Arrow.XmlState.URIHandling+where++import Control.Arrow -- arrow classes+import Control.Arrow.ArrowList+import Control.Arrow.ArrowIf++import Control.Arrow.ArrowIO++import Control.Monad ( mzero+ , mplus )++import Text.XML.HXT.Arrow.XmlArrow+import Text.XML.HXT.Arrow.XmlState.TypeDefs+import Text.XML.HXT.Arrow.XmlState.TraceHandling++import Data.Maybe++import Network.URI ( URI+ , escapeURIChar+ , isUnescapedInURI+ , nonStrictRelativeTo+ , parseURIReference+ , uriAuthority+ , uriFragment+ , uriPath+ , uriPort+ , uriQuery+ , uriRegName+ , uriScheme+ , uriUserInfo+ )++import System.Directory ( getCurrentDirectory )++-- ------------------------------------------------------------++-- | set the base URI of a document, used e.g. for reading includes, e.g. external entities,+-- the input must be an absolute URI++setBaseURI :: IOStateArrow s String String+setBaseURI = setSysVar theBaseURI+ >>>+ traceValue 2 (("setBaseURI: new base URI is " ++) . show)++-- | read the base URI from the globale state++getBaseURI :: IOStateArrow s b String+getBaseURI = getSysVar theBaseURI+ >>>+ ( ( getDefaultBaseURI+ >>>+ setBaseURI+ >>>+ getBaseURI+ )+ `when`+ isA null -- set and get it, if not yet done+ )++-- | change the base URI with a possibly relative URI, can be used for+-- evaluating the xml:base attribute. Returns the new absolute base URI.+-- Fails, if input is not parsable with parseURIReference+--+-- see also: 'setBaseURI', 'mkAbsURI'++changeBaseURI :: IOStateArrow s String String+changeBaseURI = mkAbsURI >>> setBaseURI++-- | set the default base URI, if parameter is null, the system base (@ file:\/\/\/\<cwd\>\/ @) is used,+-- else the parameter, must be called before any document is read++setDefaultBaseURI :: String -> IOStateArrow s b String+setDefaultBaseURI base = ( if null base+ then arrIO getDir+ else constA base+ )+ >>>+ setSysVar theDefaultBaseURI+ >>>+ traceValue 2 (("setDefaultBaseURI: new default base URI is " ++) . show)+ where+ getDir _ = do+ cwd <- getCurrentDirectory+ return ("file://" ++ normalize cwd ++ "/")++ -- under Windows getCurrentDirectory returns something like: "c:\path\to\file"+ -- backslaches are not allowed in URIs and paths must start with a /+ -- so this is transformed into "/c:/path/to/file"++ normalize wd'@(d : ':' : _)+ | d `elem` ['A'..'Z']+ ||+ d `elem` ['a'..'z']+ = '/' : concatMap win32ToUriChar wd'+ normalize wd' = concatMap escapeNonUriChar wd'++ win32ToUriChar '\\' = "/"+ win32ToUriChar c = escapeNonUriChar c++ escapeNonUriChar c = escapeURIChar isUnescapedInURI c -- from Network.URI+++-- | get the default base URI++getDefaultBaseURI :: IOStateArrow s b String+getDefaultBaseURI = getSysVar theDefaultBaseURI -- read default uri in system state+ >>>+ ( ( setDefaultBaseURI "" -- set the default uri in system state+ >>>+ getDefaultBaseURI+ )+ `when` isA null+ ) -- when uri not yet set++-- ------------------------------------------------------------++-- | remember base uri, run an arrow and restore the base URI, used with external entity substitution++runInLocalURIContext :: IOStateArrow s b c -> IOStateArrow s b c+runInLocalURIContext f = localSysVar theBaseURI f++-- ----------------------------------------------------------++-- | parse a URI reference, in case of a failure,+-- try to escape unescaped chars, convert backslashes to slashes for windows paths,+-- and try parsing again++parseURIReference' :: String -> Maybe URI+parseURIReference' uri+ = parseURIReference uri+ `mplus`+ ( if unesc+ then parseURIReference uri'+ else mzero+ )+ where+ unesc = not . all isUnescapedInURI $ uri++ escape '\\' = "/"+ escape c = escapeURIChar isUnescapedInURI c++ uri' = concatMap escape uri++-- | compute the absolut URI for a given URI and a base URI++expandURIString :: String -> String -> Maybe String+expandURIString uri base+ = do+ base' <- parseURIReference' base+ uri' <- parseURIReference' uri+ abs' <- nonStrictRelativeTo uri' base'+ return $ show abs'++-- | arrow variant of 'expandURIString', fails if 'expandURIString' returns Nothing++expandURI :: ArrowXml a => a (String, String) String+expandURI+ = arrL (maybeToList . uncurry expandURIString)++-- | arrow for expanding an input URI into an absolute URI using global base URI, fails if input is not a legal URI++mkAbsURI :: IOStateArrow s String String+mkAbsURI+ = ( this &&& getBaseURI ) >>> expandURI++-- | arrow for selecting the scheme (protocol) of the URI, fails if input is not a legal URI.+--+-- See Network.URI for URI components++getSchemeFromURI :: ArrowList a => a String String+getSchemeFromURI = getPartFromURI scheme+ where+ scheme = init . uriScheme++-- | arrow for selecting the registered name (host) of the URI, fails if input is not a legal URI++getRegNameFromURI :: ArrowList a => a String String+getRegNameFromURI = getPartFromURI host+ where+ host = maybe "" uriRegName . uriAuthority++-- | arrow for selecting the port number of the URI without leading \':\', fails if input is not a legal URI++getPortFromURI :: ArrowList a => a String String+getPortFromURI = getPartFromURI port+ where+ port = dropWhile (==':') . maybe "" uriPort . uriAuthority++-- | arrow for selecting the user info of the URI without trailing \'\@\', fails if input is not a legal URI++getUserInfoFromURI :: ArrowList a => a String String+getUserInfoFromURI = getPartFromURI ui+ where+ ui = reverse . dropWhile (=='@') . reverse . maybe "" uriUserInfo . uriAuthority++-- | arrow for computing the path component of an URI, fails if input is not a legal URI++getPathFromURI :: ArrowList a => a String String+getPathFromURI = getPartFromURI uriPath++-- | arrow for computing the query component of an URI, fails if input is not a legal URI++getQueryFromURI :: ArrowList a => a String String+getQueryFromURI = getPartFromURI uriQuery++-- | arrow for computing the fragment component of an URI, fails if input is not a legal URI++getFragmentFromURI :: ArrowList a => a String String+getFragmentFromURI = getPartFromURI uriFragment++-- | arrow for computing the path component of an URI, fails if input is not a legal URI++getPartFromURI :: ArrowList a => (URI -> String) -> a String String+getPartFromURI sel+ = arrL (maybeToList . getPart)+ where+ getPart s = do+ uri <- parseURIReference' s+ return (sel uri)++-- ------------------------------------------------------------
+ src/Text/XML/HXT/Core.hs view
@@ -0,0 +1,69 @@+-- ------------------------------------------------------------++{- |+ Module : Text.XML.HXT.Core+ Copyright : Copyright (C) 2006-2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ The HXT arrow interface++ The application programming interface to the arrow modules of the Haskell XML Toolbox.+ This module exports all important arrows for input, output, parsing, validating and transforming XML.+ It also exports all basic datatypes and functions of the toolbox.++-}++-- ------------------------------------------------------------++module Text.XML.HXT.Core+ ( module Control.Arrow.ListArrows++ , module Text.XML.HXT.DOM.Interface++ , module Text.XML.HXT.Arrow.XmlArrow+ , module Text.XML.HXT.Arrow.XmlState++ , module Text.XML.HXT.Arrow.DocumentInput+ , module Text.XML.HXT.Arrow.DocumentOutput+ , module Text.XML.HXT.Arrow.Edit+ , module Text.XML.HXT.Arrow.GeneralEntitySubstitution+ , module Text.XML.HXT.Arrow.Namespace+ , module Text.XML.HXT.Arrow.Pickle+ , module Text.XML.HXT.Arrow.ProcessDocument+ , module Text.XML.HXT.Arrow.ReadDocument+ , module Text.XML.HXT.Arrow.WriteDocument+ , module Text.XML.HXT.Arrow.Binary+ , module Text.XML.HXT.Arrow.XmlOptions++ , module Text.XML.HXT.Version+ )+where++import Control.Arrow.ListArrows -- arrow classes++import Data.Atom () -- import this explicitly++import Text.XML.HXT.DOM.Interface++import Text.XML.HXT.Arrow.DocumentInput+import Text.XML.HXT.Arrow.DocumentOutput+import Text.XML.HXT.Arrow.Edit+import Text.XML.HXT.Arrow.GeneralEntitySubstitution+import Text.XML.HXT.Arrow.Namespace+import Text.XML.HXT.Arrow.Pickle+import Text.XML.HXT.Arrow.ProcessDocument+import Text.XML.HXT.Arrow.ReadDocument+import Text.XML.HXT.Arrow.WriteDocument+import Text.XML.HXT.Arrow.XmlArrow+import Text.XML.HXT.Arrow.XmlOptions+import Text.XML.HXT.Arrow.XmlState+import Text.XML.HXT.Arrow.XmlRegex () -- import this explicitly+import Text.XML.HXT.Arrow.Binary++import Text.XML.HXT.Version++-- ------------------------------------------------------------
src/Text/XML/HXT/DOM/Interface.hs view
@@ -21,16 +21,15 @@ ( module Text.XML.HXT.DOM.XmlKeywords , module Text.XML.HXT.DOM.TypeDefs , module Text.XML.HXT.DOM.Util- , module Text.XML.HXT.DOM.XmlOptions , module Text.XML.HXT.DOM.MimeTypes+ , module Data.String.EncodingNames ) where import Text.XML.HXT.DOM.XmlKeywords -- constants import Text.XML.HXT.DOM.TypeDefs -- XML Tree types import Text.XML.HXT.DOM.Util-import Text.XML.HXT.DOM.XmlOptions -- predefined options import Text.XML.HXT.DOM.MimeTypes -- mime types related stuff-+import Data.String.EncodingNames -- char encoding names for readDocument -- ------------------------------------------------------------
− src/Text/XML/HXT/DOM/IsoLatinTables.hs
@@ -1,719 +0,0 @@-module Text.XML.HXT.DOM.IsoLatinTables-where--iso_8859_2 :: [(Char, Char)]-iso_8859_2- = [ ('\161', '\260' )- , ('\162', '\728' )- , ('\163', '\321' )- , ('\165', '\317' )- , ('\166', '\346' )- , ('\169', '\352' )- , ('\170', '\350' )- , ('\171', '\356' )- , ('\172', '\377' )- , ('\174', '\381' )- , ('\175', '\379' )- , ('\177', '\261' )- , ('\178', '\731' )- , ('\179', '\322' )- , ('\181', '\318' )- , ('\182', '\347' )- , ('\183', '\711' )- , ('\185', '\353' )- , ('\186', '\351' )- , ('\187', '\357' )- , ('\188', '\378' )- , ('\189', '\733' )- , ('\190', '\382' )- , ('\191', '\380' )- , ('\192', '\340' )- , ('\195', '\258' )- , ('\197', '\313' )- , ('\198', '\262' )- , ('\200', '\268' )- , ('\202', '\280' )- , ('\204', '\282' )- , ('\207', '\270' )- , ('\208', '\272' )- , ('\209', '\323' )- , ('\210', '\327' )- , ('\213', '\336' )- , ('\216', '\344' )- , ('\217', '\366' )- , ('\219', '\368' )- , ('\222', '\354' )- , ('\224', '\341' )- , ('\227', '\259' )- , ('\229', '\314' )- , ('\230', '\263' )- , ('\232', '\269' )- , ('\234', '\281' )- , ('\236', '\283' )- , ('\239', '\271' )- , ('\240', '\273' )- , ('\241', '\324' )- , ('\242', '\328' )- , ('\245', '\337' )- , ('\248', '\345' )- , ('\249', '\367' )- , ('\251', '\369' )- , ('\254', '\355' )- , ('\255', '\729' )- ]--iso_8859_3 :: [(Char, Char)]-iso_8859_3- = [ ('\161', '\294' )- , ('\162', '\728' )- , ('\166', '\292' )- , ('\169', '\304' )- , ('\170', '\350' )- , ('\171', '\286' )- , ('\172', '\308' )- , ('\175', '\379' )- , ('\177', '\295' )- , ('\182', '\293' )- , ('\185', '\305' )- , ('\186', '\351' )- , ('\187', '\287' )- , ('\188', '\309' )- , ('\191', '\380' )- , ('\197', '\266' )- , ('\198', '\264' )- , ('\213', '\288' )- , ('\216', '\284' )- , ('\221', '\364' )- , ('\222', '\348' )- , ('\229', '\267' )- , ('\230', '\265' )- , ('\245', '\289' )- , ('\248', '\285' )- , ('\253', '\365' )- , ('\254', '\349' )- , ('\255', '\729' )- ]--iso_8859_4 :: [(Char, Char)]-iso_8859_4- = [ ('\161', '\260' )- , ('\162', '\312' )- , ('\163', '\342' )- , ('\165', '\296' )- , ('\166', '\315' )- , ('\169', '\352' )- , ('\170', '\274' )- , ('\171', '\290' )- , ('\172', '\358' )- , ('\174', '\381' )- , ('\177', '\261' )- , ('\178', '\731' )- , ('\179', '\343' )- , ('\181', '\297' )- , ('\182', '\316' )- , ('\183', '\711' )- , ('\185', '\353' )- , ('\186', '\275' )- , ('\187', '\291' )- , ('\188', '\359' )- , ('\189', '\330' )- , ('\190', '\382' )- , ('\191', '\331' )- , ('\192', '\256' )- , ('\199', '\302' )- , ('\200', '\268' )- , ('\202', '\280' )- , ('\204', '\278' )- , ('\207', '\298' )- , ('\208', '\272' )- , ('\209', '\325' )- , ('\210', '\332' )- , ('\211', '\310' )- , ('\217', '\370' )- , ('\221', '\360' )- , ('\222', '\362' )- , ('\224', '\257' )- , ('\231', '\303' )- , ('\232', '\269' )- , ('\234', '\281' )- , ('\236', '\279' )- , ('\239', '\299' )- , ('\240', '\273' )- , ('\241', '\326' )- , ('\242', '\333' )- , ('\243', '\311' )- , ('\249', '\371' )- , ('\253', '\361' )- , ('\254', '\363' )- , ('\255', '\729' )- ]--iso_8859_5 :: [(Char, Char)]-iso_8859_5- = [ ('\161', '\1025' )- , ('\162', '\1026' )- , ('\163', '\1027' )- , ('\164', '\1028' )- , ('\165', '\1029' )- , ('\166', '\1030' )- , ('\167', '\1031' )- , ('\168', '\1032' )- , ('\169', '\1033' )- , ('\170', '\1034' )- , ('\171', '\1035' )- , ('\172', '\1036' )- , ('\174', '\1038' )- , ('\175', '\1039' )- , ('\176', '\1040' )- , ('\177', '\1041' )- , ('\178', '\1042' )- , ('\179', '\1043' )- , ('\180', '\1044' )- , ('\181', '\1045' )- , ('\182', '\1046' )- , ('\183', '\1047' )- , ('\184', '\1048' )- , ('\185', '\1049' )- , ('\186', '\1050' )- , ('\187', '\1051' )- , ('\188', '\1052' )- , ('\189', '\1053' )- , ('\190', '\1054' )- , ('\191', '\1055' )- , ('\192', '\1056' )- , ('\193', '\1057' )- , ('\194', '\1058' )- , ('\195', '\1059' )- , ('\196', '\1060' )- , ('\197', '\1061' )- , ('\198', '\1062' )- , ('\199', '\1063' )- , ('\200', '\1064' )- , ('\201', '\1065' )- , ('\202', '\1066' )- , ('\203', '\1067' )- , ('\204', '\1068' )- , ('\205', '\1069' )- , ('\206', '\1070' )- , ('\207', '\1071' )- , ('\208', '\1072' )- , ('\209', '\1073' )- , ('\210', '\1074' )- , ('\211', '\1075' )- , ('\212', '\1076' )- , ('\213', '\1077' )- , ('\214', '\1078' )- , ('\215', '\1079' )- , ('\216', '\1080' )- , ('\217', '\1081' )- , ('\218', '\1082' )- , ('\219', '\1083' )- , ('\220', '\1084' )- , ('\221', '\1085' )- , ('\222', '\1086' )- , ('\223', '\1087' )- , ('\224', '\1088' )- , ('\225', '\1089' )- , ('\226', '\1090' )- , ('\227', '\1091' )- , ('\228', '\1092' )- , ('\229', '\1093' )- , ('\230', '\1094' )- , ('\231', '\1095' )- , ('\232', '\1096' )- , ('\233', '\1097' )- , ('\234', '\1098' )- , ('\235', '\1099' )- , ('\236', '\1100' )- , ('\237', '\1101' )- , ('\238', '\1102' )- , ('\239', '\1103' )- , ('\240', '\8470' )- , ('\241', '\1105' )- , ('\242', '\1106' )- , ('\243', '\1107' )- , ('\244', '\1108' )- , ('\245', '\1109' )- , ('\246', '\1110' )- , ('\247', '\1111' )- , ('\248', '\1112' )- , ('\249', '\1113' )- , ('\250', '\1114' )- , ('\251', '\1115' )- , ('\252', '\1116' )- , ('\253', '\167' )- , ('\254', '\1118' )- , ('\255', '\1119' )- ]--iso_8859_6 :: [(Char, Char)]-iso_8859_6- = [ ('\172', '\1548' )- , ('\187', '\1563' )- , ('\191', '\1567' )- , ('\193', '\1569' )- , ('\194', '\1570' )- , ('\195', '\1571' )- , ('\196', '\1572' )- , ('\197', '\1573' )- , ('\198', '\1574' )- , ('\199', '\1575' )- , ('\200', '\1576' )- , ('\201', '\1577' )- , ('\202', '\1578' )- , ('\203', '\1579' )- , ('\204', '\1580' )- , ('\205', '\1581' )- , ('\206', '\1582' )- , ('\207', '\1583' )- , ('\208', '\1584' )- , ('\209', '\1585' )- , ('\210', '\1586' )- , ('\211', '\1587' )- , ('\212', '\1588' )- , ('\213', '\1589' )- , ('\214', '\1590' )- , ('\215', '\1591' )- , ('\216', '\1592' )- , ('\217', '\1593' )- , ('\218', '\1594' )- , ('\224', '\1600' )- , ('\225', '\1601' )- , ('\226', '\1602' )- , ('\227', '\1603' )- , ('\228', '\1604' )- , ('\229', '\1605' )- , ('\230', '\1606' )- , ('\231', '\1607' )- , ('\232', '\1608' )- , ('\233', '\1609' )- , ('\234', '\1610' )- , ('\235', '\1611' )- , ('\236', '\1612' )- , ('\237', '\1613' )- , ('\238', '\1614' )- , ('\239', '\1615' )- , ('\240', '\1616' )- , ('\241', '\1617' )- , ('\242', '\1618' )- ]--iso_8859_7 :: [(Char, Char)]-iso_8859_7- = [ ('\161', '\8216' )- , ('\162', '\8217' )- , ('\164', '\8364' )- , ('\165', '\8367' )- , ('\170', '\890' )- , ('\175', '\8213' )- , ('\180', '\900' )- , ('\181', '\901' )- , ('\182', '\902' )- , ('\184', '\904' )- , ('\185', '\905' )- , ('\186', '\906' )- , ('\188', '\908' )- , ('\190', '\910' )- , ('\191', '\911' )- , ('\192', '\912' )- , ('\193', '\913' )- , ('\194', '\914' )- , ('\195', '\915' )- , ('\196', '\916' )- , ('\197', '\917' )- , ('\198', '\918' )- , ('\199', '\919' )- , ('\200', '\920' )- , ('\201', '\921' )- , ('\202', '\922' )- , ('\203', '\923' )- , ('\204', '\924' )- , ('\205', '\925' )- , ('\206', '\926' )- , ('\207', '\927' )- , ('\208', '\928' )- , ('\209', '\929' )- , ('\211', '\931' )- , ('\212', '\932' )- , ('\213', '\933' )- , ('\214', '\934' )- , ('\215', '\935' )- , ('\216', '\936' )- , ('\217', '\937' )- , ('\218', '\938' )- , ('\219', '\939' )- , ('\220', '\940' )- , ('\221', '\941' )- , ('\222', '\942' )- , ('\223', '\943' )- , ('\224', '\944' )- , ('\225', '\945' )- , ('\226', '\946' )- , ('\227', '\947' )- , ('\228', '\948' )- , ('\229', '\949' )- , ('\230', '\950' )- , ('\231', '\951' )- , ('\232', '\952' )- , ('\233', '\953' )- , ('\234', '\954' )- , ('\235', '\955' )- , ('\236', '\956' )- , ('\237', '\957' )- , ('\238', '\958' )- , ('\239', '\959' )- , ('\240', '\960' )- , ('\241', '\961' )- , ('\242', '\962' )- , ('\243', '\963' )- , ('\244', '\964' )- , ('\245', '\965' )- , ('\246', '\966' )- , ('\247', '\967' )- , ('\248', '\968' )- , ('\249', '\969' )- , ('\250', '\970' )- , ('\251', '\971' )- , ('\252', '\972' )- , ('\253', '\973' )- , ('\254', '\974' )- ]--iso_8859_8 :: [(Char, Char)]-iso_8859_8- = [ ('\170', '\215' )- , ('\186', '\247' )- , ('\223', '\8215' )- , ('\224', '\1488' )- , ('\225', '\1489' )- , ('\226', '\1490' )- , ('\227', '\1491' )- , ('\228', '\1492' )- , ('\229', '\1493' )- , ('\230', '\1494' )- , ('\231', '\1495' )- , ('\232', '\1496' )- , ('\233', '\1497' )- , ('\234', '\1498' )- , ('\235', '\1499' )- , ('\236', '\1500' )- , ('\237', '\1501' )- , ('\238', '\1502' )- , ('\239', '\1503' )- , ('\240', '\1504' )- , ('\241', '\1505' )- , ('\242', '\1506' )- , ('\243', '\1507' )- , ('\244', '\1508' )- , ('\245', '\1509' )- , ('\246', '\1510' )- , ('\247', '\1511' )- , ('\248', '\1512' )- , ('\249', '\1513' )- , ('\250', '\1514' )- , ('\253', '\8206' )- , ('\254', '\8207' )- ]--iso_8859_9 :: [(Char, Char)]-iso_8859_9- = [ ('\208', '\286' )- , ('\221', '\304' )- , ('\222', '\350' )- , ('\240', '\287' )- , ('\253', '\305' )- , ('\254', '\351' )- ]--iso_8859_10 :: [(Char, Char)]-iso_8859_10- = [ ('\161', '\260' )- , ('\162', '\274' )- , ('\163', '\290' )- , ('\164', '\298' )- , ('\165', '\296' )- , ('\166', '\310' )- , ('\168', '\315' )- , ('\169', '\272' )- , ('\170', '\352' )- , ('\171', '\358' )- , ('\172', '\381' )- , ('\174', '\362' )- , ('\175', '\330' )- , ('\177', '\261' )- , ('\178', '\275' )- , ('\179', '\291' )- , ('\180', '\299' )- , ('\181', '\297' )- , ('\182', '\311' )- , ('\184', '\316' )- , ('\185', '\273' )- , ('\186', '\353' )- , ('\187', '\359' )- , ('\188', '\382' )- , ('\189', '\8213' )- , ('\190', '\363' )- , ('\191', '\331' )- , ('\192', '\256' )- , ('\199', '\302' )- , ('\200', '\268' )- , ('\202', '\280' )- , ('\204', '\278' )- , ('\209', '\325' )- , ('\210', '\332' )- , ('\215', '\360' )- , ('\217', '\370' )- , ('\224', '\257' )- , ('\231', '\303' )- , ('\232', '\269' )- , ('\234', '\281' )- , ('\236', '\279' )- , ('\241', '\326' )- , ('\242', '\333' )- , ('\247', '\361' )- , ('\249', '\371' )- , ('\255', '\312' )- ]--iso_8859_11 :: [(Char, Char)]-iso_8859_11- = [ ('\161', '\3585' )- , ('\162', '\3586' )- , ('\163', '\3587' )- , ('\164', '\3588' )- , ('\165', '\3589' )- , ('\166', '\3590' )- , ('\167', '\3591' )- , ('\168', '\3592' )- , ('\169', '\3593' )- , ('\170', '\3594' )- , ('\171', '\3595' )- , ('\172', '\3596' )- , ('\173', '\3597' )- , ('\174', '\3598' )- , ('\175', '\3599' )- , ('\176', '\3600' )- , ('\177', '\3601' )- , ('\178', '\3602' )- , ('\179', '\3603' )- , ('\180', '\3604' )- , ('\181', '\3605' )- , ('\182', '\3606' )- , ('\183', '\3607' )- , ('\184', '\3608' )- , ('\185', '\3609' )- , ('\186', '\3610' )- , ('\187', '\3611' )- , ('\188', '\3612' )- , ('\189', '\3613' )- , ('\190', '\3614' )- , ('\191', '\3615' )- , ('\192', '\3616' )- , ('\193', '\3617' )- , ('\194', '\3618' )- , ('\195', '\3619' )- , ('\196', '\3620' )- , ('\197', '\3621' )- , ('\198', '\3622' )- , ('\199', '\3623' )- , ('\200', '\3624' )- , ('\201', '\3625' )- , ('\202', '\3626' )- , ('\203', '\3627' )- , ('\204', '\3628' )- , ('\205', '\3629' )- , ('\206', '\3630' )- , ('\207', '\3631' )- , ('\208', '\3632' )- , ('\209', '\3633' )- , ('\210', '\3634' )- , ('\211', '\3635' )- , ('\212', '\3636' )- , ('\213', '\3637' )- , ('\214', '\3638' )- , ('\215', '\3639' )- , ('\216', '\3640' )- , ('\217', '\3641' )- , ('\218', '\3642' )- , ('\223', '\3647' )- , ('\224', '\3648' )- , ('\225', '\3649' )- , ('\226', '\3650' )- , ('\227', '\3651' )- , ('\228', '\3652' )- , ('\229', '\3653' )- , ('\230', '\3654' )- , ('\231', '\3655' )- , ('\232', '\3656' )- , ('\233', '\3657' )- , ('\234', '\3658' )- , ('\235', '\3659' )- , ('\236', '\3660' )- , ('\237', '\3661' )- , ('\238', '\3662' )- , ('\239', '\3663' )- , ('\240', '\3664' )- , ('\241', '\3665' )- , ('\242', '\3666' )- , ('\243', '\3667' )- , ('\244', '\3668' )- , ('\245', '\3669' )- , ('\246', '\3670' )- , ('\247', '\3671' )- , ('\248', '\3672' )- , ('\249', '\3673' )- , ('\250', '\3674' )- , ('\251', '\3675' )- ]--iso_8859_13 :: [(Char, Char)]-iso_8859_13- = [ ('\161', '\8221' )- , ('\165', '\8222' )- , ('\168', '\216' )- , ('\170', '\342' )- , ('\175', '\198' )- , ('\180', '\8220' )- , ('\184', '\248' )- , ('\186', '\343' )- , ('\191', '\230' )- , ('\192', '\260' )- , ('\193', '\302' )- , ('\194', '\256' )- , ('\195', '\262' )- , ('\198', '\280' )- , ('\199', '\274' )- , ('\200', '\268' )- , ('\202', '\377' )- , ('\203', '\278' )- , ('\204', '\290' )- , ('\205', '\310' )- , ('\206', '\298' )- , ('\207', '\315' )- , ('\208', '\352' )- , ('\209', '\323' )- , ('\210', '\325' )- , ('\212', '\332' )- , ('\216', '\370' )- , ('\217', '\321' )- , ('\218', '\346' )- , ('\219', '\362' )- , ('\221', '\379' )- , ('\222', '\381' )- , ('\224', '\261' )- , ('\225', '\303' )- , ('\226', '\257' )- , ('\227', '\263' )- , ('\230', '\281' )- , ('\231', '\275' )- , ('\232', '\269' )- , ('\234', '\378' )- , ('\235', '\279' )- , ('\236', '\291' )- , ('\237', '\311' )- , ('\238', '\299' )- , ('\239', '\316' )- , ('\240', '\353' )- , ('\241', '\324' )- , ('\242', '\326' )- , ('\244', '\333' )- , ('\248', '\371' )- , ('\249', '\322' )- , ('\250', '\347' )- , ('\251', '\363' )- , ('\253', '\380' )- , ('\254', '\382' )- , ('\255', '\8217' )- ]--iso_8859_14 :: [(Char, Char)]-iso_8859_14- = [ ('\161', '\7682' )- , ('\162', '\7683' )- , ('\164', '\266' )- , ('\165', '\267' )- , ('\166', '\7690' )- , ('\168', '\7808' )- , ('\170', '\7810' )- , ('\171', '\7691' )- , ('\172', '\7922' )- , ('\175', '\376' )- , ('\176', '\7710' )- , ('\177', '\7711' )- , ('\178', '\288' )- , ('\179', '\289' )- , ('\180', '\7744' )- , ('\181', '\7745' )- , ('\183', '\7766' )- , ('\184', '\7809' )- , ('\185', '\7767' )- , ('\186', '\7811' )- , ('\187', '\7776' )- , ('\188', '\7923' )- , ('\189', '\7812' )- , ('\190', '\7813' )- , ('\191', '\7777' )- , ('\208', '\372' )- , ('\215', '\7786' )- , ('\222', '\374' )- , ('\240', '\373' )- , ('\247', '\7787' )- , ('\254', '\375' )- ]--iso_8859_15 :: [(Char, Char)]-iso_8859_15- = [ ('\164', '\8364' )- , ('\166', '\352' )- , ('\168', '\353' )- , ('\180', '\381' )- , ('\184', '\382' )- , ('\188', '\338' )- , ('\189', '\339' )- , ('\190', '\376' )- ]--iso_8859_16 :: [(Char, Char)]-iso_8859_16- = [ ('\161', '\260' )- , ('\162', '\261' )- , ('\163', '\321' )- , ('\164', '\8364' )- , ('\165', '\8222' )- , ('\166', '\352' )- , ('\168', '\353' )- , ('\170', '\536' )- , ('\172', '\377' )- , ('\174', '\378' )- , ('\175', '\379' )- , ('\178', '\268' )- , ('\179', '\322' )- , ('\180', '\381' )- , ('\181', '\8221' )- , ('\184', '\382' )- , ('\185', '\269' )- , ('\186', '\537' )- , ('\188', '\338' )- , ('\189', '\339' )- , ('\190', '\376' )- , ('\191', '\380' )- , ('\195', '\258' )- , ('\197', '\262' )- , ('\208', '\272' )- , ('\209', '\323' )- , ('\213', '\336' )- , ('\215', '\346' )- , ('\216', '\368' )- , ('\221', '\280' )- , ('\222', '\538' )- , ('\227', '\259' )- , ('\229', '\263' )- , ('\240', '\273' )- , ('\241', '\324' )- , ('\245', '\337' )- , ('\247', '\347' )- , ('\248', '\369' )- , ('\253', '\281' )- , ('\254', '\539' )- ]-
src/Text/XML/HXT/DOM/QualifiedName.hs view
@@ -86,6 +86,7 @@ import Control.DeepSeq import Data.AssocList+import Data.Binary import Data.Char ( toLower ) import Data.List ( isPrefixOf ) import qualified Data.Map as M@@ -99,7 +100,7 @@ , xmlnsNamespace ) -import Text.XML.HXT.DOM.Unicode ( isXmlNCNameStartChar+import Data.Char.Properties.XMLCharProps ( isXmlNCNameStartChar , isXmlNCNameChar ) @@ -150,6 +151,19 @@ -- and does things like "mkName("x:y") == mkPrefixLocalPart("x","y") instance NFData QName where++instance Binary QName where+ put qn = let+ px = namePrefix qn+ lp = localPart qn+ ns = namespaceUri qn+ in+ put px >> put lp >> put ns+ get = do+ px <- get+ lp <- get+ ns <- get+ return $ mkQName px lp ns -- -----------------------------------------------------------------------------
src/Text/XML/HXT/DOM/TypeDefs.hs view
@@ -28,6 +28,7 @@ import Control.DeepSeq import Data.AssocList+import Data.Binary import Data.Tree.NTree.TypeDefs import Data.Typeable @@ -78,6 +79,41 @@ rnf (XAttr qn) = rnf qn rnf (XError n e) = rnf n `seq` rnf e +instance Binary XNode where+ put (XText s) = put (0::Word8) >> put s+ put (XCharRef i) = put (1::Word8) >> put i+ put (XEntityRef n) = put (2::Word8) >> put n+ put (XCmt c) = put (3::Word8) >> put c+ put (XCdata s) = put (4::Word8) >> put s+ put (XPi qn ts) = put (5::Word8) >> put qn >> put ts+ put (XTag qn cs) = put (6::Word8) >> put qn >> put cs+ put (XDTD de al) = put (7::Word8) >> put de >> put al+ put (XAttr qn) = put (8::Word8) >> put qn+ put (XError n e) = put (9::Word8) >> put n >> put e++ get = do+ tag <- getWord8+ case tag of+ 0 -> get >>= return . XText+ 1 -> get >>= return . XCharRef+ 2 -> get >>= return . XEntityRef+ 3 -> get >>= return . XCmt+ 4 -> get >>= return . XCdata+ 5 -> do+ qn <- get+ get >>= return . XPi qn+ 6 -> do+ qn <- get+ get >>= return . XTag qn+ 7 -> do+ de <- get+ get >>= return . XDTD de+ 8 -> get >>= return . XAttr+ 9 -> do+ n <- get+ get >>= return . XError n+ _ -> error "XNode.get: error while decoding XNode"+ -- ----------------------------------------------------------------------------- -- -- DTDElem@@ -120,6 +156,22 @@ deriving (Eq, Ord, Enum, Show, Read, Typeable) instance NFData DTDElem++instance Binary DTDElem where+ put de = put ((toEnum . fromEnum $ de)::Word8) -- DTDElem is not yet instance of Enum+ get = do+ tag <- getWord8+ return . toEnum . fromEnum $ tag+{-+ put de = let+ i = fromJust . elemIndex de $ dtdElems+ in+ put ((toEnum i)::Word8)++ get = do+ tag <- getWord8+ return $ dtdElems !! (fromEnum tag)+-} -- -----------------------------------------------------------------------------
− src/Text/XML/HXT/DOM/UTF8Decoding.hs
@@ -1,52 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.DOM.UTF8Decoding- Copyright : Copyright (C) 2005 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : stable- Portability: portable-- Interface for Data.Char.UTF8 funtions---}---- --------------------------------------------------------------module Text.XML.HXT.DOM.UTF8Decoding (- decodeUtf8,- decodeUtf8EmbedErrors,- decodeUtf8IgnoreErrors,- )-where--import qualified Data.Char.UTF8 as UTF8-import Data.Word (Word8)---- | calls 'Data.Char.UTF8.decode' for parsing and decoding UTF-8--decodeUtf8 :: String -> (String, [String])-decodeUtf8 str- = (res, map (uncurry toErrStr) errs)- where- (res, errs) = UTF8.decode . stringToByteString $ str--decodeUtf8IgnoreErrors :: String -> String-decodeUtf8IgnoreErrors- = fst . decodeUtf8--decodeUtf8EmbedErrors :: String -> [Either String Char]-decodeUtf8EmbedErrors str- = map (either (Left . uncurry toErrStr) Right) $- UTF8.decodeEmbedErrors $ stringToByteString $ str--stringToByteString :: String -> [Word8]-stringToByteString = map (toEnum . fromEnum)--toErrStr :: UTF8.Error -> Int -> String-toErrStr err pos- = " at input position " ++ show pos ++ ": " ++ show err---- ------------------------------------------------------------
− src/Text/XML/HXT/DOM/Unicode.hs
@@ -1,1105 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.DOM.Unicode- Copyright : Copyright (C) 2005-2008 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : experimental- Portability: portable-- Unicode and UTF-8 Conversion Functions---}---- --------------------------------------------------------------module Text.XML.HXT.DOM.Unicode- (- -- * Unicode Type declarations- Unicode,- UString,- UTF8Char,- UTF8String,- UStringWithErrors,- DecodingFct,- DecodingFctEmbedErrors,-- -- * XML char predicates-- isXmlChar- , isXmlLatin1Char- , isXmlSpaceChar- , isXml11SpaceChar- , isXmlNameChar- , isXmlNameStartChar- , isXmlNCNameChar- , isXmlNCNameStartChar- , isXmlPubidChar- , isXmlLetter- , isXmlBaseChar- , isXmlIdeographicChar- , isXmlCombiningChar- , isXmlDigit- , isXmlExtender- , isXmlControlOrPermanentlyUndefined-- -- * UTF-8 and Unicode conversion functions- , utf8ToUnicode- , utf8ToUnicodeEmbedErrors- , latin1ToUnicode- , ucs2ToUnicode- , ucs2BigEndianToUnicode- , ucs2LittleEndianToUnicode- , utf16beToUnicode- , utf16leToUnicode-- , unicodeCharToUtf8-- , unicodeToUtf8- , unicodeToXmlEntity- , unicodeToLatin1- , unicodeRemoveNoneAscii- , unicodeRemoveNoneLatin1-- , intToCharRef- , intToCharRefHex-- , getDecodingFct- , getDecodingFctEmbedErrors- , getOutputEncodingFct-- , normalizeNL- , guessEncoding- )-where--import Data.Char( toUpper )--import Text.XML.HXT.DOM.Util ( swap, partitionEither )--import Text.XML.HXT.DOM.IsoLatinTables-import Text.XML.HXT.DOM.UTF8Decoding ( decodeUtf8, decodeUtf8EmbedErrors )-import Text.XML.HXT.DOM.Util ( intToHexString )-import Text.XML.HXT.DOM.XmlKeywords---- ---------------------------------------------------------------- | Unicode is represented as the Char type--- Precondition for this is the support of Unicode character range--- in the compiler (e.g. ghc but not hugs)--type Unicode = Char---- | the type for Unicode strings--type UString = [Unicode]---- | UTF-8 charachters are represented by the Char type--type UTF8Char = Char---- | UTF-8 strings are implemented as Haskell strings--type UTF8String = String---- | Decoding function with a pair containing the result string and a list of decoding errors as result--type DecodingFct = String -> (UString, [String])--type UStringWithErrors = [Either String Char]---- | Decoding function where decoding errors are interleaved with decoded characters--type DecodingFctEmbedErrors = String -> UStringWithErrors---- ------------------------------------------------------------------ Unicode predicates---- |--- test for a legal 1 byte XML char--is1ByteXmlChar :: Unicode -> Bool-is1ByteXmlChar c- = c < '\x80'- && ( c >= ' '- ||- c == '\n'- ||- c == '\t'- ||- c == '\r'- )---- |--- test for a legal latin1 XML char--isXmlLatin1Char :: Unicode -> Bool-isXmlLatin1Char i- = is1ByteXmlChar i- ||- (i >= '\x80' && i <= '\xff')---- ---------------------------------------------------------------- |--- conversion from Unicode strings (UString) to UTF8 encoded strings.--unicodeToUtf8 :: UString -> UTF8String-unicodeToUtf8 = concatMap unicodeCharToUtf8---- |--- conversion from Unicode (Char) to a UTF8 encoded string.--unicodeCharToUtf8 :: Unicode -> UTF8String-unicodeCharToUtf8 c- | i >= 0 && i <= 0x0000007F -- 1 byte UTF8 (7 bits)- = [ toEnum i ]- | i >= 0x00000080 && i <= 0x000007FF -- 2 byte UTF8 (5 + 6 bits)- = [ toEnum (0xC0 + i `div` 0x40)- , toEnum (0x80 + i `mod` 0x40)- ]- | i >= 0x00000800 && i <= 0x0000FFFF -- 3 byte UTF8 (4 + 6 + 6 bits)- = [ toEnum (0xE0 + i `div` 0x1000)- , toEnum (0x80 + (i `div` 0x40) `mod` 0x40)- , toEnum (0x80 + i `mod` 0x40)- ]- | i >= 0x00010000 && i <= 0x001FFFFF -- 4 byte UTF8 (3 + 6 + 6 + 6 bits)- = [ toEnum (0xF0 + i `div` 0x40000)- , toEnum (0x80 + (i `div` 0x1000) `mod` 0x40)- , toEnum (0x80 + (i `div` 0x40) `mod` 0x40)- , toEnum (0x80 + i `mod` 0x40)- ]- | i >= 0x00200000 && i <= 0x03FFFFFF -- 5 byte UTF8 (2 + 6 + 6 + 6 + 6 bits)- = [ toEnum (0xF8 + i `div` 0x1000000)- , toEnum (0x80 + (i `div` 0x40000) `mod` 0x40)- , toEnum (0x80 + (i `div` 0x1000) `mod` 0x40)- , toEnum (0x80 + (i `div` 0x40) `mod` 0x40)- , toEnum (0x80 + i `mod` 0x40)- ]- | i >= 0x04000000 && i <= 0x7FFFFFFF -- 6 byte UTF8 (1 + 6 + 6 + 6 + 6 + 6 bits)- = [ toEnum (0xFC + i `div` 0x40000000)- , toEnum (0x80 + (i `div` 0x1000000) `mod` 0x40)- , toEnum (0x80 + (i `div` 0x40000) `mod` 0x40)- , toEnum (0x80 + (i `div` 0x1000) `mod` 0x40)- , toEnum (0x80 + (i `div` 0x40) `mod` 0x40)- , toEnum (0x80 + i `mod` 0x40)- ]- | otherwise -- other values not supported- = error ("unicodeCharToUtf8: illegal integer argument " ++ show i)- where- i = fromEnum c---- ---------------------------------------------------------------- |--- checking for valid XML characters--isXmlChar :: Unicode -> Bool-isXmlChar c- = isInList c- [ ('\x0009', '\x000A')- , ('\x000D', '\x000D')- , ('\x0020', '\xD7FF')- , ('\xE000', '\xFFFD')- , ('\x10000', '\x10FFFF')- ]---- |--- checking for XML space character: \\\n, \\\r, \\\t and \" \"--isXmlSpaceChar :: Unicode -> Bool-isXmlSpaceChar c- = c `elem` ['\x20', '\x09', '\x0D', '\x0A']---- |--- checking for XML1.1 space character: additional space 0x85 and 0x2028------ see also : 'isXmlSpaceChar'--isXml11SpaceChar :: Unicode -> Bool-isXml11SpaceChar c- = c `elem` ['\x20', '\x09', '\x0D', '\x0A', '\x85', '\x2028']---- |--- checking for XML name character--isXmlNameChar :: Unicode -> Bool-isXmlNameChar c- = isXmlLetter c- ||- isXmlDigit c- ||- (c == '\x2D' || c == '\x2E') -- '-' | '.'- ||- (c == '\x3A' || c == '\x5F') -- Letter | ':' | '_'- ||- isXmlCombiningChar c- ||- isXmlExtender c---- |--- checking for XML name start character------ see also : 'isXmlNameChar'--isXmlNameStartChar :: Unicode -> Bool-isXmlNameStartChar c- = isXmlLetter c- ||- (c == '\x3A' || c == '\x5F') -- Letter | ':' | '_'---- |--- checking for XML NCName character: no \":\" allowed------ see also : 'isXmlNameChar'--isXmlNCNameChar :: Unicode -> Bool-isXmlNCNameChar c- = c /= '\x3A'- &&- isXmlNameChar c---- |--- checking for XML NCName start character: no \":\" allowed------ see also : 'isXmlNameChar', 'isXmlNCNameChar'--isXmlNCNameStartChar :: Unicode -> Bool-isXmlNCNameStartChar c- = c /= '\x3A'- &&- isXmlNameStartChar c---- |--- checking for XML public id character--isXmlPubidChar :: Unicode -> Bool-isXmlPubidChar c- = isInList c [ ('0', '9')- , ('A', 'Z')- , ('a', 'z')- ]- ||- ( c `elem` " \r\n-'()+,./:=?;!*#@$_%" )---- |--- checking for XML letter--isXmlLetter :: Unicode -> Bool-isXmlLetter c- = isXmlBaseChar c- ||- isXmlIdeographicChar c---- |--- checking for XML base charater--isXmlBaseChar :: Unicode -> Bool-isXmlBaseChar c- = isInList c- [ ('\x0041', '\x005A')- , ('\x0061', '\x007A')- , ('\x00C0', '\x00D6')- , ('\x00D8', '\x00F6')- , ('\x00F8', '\x0131')- , ('\x0134', '\x013E')- , ('\x0141', '\x0148')- , ('\x014A', '\x017E')- , ('\x0180', '\x01C3')- , ('\x01CD', '\x01F0')- , ('\x01F4', '\x01F5')- , ('\x01FA', '\x0217')- , ('\x0250', '\x02A8')- , ('\x02BB', '\x02C1')- , ('\x0386', '\x0386')- , ('\x0388', '\x038A')- , ('\x038C', '\x038C')- , ('\x038E', '\x03A1')- , ('\x03A3', '\x03CE')- , ('\x03D0', '\x03D6')- , ('\x03DA', '\x03DA')- , ('\x03DC', '\x03DC')- , ('\x03DE', '\x03DE')- , ('\x03E0', '\x03E0')- , ('\x03E2', '\x03F3')- , ('\x0401', '\x040C')- , ('\x040E', '\x044F')- , ('\x0451', '\x045C')- , ('\x045E', '\x0481')- , ('\x0490', '\x04C4')- , ('\x04C7', '\x04C8')- , ('\x04CB', '\x04CC')- , ('\x04D0', '\x04EB')- , ('\x04EE', '\x04F5')- , ('\x04F8', '\x04F9')- , ('\x0531', '\x0556')- , ('\x0559', '\x0559')- , ('\x0561', '\x0586')- , ('\x05D0', '\x05EA')- , ('\x05F0', '\x05F2')- , ('\x0621', '\x063A')- , ('\x0641', '\x064A')- , ('\x0671', '\x06B7')- , ('\x06BA', '\x06BE')- , ('\x06C0', '\x06CE')- , ('\x06D0', '\x06D3')- , ('\x06D5', '\x06D5')- , ('\x06E5', '\x06E6')- , ('\x0905', '\x0939')- , ('\x093D', '\x093D')- , ('\x0958', '\x0961')- , ('\x0985', '\x098C')- , ('\x098F', '\x0990')- , ('\x0993', '\x09A8')- , ('\x09AA', '\x09B0')- , ('\x09B2', '\x09B2')- , ('\x09B6', '\x09B9')- , ('\x09DC', '\x09DD')- , ('\x09DF', '\x09E1')- , ('\x09F0', '\x09F1')- , ('\x0A05', '\x0A0A')- , ('\x0A0F', '\x0A10')- , ('\x0A13', '\x0A28')- , ('\x0A2A', '\x0A30')- , ('\x0A32', '\x0A33')- , ('\x0A35', '\x0A36')- , ('\x0A38', '\x0A39')- , ('\x0A59', '\x0A5C')- , ('\x0A5E', '\x0A5E')- , ('\x0A72', '\x0A74')- , ('\x0A85', '\x0A8B')- , ('\x0A8D', '\x0A8D')- , ('\x0A8F', '\x0A91')- , ('\x0A93', '\x0AA8')- , ('\x0AAA', '\x0AB0')- , ('\x0AB2', '\x0AB3')- , ('\x0AB5', '\x0AB9')- , ('\x0ABD', '\x0ABD')- , ('\x0AE0', '\x0AE0')- , ('\x0B05', '\x0B0C')- , ('\x0B0F', '\x0B10')- , ('\x0B13', '\x0B28')- , ('\x0B2A', '\x0B30')- , ('\x0B32', '\x0B33')- , ('\x0B36', '\x0B39')- , ('\x0B3D', '\x0B3D')- , ('\x0B5C', '\x0B5D')- , ('\x0B5F', '\x0B61')- , ('\x0B85', '\x0B8A')- , ('\x0B8E', '\x0B90')- , ('\x0B92', '\x0B95')- , ('\x0B99', '\x0B9A')- , ('\x0B9C', '\x0B9C')- , ('\x0B9E', '\x0B9F')- , ('\x0BA3', '\x0BA4')- , ('\x0BA8', '\x0BAA')- , ('\x0BAE', '\x0BB5')- , ('\x0BB7', '\x0BB9')- , ('\x0C05', '\x0C0C')- , ('\x0C0E', '\x0C10')- , ('\x0C12', '\x0C28')- , ('\x0C2A', '\x0C33')- , ('\x0C35', '\x0C39')- , ('\x0C60', '\x0C61')- , ('\x0C85', '\x0C8C')- , ('\x0C8E', '\x0C90')- , ('\x0C92', '\x0CA8')- , ('\x0CAA', '\x0CB3')- , ('\x0CB5', '\x0CB9')- , ('\x0CDE', '\x0CDE')- , ('\x0CE0', '\x0CE1')- , ('\x0D05', '\x0D0C')- , ('\x0D0E', '\x0D10')- , ('\x0D12', '\x0D28')- , ('\x0D2A', '\x0D39')- , ('\x0D60', '\x0D61')- , ('\x0E01', '\x0E2E')- , ('\x0E30', '\x0E30')- , ('\x0E32', '\x0E33')- , ('\x0E40', '\x0E45')- , ('\x0E81', '\x0E82')- , ('\x0E84', '\x0E84')- , ('\x0E87', '\x0E88')- , ('\x0E8A', '\x0E8A')- , ('\x0E8D', '\x0E8D')- , ('\x0E94', '\x0E97')- , ('\x0E99', '\x0E9F')- , ('\x0EA1', '\x0EA3')- , ('\x0EA5', '\x0EA5')- , ('\x0EA7', '\x0EA7')- , ('\x0EAA', '\x0EAB')- , ('\x0EAD', '\x0EAE')- , ('\x0EB0', '\x0EB0')- , ('\x0EB2', '\x0EB3')- , ('\x0EBD', '\x0EBD')- , ('\x0EC0', '\x0EC4')- , ('\x0F40', '\x0F47')- , ('\x0F49', '\x0F69')- , ('\x10A0', '\x10C5')- , ('\x10D0', '\x10F6')- , ('\x1100', '\x1100')- , ('\x1102', '\x1103')- , ('\x1105', '\x1107')- , ('\x1109', '\x1109')- , ('\x110B', '\x110C')- , ('\x110E', '\x1112')- , ('\x113C', '\x113C')- , ('\x113E', '\x113E')- , ('\x1140', '\x1140')- , ('\x114C', '\x114C')- , ('\x114E', '\x114E')- , ('\x1150', '\x1150')- , ('\x1154', '\x1155')- , ('\x1159', '\x1159')- , ('\x115F', '\x1161')- , ('\x1163', '\x1163')- , ('\x1165', '\x1165')- , ('\x1167', '\x1167')- , ('\x1169', '\x1169')- , ('\x116D', '\x116E')- , ('\x1172', '\x1173')- , ('\x1175', '\x1175')- , ('\x119E', '\x119E')- , ('\x11A8', '\x11A8')- , ('\x11AB', '\x11AB')- , ('\x11AE', '\x11AF')- , ('\x11B7', '\x11B8')- , ('\x11BA', '\x11BA')- , ('\x11BC', '\x11C2')- , ('\x11EB', '\x11EB')- , ('\x11F0', '\x11F0')- , ('\x11F9', '\x11F9')- , ('\x1E00', '\x1E9B')- , ('\x1EA0', '\x1EF9')- , ('\x1F00', '\x1F15')- , ('\x1F18', '\x1F1D')- , ('\x1F20', '\x1F45')- , ('\x1F48', '\x1F4D')- , ('\x1F50', '\x1F57')- , ('\x1F59', '\x1F59')- , ('\x1F5B', '\x1F5B')- , ('\x1F5D', '\x1F5D')- , ('\x1F5F', '\x1F7D')- , ('\x1F80', '\x1FB4')- , ('\x1FB6', '\x1FBC')- , ('\x1FBE', '\x1FBE')- , ('\x1FC2', '\x1FC4')- , ('\x1FC6', '\x1FCC')- , ('\x1FD0', '\x1FD3')- , ('\x1FD6', '\x1FDB')- , ('\x1FE0', '\x1FEC')- , ('\x1FF2', '\x1FF4')- , ('\x1FF6', '\x1FFC')- , ('\x2126', '\x2126')- , ('\x212A', '\x212B')- , ('\x212E', '\x212E')- , ('\x2180', '\x2182')- , ('\x3041', '\x3094')- , ('\x30A1', '\x30FA')- , ('\x3105', '\x312C')- , ('\xAC00', '\xD7A3')- ]---- |--- checking for XML ideographic charater--isXmlIdeographicChar :: Unicode -> Bool-isXmlIdeographicChar c- = isInList c- [ ('\x3007', '\x3007')- , ('\x3021', '\x3029')- , ('\x4E00', '\x9FA5')- ]---- |--- checking for XML combining charater--isXmlCombiningChar :: Unicode -> Bool-isXmlCombiningChar c- = isInList c- [ ('\x0300', '\x0345')- , ('\x0360', '\x0361')- , ('\x0483', '\x0486')- , ('\x0591', '\x05A1')- , ('\x05A3', '\x05B9')- , ('\x05BB', '\x05BD')- , ('\x05BF', '\x05BF')- , ('\x05C1', '\x05C2')- , ('\x05C4', '\x05C4')- , ('\x064B', '\x0652')- , ('\x0670', '\x0670')- , ('\x06D6', '\x06DC')- , ('\x06DD', '\x06DF')- , ('\x06E0', '\x06E4')- , ('\x06E7', '\x06E8')- , ('\x06EA', '\x06ED')- , ('\x0901', '\x0903')- , ('\x093C', '\x093C')- , ('\x093E', '\x094C')- , ('\x094D', '\x094D')- , ('\x0951', '\x0954')- , ('\x0962', '\x0963')- , ('\x0981', '\x0983')- , ('\x09BC', '\x09BC')- , ('\x09BE', '\x09BE')- , ('\x09BF', '\x09BF')- , ('\x09C0', '\x09C4')- , ('\x09C7', '\x09C8')- , ('\x09CB', '\x09CD')- , ('\x09D7', '\x09D7')- , ('\x09E2', '\x09E3')- , ('\x0A02', '\x0A02')- , ('\x0A3C', '\x0A3C')- , ('\x0A3E', '\x0A3E')- , ('\x0A3F', '\x0A3F')- , ('\x0A40', '\x0A42')- , ('\x0A47', '\x0A48')- , ('\x0A4B', '\x0A4D')- , ('\x0A70', '\x0A71')- , ('\x0A81', '\x0A83')- , ('\x0ABC', '\x0ABC')- , ('\x0ABE', '\x0AC5')- , ('\x0AC7', '\x0AC9')- , ('\x0ACB', '\x0ACD')- , ('\x0B01', '\x0B03')- , ('\x0B3C', '\x0B3C')- , ('\x0B3E', '\x0B43')- , ('\x0B47', '\x0B48')- , ('\x0B4B', '\x0B4D')- , ('\x0B56', '\x0B57')- , ('\x0B82', '\x0B83')- , ('\x0BBE', '\x0BC2')- , ('\x0BC6', '\x0BC8')- , ('\x0BCA', '\x0BCD')- , ('\x0BD7', '\x0BD7')- , ('\x0C01', '\x0C03')- , ('\x0C3E', '\x0C44')- , ('\x0C46', '\x0C48')- , ('\x0C4A', '\x0C4D')- , ('\x0C55', '\x0C56')- , ('\x0C82', '\x0C83')- , ('\x0CBE', '\x0CC4')- , ('\x0CC6', '\x0CC8')- , ('\x0CCA', '\x0CCD')- , ('\x0CD5', '\x0CD6')- , ('\x0D02', '\x0D03')- , ('\x0D3E', '\x0D43')- , ('\x0D46', '\x0D48')- , ('\x0D4A', '\x0D4D')- , ('\x0D57', '\x0D57')- , ('\x0E31', '\x0E31')- , ('\x0E34', '\x0E3A')- , ('\x0E47', '\x0E4E')- , ('\x0EB1', '\x0EB1')- , ('\x0EB4', '\x0EB9')- , ('\x0EBB', '\x0EBC')- , ('\x0EC8', '\x0ECD')- , ('\x0F18', '\x0F19')- , ('\x0F35', '\x0F35')- , ('\x0F37', '\x0F37')- , ('\x0F39', '\x0F39')- , ('\x0F3E', '\x0F3E')- , ('\x0F3F', '\x0F3F')- , ('\x0F71', '\x0F84')- , ('\x0F86', '\x0F8B')- , ('\x0F90', '\x0F95')- , ('\x0F97', '\x0F97')- , ('\x0F99', '\x0FAD')- , ('\x0FB1', '\x0FB7')- , ('\x0FB9', '\x0FB9')- , ('\x20D0', '\x20DC')- , ('\x20E1', '\x20E1')- , ('\x302A', '\x302F')- , ('\x3099', '\x3099')- , ('\x309A', '\x309A')- ]---- |--- checking for XML digit--isXmlDigit :: Unicode -> Bool-isXmlDigit c- = isInList c- [ ('\x0030', '\x0039')- , ('\x0660', '\x0669')- , ('\x06F0', '\x06F9')- , ('\x0966', '\x096F')- , ('\x09E6', '\x09EF')- , ('\x0A66', '\x0A6F')- , ('\x0AE6', '\x0AEF')- , ('\x0B66', '\x0B6F')- , ('\x0BE7', '\x0BEF')- , ('\x0C66', '\x0C6F')- , ('\x0CE6', '\x0CEF')- , ('\x0D66', '\x0D6F')- , ('\x0E50', '\x0E59')- , ('\x0ED0', '\x0ED9')- , ('\x0F20', '\x0F29')- ]---- |--- checking for XML extender--isXmlExtender :: Unicode -> Bool-isXmlExtender c- = isInList c- [ ('\x00B7', '\x00B7')- , ('\x02D0', '\x02D0')- , ('\x02D1', '\x02D1')- , ('\x0387', '\x0387')- , ('\x0640', '\x0640')- , ('\x0E46', '\x0E46')- , ('\x0EC6', '\x0EC6')- , ('\x3005', '\x3005')- , ('\x3031', '\x3035')- , ('\x309D', '\x309E')- , ('\x30FC', '\x30FE')- ]---- |--- checking for XML control or permanently discouraged char------ see Errata to XML1.0 (http:\/\/www.w3.org\/XML\/xml-V10-2e-errata) No 46------ Document authors are encouraged to avoid "compatibility characters",--- as defined in section 6.8 of [Unicode] (see also D21 in section 3.6 of [Unicode3]).--- The characters defined in the following ranges are also discouraged.--- They are either control characters or permanently undefined Unicode characters:---isXmlControlOrPermanentlyUndefined :: Unicode -> Bool-isXmlControlOrPermanentlyUndefined c- = isInList c- [ ('\x7F', '\x84')- , ('\x86', '\x9F')- , ('\xFDD0', '\xFDDF')- , ('\x1FFFE', '\x1FFFF')- , ('\x2FFFE', '\x2FFFF')- , ('\x3FFFE', '\x3FFFF')- , ('\x4FFFE', '\x4FFFF')- , ('\x5FFFE', '\x5FFFF')- , ('\x6FFFE', '\x6FFFF')- , ('\x7FFFE', '\x7FFFF')- , ('\x8FFFE', '\x8FFFF')- , ('\x9FFFE', '\x9FFFF')- , ('\xAFFFE', '\xAFFFF')- , ('\xBFFFE', '\xBFFFF')- , ('\xCFFFE', '\xCFFFF')- , ('\xDFFFE', '\xDFFFF')- , ('\xEFFFE', '\xEFFFF')- , ('\xFFFFE', '\xFFFFF')- , ('\x10FFFE', '\x10FFFF')- ]---- --------------------------------------------------------------isInList :: Unicode -> [(Unicode, Unicode)] -> Bool-isInList i =- foldr (\(lb, ub) b -> i >= lb && (i <= ub || b)) False- {- The expression (i>=lb && i<=ub) || b would work more generally,- but in a sorted list, the above one aborts the computation as early as possible. -}--{--isInList' :: Unicode -> [(Unicode, Unicode)] -> Bool-isInList' i ((lb, ub) : l)- | i < lb = False- | i <= ub = True- | otherwise = isInList' i l--isInList' _ []- = False--{- works, but is not so fast -}-isInList'' :: Unicode -> [(Unicode, Unicode)] -> Bool-isInList'' i = any (flip isInRange i)---- move to an Utility module?-isInRange :: Ord a => (a,a) -> a -> Bool-isInRange (l,r) x = l<=x && x<=r--propIsInList :: Bool-propIsInList =- all- (\c -> let dict = [ ('\x0041', '\x005A'), ('\x0061', '\x007A') ]- b0 = isInList c dict- b1 = isInList' c dict- b2 = isInList'' c dict- in b0 == b1 && b0 == b2)- ['\x00'..'\x100']--}---- ---------------------------------------------------------------- |--- code conversion from latin1 to Unicode--latin1ToUnicode :: String -> UString-latin1ToUnicode = id--latinToUnicode :: [(Char, Char)] -> String -> UString-latinToUnicode tt- = map charToUni- where- charToUni c =- foldr (\(src,dst) r ->- case compare c src of- EQ -> dst- LT -> c {- not found in table -}- GT -> r) c tt---- | conversion from ASCII to unicode with check for legal ASCII char set------ Structure of decoding function copied from 'Data.Char.UTF8.decode'.--decodeAscii :: DecodingFct-decodeAscii- = swap . partitionEither . decodeAsciiEmbedErrors--decodeAsciiEmbedErrors :: String -> UStringWithErrors-decodeAsciiEmbedErrors str- = map (\(c,pos) -> if isValid c- then Right c- else Left (toErrStr c pos)) posStr- where- posStr = zip str [(0::Int)..]- toErrStr errChr pos- = " at input position " ++ show pos ++ ": none ASCII char " ++ show errChr- isValid x = x < '\x80'---- |--- UCS-2 big endian to Unicode conversion--ucs2BigEndianToUnicode :: String -> UString--ucs2BigEndianToUnicode (b : l : r)- = toEnum (fromEnum b * 256 + fromEnum l) : ucs2BigEndianToUnicode r--ucs2BigEndianToUnicode []- = []--ucs2BigEndianToUnicode _- = [] -- error "illegal UCS-2 byte input sequence with odd length"- -- is ignored (garbage in, garbage out)---- ---------------------------------------------------------------- |--- UCS-2 little endian to Unicode conversion--ucs2LittleEndianToUnicode :: String -> UString--ucs2LittleEndianToUnicode (l : b : r)- = toEnum (fromEnum b * 256 + fromEnum l) : ucs2LittleEndianToUnicode r--ucs2LittleEndianToUnicode []- = []--ucs2LittleEndianToUnicode [_]- = [] -- error "illegal UCS-2 byte input sequence with odd length"- -- is ignored---- ---------------------------------------------------------------- |--- UCS-2 to UTF-8 conversion with byte order mark analysis--ucs2ToUnicode :: String -> UString--ucs2ToUnicode ('\xFE':'\xFF':s) -- 2 byte mark for big endian encoding- = ucs2BigEndianToUnicode s--ucs2ToUnicode ('\xFF':'\xFE':s) -- 2 byte mark for little endian encoding- = ucs2LittleEndianToUnicode s--ucs2ToUnicode s- = ucs2BigEndianToUnicode s -- default: big endian---- ---------------------------------------------------------------- |--- UTF-8 to Unicode conversion with deletion of leading byte order mark, as described in XML standard F.1--utf8ToUnicode :: DecodingFct--utf8ToUnicode ('\xEF':'\xBB':'\xBF':s) -- remove byte order mark ( XML standard F.1 )- = decodeUtf8 s--utf8ToUnicode s- = decodeUtf8 s--utf8ToUnicodeEmbedErrors :: DecodingFctEmbedErrors--utf8ToUnicodeEmbedErrors ('\xEF':'\xBB':'\xBF':s) -- remove byte order mark ( XML standard F.1 )- = decodeUtf8EmbedErrors s--utf8ToUnicodeEmbedErrors s- = decodeUtf8EmbedErrors s---- ---------------------------------------------------------------- |--- UTF-16 big endian to UTF-8 conversion with removal of byte order mark--utf16beToUnicode :: String -> UString--utf16beToUnicode ('\xFE':'\xFF':s) -- remove byte order mark- = ucs2BigEndianToUnicode s--utf16beToUnicode s- = ucs2BigEndianToUnicode s---- ---------------------------------------------------------------- |--- UTF-16 little endian to UTF-8 conversion with removal of byte order mark--utf16leToUnicode :: String -> UString--utf16leToUnicode ('\xFF':'\xFE':s) -- remove byte order mark- = ucs2LittleEndianToUnicode s--utf16leToUnicode s- = ucs2LittleEndianToUnicode s----- ---------------------------------------------------------------- |--- substitute all Unicode characters, that are not legal 1-byte--- UTF-8 XML characters by a character reference.------ This function can be used to translate all text nodes and--- attribute values into pure ascii.------ see also : 'unicodeToLatin1'--unicodeToXmlEntity :: UString -> String-unicodeToXmlEntity- = escape is1ByteXmlChar (intToCharRef . fromEnum)---- |--- substitute all Unicode characters, that are not legal latin1--- UTF-8 XML characters by a character reference.------ This function can be used to translate all text nodes and--- attribute values into ISO latin1.------ see also : 'unicodeToXmlEntity'--unicodeToLatin1 :: UString -> String-unicodeToLatin1- = escape isXmlLatin1Char (intToCharRef . fromEnum)----- |--- substitute selected characters--- The @check@ function returns 'True' whenever a character needs to substitution--- The function @esc@ computes a substitute.-escape :: (Unicode -> Bool) -> (Unicode -> String) -> UString -> String-escape check esc =- concatMap (\uc -> if check uc then [uc] else esc uc)---- |--- removes all non ascii chars, may be used to transform--- a document into a pure ascii representation by removing--- all non ascii chars from tag and attibute names------ see also : 'unicodeRemoveNoneLatin1', 'unicodeToXmlEntity'--unicodeRemoveNoneAscii :: UString -> String-unicodeRemoveNoneAscii- = filter is1ByteXmlChar---- |--- removes all non latin1 chars, may be used to transform--- a document into a pure ascii representation by removing--- all non ascii chars from tag and attibute names------ see also : 'unicodeRemoveNoneAscii', 'unicodeToLatin1'--unicodeRemoveNoneLatin1 :: UString -> String-unicodeRemoveNoneLatin1- = filter isXmlLatin1Char---- ---------------------------------------------------------------- |--- convert an Unicode into a XML character reference.------ see also : 'intToCharRefHex'--intToCharRef :: Int -> String-intToCharRef i- = "&#" ++ show i ++ ";"---- |--- convert an Unicode into a XML hexadecimal character reference.------ see also: 'intToCharRef'--intToCharRefHex :: Int -> String-intToCharRefHex i- = "&#x" ++ h2 ++ ";"- where- h1 = intToHexString i- h2 = if length h1 `mod` 2 == 1- then '0': h1- else h1---- ------------------------------------------------------------------ | White Space (XML Standard 2.3) and--- end of line handling (2.11)------ \#x0D and \#x0D\#x0A are mapped to \#x0A--normalizeNL :: String -> String-normalizeNL ('\r' : '\n' : rest) = '\n' : normalizeNL rest-normalizeNL ('\r' : rest) = '\n' : normalizeNL rest-normalizeNL (c : rest) = c : normalizeNL rest-normalizeNL [] = []----- ---------------------------------------------------------------- |--- the table of supported character encoding schemes and the associated--- conversion functions into Unicode:q--{--This table could be derived from decodingTableEither,-but this way it is certainly more efficient.--}--decodingTable :: [(String, DecodingFct)]-decodingTable- = [ (utf8, utf8ToUnicode )- , (isoLatin1, liftDecFct latin1ToUnicode )- , (usAscii, decodeAscii )- , (ucs2, liftDecFct ucs2ToUnicode )- , (utf16, liftDecFct ucs2ToUnicode )- , (utf16be, liftDecFct utf16beToUnicode )- , (utf16le, liftDecFct utf16leToUnicode )- , (iso8859_2, liftDecFct (latinToUnicode iso_8859_2) )- , (iso8859_3, liftDecFct (latinToUnicode iso_8859_3) )- , (iso8859_4, liftDecFct (latinToUnicode iso_8859_4) )- , (iso8859_5, liftDecFct (latinToUnicode iso_8859_5) )- , (iso8859_6, liftDecFct (latinToUnicode iso_8859_6) )- , (iso8859_7, liftDecFct (latinToUnicode iso_8859_7) )- , (iso8859_8, liftDecFct (latinToUnicode iso_8859_8) )- , (iso8859_9, liftDecFct (latinToUnicode iso_8859_9) )- , (iso8859_10, liftDecFct (latinToUnicode iso_8859_10) )- , (iso8859_11, liftDecFct (latinToUnicode iso_8859_11) )- , (iso8859_13, liftDecFct (latinToUnicode iso_8859_13) )- , (iso8859_14, liftDecFct (latinToUnicode iso_8859_14) )- , (iso8859_15, liftDecFct (latinToUnicode iso_8859_15) )- , (iso8859_16, liftDecFct (latinToUnicode iso_8859_16) )- , (unicodeString, liftDecFct id )- , ("", liftDecFct id ) -- default- ]- where- liftDecFct df = \ s -> (df s, [])---- |--- the lookup function for selecting the decoding function--getDecodingFct :: String -> Maybe DecodingFct-getDecodingFct enc- = lookup (map toUpper enc) decodingTable----- |--- Similar to 'decodingTable' but it embeds errors--- in the string of decoded characters.--decodingTableEmbedErrors :: [(String, DecodingFctEmbedErrors)]-decodingTableEmbedErrors- = [ (utf8, utf8ToUnicodeEmbedErrors )- , (isoLatin1, liftDecFct latin1ToUnicode )- , (usAscii, decodeAsciiEmbedErrors )- , (ucs2, liftDecFct ucs2ToUnicode )- , (utf16, liftDecFct ucs2ToUnicode )- , (utf16be, liftDecFct utf16beToUnicode )- , (utf16le, liftDecFct utf16leToUnicode )- , (iso8859_2, liftDecFct (latinToUnicode iso_8859_2) )- , (iso8859_3, liftDecFct (latinToUnicode iso_8859_3) )- , (iso8859_4, liftDecFct (latinToUnicode iso_8859_4) )- , (iso8859_5, liftDecFct (latinToUnicode iso_8859_5) )- , (iso8859_6, liftDecFct (latinToUnicode iso_8859_6) )- , (iso8859_7, liftDecFct (latinToUnicode iso_8859_7) )- , (iso8859_8, liftDecFct (latinToUnicode iso_8859_8) )- , (iso8859_9, liftDecFct (latinToUnicode iso_8859_9) )- , (iso8859_10, liftDecFct (latinToUnicode iso_8859_10) )- , (iso8859_11, liftDecFct (latinToUnicode iso_8859_11) )- , (iso8859_13, liftDecFct (latinToUnicode iso_8859_13) )- , (iso8859_14, liftDecFct (latinToUnicode iso_8859_14) )- , (iso8859_15, liftDecFct (latinToUnicode iso_8859_15) )- , (iso8859_16, liftDecFct (latinToUnicode iso_8859_16) )- , (unicodeString, liftDecFct id )- , ("", liftDecFct id ) -- default- ]- where- liftDecFct df = map Right . df---- |--- the lookup function for selecting the decoding function--getDecodingFctEmbedErrors :: String -> Maybe DecodingFctEmbedErrors-getDecodingFctEmbedErrors enc- = lookup (map toUpper enc) decodingTableEmbedErrors------ |--- the table of supported output encoding schemes and the associated--- conversion functions from Unicode--outputEncodingTable :: [(String, (UString -> String))]-outputEncodingTable- = [ (utf8, unicodeToUtf8 )- , (isoLatin1, unicodeToLatin1 )- , (usAscii, unicodeToXmlEntity )- , (ucs2, ucs2ToUnicode )- , (unicodeString, id )- , ("", unicodeToUtf8 ) -- default- ]---- |--- the lookup function for selecting the encoding function--getOutputEncodingFct :: String -> Maybe (String -> UString)-getOutputEncodingFct enc- = lookup (map toUpper enc) outputEncodingTable---- -----------------------------------------------------------------guessEncoding :: String -> String--guessEncoding ('\xFF':'\xFE':'\x00':'\x00':_) = "UCS-4LE" -- with byte order mark-guessEncoding ('\xFF':'\xFE':_) = "UTF-16LE" -- with byte order mark--guessEncoding ('\xFE':'\xFF':'\x00':'\x00':_) = "UCS-4-3421" -- with byte order mark-guessEncoding ('\xFE':'\xFF':_) = "UTF-16BE" -- with byte order mark--guessEncoding ('\xEF':'\xBB':'\xBF':_) = utf8 -- with byte order mark--guessEncoding ('\x00':'\x00':'\xFE':'\xFF':_) = "UCS-4BE" -- with byte order mark-guessEncoding ('\x00':'\x00':'\xFF':'\xFE':_) = "UCS-4-2143" -- with byte order mark--guessEncoding ('\x00':'\x00':'\x00':'\x3C':_) = "UCS-4BE" -- "<" of "<?xml"-guessEncoding ('\x3C':'\x00':'\x00':'\x00':_) = "UCS-4LE" -- "<" of "<?xml"-guessEncoding ('\x00':'\x00':'\x3C':'\x00':_) = "UCS-4-2143" -- "<" of "<?xml"-guessEncoding ('\x00':'\x3C':'\x00':'\x00':_) = "UCS-4-3412" -- "<" of "<?xml"--guessEncoding ('\x00':'\x3C':'\x00':'\x3F':_) = "UTF-16BE" -- "<?" of "<?xml"-guessEncoding ('\x3C':'\x00':'\x3F':'\x00':_) = "UTF-16LE" -- "<?" of "<?xml"--guessEncoding ('\x4C':'\x6F':'\xA7':'\x94':_) = "EBCDIC" -- "<?xm" of "<?xml"--guessEncoding _ = "" -- no guess---- ------------------------------------------------------------
src/Text/XML/HXT/DOM/XmlKeywords.hs view
@@ -26,73 +26,23 @@ t_xml, -- tag names t_root :: String -a_accept_mimetypes,- a_add_default_dtd,- a_canonicalize,- a_default, -- attribute names- a_check_namespaces,+a_default, -- attribute names a_contentLength,- a_collect_errors, a_column,- a_default_baseuri,- a_do_not_canonicalize,- a_do_not_check_namespaces,- a_do_not_issue_errors,- a_do_not_issue_warnings,- a_do_not_preserve_comment,- a_do_not_remove_whitespace,- a_do_not_use_curl,- a_do_not_validate, a_encoding,- a_error,- a_error_log,- a_help,- a_if_modified_since,- a_ignore_encoding_errors,- a_ignore_none_xml_contents,- a_indent,- a_issue_errors,- a_issue_warnings, a_kind, a_line,- a_mime_types, a_module, a_modifier, a_name,- a_no_empty_elements,- a_no_empty_elem_for,- a_no_redirect,- a_no_xml_pi,- a_options_curl, a_output_encoding,- a_output_file,- a_output_xml,- a_output_html,- a_output_xhtml,- a_parse_by_mimetype,- a_parse_html,- a_parse_xml, a_peref,- a_preserve_comment,- a_propagate_errors,- a_proxy,- a_remove_whitespace,- a_redirect,- a_show_haskell,- a_show_tree, a_source, a_status, a_standalone,- a_strict_input,- a_tagsoup,- a_text_mode,- a_trace, a_type,- a_use_curl, a_url,- a_validate, a_value,- a_verbose, a_version, a_xml, a_xmlns :: String@@ -143,73 +93,23 @@ t_xml = "xml" t_root = "/" -- name of root node tag -a_accept_mimetypes = "accept-mimetypes"-a_add_default_dtd = "add-default-dtd"-a_canonicalize = "canonicalize"-a_check_namespaces = "check-namespaces"-a_collect_errors = "collect-errors" a_column = "column" a_contentLength = "Content-Length" a_default = "default"-a_default_baseuri = "default-base-URI"-a_do_not_canonicalize = "do-not-canonicalize"-a_do_not_check_namespaces = "do-not-check-namespaces"-a_do_not_issue_errors = "do-not-issue-errors"-a_do_not_issue_warnings = "do-not-issue-warnings"-a_do_not_preserve_comment = "do-not-preserve-comment"-a_do_not_remove_whitespace = "do-not-remove-whitespace"-a_do_not_use_curl = "do-not-use-curl"-a_do_not_validate = "do-not-validate" a_encoding = "encoding"-a_error = "error"-a_error_log = "errorLog"-a_help = "help"-a_if_modified_since = "if-modified-since"-a_ignore_encoding_errors = "ignore-encoding-errors"-a_ignore_none_xml_contents = "ignore-none-xml-contents"-a_indent = "indent"-a_issue_warnings = "issue-warnings"-a_issue_errors = "issue-errors" a_kind = "kind" a_line = "line"-a_mime_types = "mimetypes" a_module = "module" a_modifier = "modifier" a_name = "name"-a_no_empty_elements = "no-empty-elements"-a_no_empty_elem_for = "no-empty-elem-for"-a_no_redirect = "no-redirect"-a_no_xml_pi = "no-xml-pi"-a_options_curl = "options-curl"-a_output_file = "output-file" a_output_encoding = "output-encoding"-a_output_html = "output-html"-a_output_xhtml = "output-xhtml"-a_output_xml = "output-xml"-a_parse_by_mimetype = "parse-by-mimetype"-a_parse_html = "parse-html"-a_parse_xml = "parse-xml" a_peref = k_peref-a_preserve_comment = "preserve-comment"-a_propagate_errors = "propagate-errors"-a_proxy = "proxy"-a_redirect = "redirect"-a_remove_whitespace = "remove-whitespace"-a_show_haskell = "show-haskell"-a_show_tree = "show-tree" a_source = "source" a_standalone = "standalone" a_status = "status"-a_strict_input = "strict-input"-a_tagsoup = "tagsoup"-a_text_mode = "text-mode"-a_trace = "trace" a_type = "type" a_url = "url"-a_use_curl = "use-curl"-a_validate = "validate" a_value = "value"-a_verbose = "verbose" a_version = "version" a_xml = "xml" a_xmlns = "xmlns"@@ -301,40 +201,6 @@ -- ------------------------------------------------------------ ----- encoding names--isoLatin1- , iso8859_1, iso8859_2, iso8859_3, iso8859_4, iso8859_5- , iso8859_6, iso8859_7, iso8859_8, iso8859_9, iso8859_10- , iso8859_11, iso8859_13, iso8859_14, iso8859_15, iso8859_16- , usAscii, ucs2, utf8, utf16, utf16be, utf16le, unicodeString :: String--isoLatin1 = iso8859_1-iso8859_1 = "ISO-8859-1"-iso8859_2 = "ISO-8859-2"-iso8859_3 = "ISO-8859-3"-iso8859_4 = "ISO-8859-4"-iso8859_5 = "ISO-8859-5"-iso8859_6 = "ISO-8859-6"-iso8859_7 = "ISO-8859-7"-iso8859_8 = "ISO-8859-8"-iso8859_9 = "ISO-8859-9"-iso8859_10 = "ISO-8859-10"-iso8859_11 = "ISO-8859-11"-iso8859_13 = "ISO-8859-13"-iso8859_14 = "ISO-8859-14"-iso8859_15 = "ISO-8859-15"-iso8859_16 = "ISO-8859-16"-usAscii = "US-ASCII"-ucs2 = "ISO-10646-UCS-2"-utf8 = "UTF-8"-utf16 = "UTF-16"-utf16be = "UTF-16BE"-utf16le = "UTF-16LE"-unicodeString = "UNICODE"---- --------------------------------------------------------------- -- known namespaces -- |@@ -352,28 +218,5 @@ -- | Relax NG namespace relaxNamespace :: String relaxNamespace = "http://relaxng.org/ns/structure/1.0"---- --------------------------------------------------------------- option for Relax NG--a_relax_schema,- a_do_not_check_restrictions,- a_check_restrictions,- a_do_not_validate_externalRef,- a_validate_externalRef,- a_do_not_validate_include,- a_validate_include,- a_output_changes,- a_do_not_collect_errors :: String--a_relax_schema = "relax-schema"-a_do_not_check_restrictions = "do-not-check-restrictions"-a_check_restrictions = "check-restrictions"-a_do_not_validate_externalRef = "do-not-validate-externalRef"-a_validate_externalRef = "validate-externalRef"-a_do_not_validate_include = "do-not-validate-include"-a_validate_include = "validate-include"-a_output_changes = "output-pattern-transformations"-a_do_not_collect_errors = "do-not-collect-errors" -- ------------------------------------------------------------
− src/Text/XML/HXT/DOM/XmlOptions.hs
@@ -1,188 +0,0 @@--- |--- Common useful options------ Version : $Id: XmlOptions.hs,v 1.1 2006/11/09 20:27:42 hxml Exp $--------module Text.XML.HXT.DOM.XmlOptions- ( inputOptions- , relaxOptions- , outputOptions- , generalOptions- , versionOptions- , showOptions-- , selectOptions- , removeOptions- , optionIsSet- , isTrueValue- )-where--import Text.XML.HXT.DOM.XmlKeywords-import Text.XML.HXT.DOM.TypeDefs--import Data.Maybe--import System.Console.GetOpt---- ------------------------------------------------------------------- |--- commonly useful options for XML input------ can be used for option definition with haskell getopt------ defines options: 'a_trace', 'a_proxy', 'a_use_curl', 'a_do_not_use_curl', 'a_options_curl', 'a_encoding',--- 'a_issue_errors', 'a_do_not_issue_errors', 'a_parse_html', 'a_parse_by_mimetype', 'a_tagsoup' 'a_issue_warnings', 'a_do_not_issue_warnings',--- 'a_parse_xml', 'a_validate', 'a_do_not_validate', 'a_canonicalize', 'a_do_not_canonicalize',---- 'a_preserve_comment', 'a_do_not_preserve_comment', 'a_check_namespaces', 'a_do_not_check_namespaces',--- 'a_remove_whitespace', 'a_do_not_remove_whitespace'--inputOptions :: [OptDescr (String, String)]-inputOptions- = [ Option "t" [a_trace] (OptArg trc "LEVEL") "trace level (0-4), default 1"- , Option "p" [a_proxy] (ReqArg (att a_proxy) "PROXY") "proxy for http access (e.g. \"www-cache:3128\")"- , Option "" [a_redirect] (NoArg (att a_redirect v_1)) "automatically follow redirected URIs"- , Option "" [a_no_redirect] (NoArg (att a_redirect v_0)) "switch off following redirected URIs"- , Option "" [a_use_curl] (NoArg (att a_use_curl v_1)) "obsolete, since hxt-8.1 HTTP access is always done with curl bindings"- , Option "" [a_do_not_use_curl] (NoArg (att a_use_curl v_0)) "obsolete, since hxt-8.1 HTTP access is always done with curl bindings"- , Option "" [a_options_curl] (ReqArg (att a_options_curl) "STR") "additional curl options, e.g. for timeout, ..."- , Option "" [a_default_baseuri] (ReqArg (att transferURI) "URI") "default base URI, default: \"file:///<cwd>/\""- , Option "e" [a_encoding] (ReqArg (att a_encoding) "CHARSET") ( "default document encoding (" ++ utf8 ++ ", " ++ isoLatin1 ++ ", " ++ usAscii ++ ", ...)" )- , Option "" [a_mime_types] (ReqArg (att a_mime_types) "FILE") "set mime type configuration file, e.g. \"/etc/mime.types\""- , Option "" [a_issue_errors] (NoArg (att a_issue_errors v_1)) "issue all errorr messages on stderr (default)"- , Option "" [a_do_not_issue_errors] (NoArg (att a_issue_errors v_0)) "ignore all error messages"- , Option "" [a_ignore_encoding_errors] (NoArg (att a_ignore_encoding_errors v_1)) "ignore encoding errors"- , Option "" [a_ignore_none_xml_contents] (NoArg (att a_ignore_none_xml_contents v_1)) "discards all contents of none XML/HTML documents, only the meta info remains in the doc tree"- , Option "" [a_accept_mimetypes] (ReqArg (att a_accept_mimetypes) "MIMETYPES") "only accept documents matching the given list of mimetype specs"- , Option "H" [a_parse_html] (NoArg (att a_parse_html v_1)) "parse input as HTML, try to interprete everything as HTML, no validation"- , Option "M" [a_parse_by_mimetype] (NoArg (att a_parse_by_mimetype v_1)) "parse dependent on mime type: text/html as HTML, text/xml and text/xhtml and others as XML, else no parse"- , Option "" [a_parse_xml] (NoArg (att a_parse_html v_0)) "parse input as XML, (default)"- , Option "" [a_strict_input] (NoArg (att a_strict_input v_1)) "read input files strictly, this ensures closing the files correctly even if not read completely"- , Option "T" [a_tagsoup] (NoArg (att a_tagsoup v_1)) "lazy tagsoup parser, for HTML and XML, no DTD, no validation, no PIs, only XHTML entityrefs"- , Option "" [a_issue_warnings] (NoArg (att a_issue_warnings v_1)) "issue warnings, when parsing HTML (default)"- , Option "Q" [a_do_not_issue_warnings] (NoArg (att a_issue_warnings v_0)) "ignore warnings, when parsing HTML"- , Option "" [a_validate] (NoArg (att a_validate v_1)) "document validation when parsing XML (default)"- , Option "w" [a_do_not_validate] (NoArg (att a_validate v_0)) "only wellformed check, no validation"- , Option "" [a_canonicalize] (NoArg (att a_canonicalize v_1)) "canonicalize document, remove DTD, comment, transform CDATA, CharRef's, ... (default)"- , Option "c" [a_do_not_canonicalize] (NoArg (att a_canonicalize v_0)) "do not canonicalize document, don't remove DTD, comment, don't transform CDATA, CharRef's, ..."- , Option "C" [a_preserve_comment] (NoArg (att a_preserve_comment v_1)) "don't remove comments during canonicalisation"- , Option "" [a_do_not_preserve_comment] (NoArg (att a_preserve_comment v_0)) "remove comments during canonicalisation (default)"- , Option "n" [a_check_namespaces] (NoArg (att a_check_namespaces v_1)) "tag tree with namespace information and check namespaces"- , Option "" [a_do_not_check_namespaces] (NoArg (att a_check_namespaces v_0)) "ignore namespaces (default)"- , Option "r" [a_remove_whitespace] (NoArg (att a_remove_whitespace v_1)) "remove redundant whitespace, simplifies tree and processing"- , Option "" [a_do_not_remove_whitespace] (NoArg (att a_remove_whitespace v_0)) "don't remove redundant whitespace (default)"- ]- where- att n v = (n, v)- trc = att a_trace . show . max 0 . min 9 . (read :: String -> Int) . ('0':) . filter (`elem` "0123456789") . fromMaybe v_1----- | available Relax NG validation options------ defines options--- 'a_check_restrictions', 'a_validate_externalRef', 'a_validate_include', 'a_do_not_check_restrictions',--- 'a_do_not_validate_externalRef', 'a_do_not_validate_include'--relaxOptions :: [OptDescr (String, String)]-relaxOptions- = [ Option "X" [a_relax_schema] (ReqArg (att a_relax_schema) "SCHEMA") "validation with Relax NG, SCHEMA is the URI for the Relax NG schema"- , Option "" [a_check_restrictions] (NoArg (a_check_restrictions, v_1)) "check Relax NG schema restrictions during schema simplification (default)"- , Option "" [a_do_not_check_restrictions] (NoArg (a_check_restrictions, v_0)) "do not check Relax NG schema restrictions"- , Option "" [a_validate_externalRef] (NoArg (a_validate_externalRef, v_1)) "validate a Relax NG schema referenced by a externalRef-Pattern (default)"- , Option "" [a_do_not_validate_externalRef] (NoArg (a_validate_externalRef, v_0)) "do not validate a Relax NG schema referenced by an externalRef-Pattern"- , Option "" [a_validate_include] (NoArg (a_validate_include, v_1)) "validate a Relax NG schema referenced by an include-Pattern (default)"- , Option "" [a_do_not_validate_include] (NoArg (a_validate_include, v_0)) "do not validate a Relax NG schema referenced by an include-Pattern"- {-- , Option "" [a_output_changes] (NoArg (a_output_changes, v_1)) "output Pattern transformations in case of an error"- , Option "" [a_do_not_collect_errors] (NoArg (a_do_not_collect_errors, v_1)) "stop Relax NG simplification after the first error has occurred"- -}- ]- where- att n v = (n, v)---- |--- commonly useful options for XML output------ defines options: 'a_indent', 'a_output_encoding', 'a_output_file', 'a_output_html'--outputOptions :: [OptDescr (String, String)]-outputOptions- = [ Option "i" [a_indent] (NoArg (att a_indent v_1)) "indent XML output for readability"- , Option "o" [a_output_encoding] (ReqArg (att a_output_encoding) "CHARSET") ( "encoding of output (" ++ utf8 ++ ", " ++ isoLatin1 ++ ", " ++ usAscii ++ ")" )- , Option "f" [a_output_file] (ReqArg (att a_output_file) "FILE") "output file for resulting document (default: stdout)"- , Option "" [a_output_html] (NoArg (att a_output_html v_1)) "output of none ASCII chars as HTMl entity references"- , Option "" [a_no_xml_pi] (NoArg (att a_no_xml_pi v_1)) ("output without <?xml ...?> processing instruction, useful in combination with --" ++ show a_output_html)- , Option "" [a_output_xhtml] (NoArg (att a_output_xhtml v_1)) "output of HTML elements with empty content (script, ...) done in format <elem...></elem> instead of <elem/>"- , Option "" [a_no_empty_elem_for] (ReqArg (att a_no_empty_elem_for) "NAMES") "output of empty elements done in format <elem...></elem> only for given list of element names"- , Option "" [a_no_empty_elements] (NoArg (att a_no_empty_elements v_1)) "output of empty elements done in format <elem...></elem> instead of <elem/>"- , Option "" [a_add_default_dtd] (NoArg (att a_add_default_dtd v_1)) "add the document type declaration given in the input document"- , Option "" [a_text_mode] (NoArg (att a_text_mode v_1)) "output in text mode"- ]- where- att n v = (n, v)---- |--- commonly useful options------ defines options: 'a_verbose', 'a_help'--generalOptions :: [OptDescr (String, String)]-generalOptions- = [ Option "v" [a_verbose] (NoArg (a_verbose, v_1)) "verbose output"- , Option "h?" [a_help] (NoArg (a_help, v_1)) "this message"- ]---- |--- defines 'a_version' option--versionOptions :: [OptDescr (String, String)]-versionOptions- = [ Option "V" [a_version] (NoArg (a_version, v_1)) "show program version"- ]---- |--- debug output options--showOptions :: [OptDescr (String, String)]-showOptions- = [ Option "" [a_show_tree] (NoArg (a_show_tree, v_1)) "output tree representation instead of document source"- , Option "" [a_show_haskell] (NoArg (a_show_haskell, v_1)) "output internal Haskell representation instead of document source"- ]---- ---------------------------------------------------------------- |--- select options from a predefined list of option desciptions--selectOptions :: [String] -> [OptDescr (String, String)] -> [OptDescr (String, String)]-selectOptions ol os- = concat . map (\ on -> filter (\ (Option _ ons _ _) -> on `elem` ons) os) $ ol--removeOptions :: [String] -> [OptDescr (String, String)] -> [OptDescr (String, String)]-removeOptions ol os- = filter (\ (Option _ ons _ _) -> not . any (`elem` ol) $ ons ) os---- |--- check whether an option is set------ reads the value of an attribute, usually applied to a document root node,--- and checks if the value represents True. The following strings are interpreted--- as true: \"1\", \"True\", \"true\", \"yes\", \"Yes\".--optionIsSet :: String -> Attributes -> Bool-optionIsSet n = isTrueValue . lookupDef "" n---- | check whether a string represents True------ definition:------ > isTrueValue = (`elem` ["1", "True", "true", "Yes", "yes"])--isTrueValue :: String -> Bool-isTrueValue = (`elem` ["1", "True", "true", "Yes", "yes"])---- ------------------------------------------------------------
src/Text/XML/HXT/DTDValidation/DocTransformation.hs view
@@ -42,6 +42,7 @@ import Data.Maybe import Data.List import Data.Ord+import qualified Data.Map as M -- ------------------------------------------------------------ @@ -49,8 +50,7 @@ -- Lookup-table which maps element names to their transformation functions. The -- transformation functions are XmlArrows. -type TransEnvTable = [TransEnv]-type TransEnv = (ElemName, TransFct)+type TransEnvTable = M.Map ElemName TransFct type ElemName = String type TransFct = XmlArrow @@ -81,18 +81,15 @@ traverseTree :: TransEnvTable -> XmlArrow traverseTree transEnv- = processTopDown- ( ( (transFct $< getName)- >>>- processChildren (traverseTree transEnv)- )- `when`- isElem- )+ = processTopDown ( (transFct $< getName)+ `when`+ isElem+ ) where transFct :: String -> XmlArrow- transFct name = fromMaybe this . lookup name $ transEnv+ transFct name = fromMaybe this . M.lookup name $ transEnv + -- | -- Build all transformation functions. --@@ -102,7 +99,8 @@ buildAllTransformationFunctions :: XmlTrees -> TransEnvTable buildAllTransformationFunctions dtdNodes- = (t_root, this)+ = M.fromList $+ (t_root, this) : concatMap (buildTransformationFunctions dtdNodes) dtdNodes @@ -116,7 +114,7 @@ -- -- - returns : entry for the lookup-table -buildTransformationFunctions :: XmlTrees -> XmlTree -> [TransEnv]+buildTransformationFunctions :: XmlTrees -> XmlTree -> [(ElemName, TransFct)] buildTransformationFunctions dtdPart dn | isDTDElementNode dn = [(name, transFct)]
− src/Text/XML/HXT/IO/GetHTTPLibCurl.hs
@@ -1,310 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.IO.GetHTTPLibCurl- Copyright : Copyright (C) 2008 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : stable- Portability: portable-- GET for http access with libcurl---}---- --------------------------------------------------------------module Text.XML.HXT.IO.GetHTTPLibCurl- ( getCont- )--where--import Control.Arrow ( first- , (>>>)- )-import Control.Concurrent.MVar-import Control.Monad ( when )--import qualified Data.ByteString as B-import qualified Data.ByteString.Char8 as C--import Data.Char ( isDigit- , isSpace- )-import Data.List ( isPrefixOf )--import Network.Curl--import System.IO-import System.IO.Unsafe ( unsafePerformIO )--import Text.ParserCombinators.Parsec ( parse )--import Text.XML.HXT.DOM.Util ( stringToLower )-import Text.XML.HXT.DOM.XmlKeywords-import Text.XML.HXT.DOM.XmlOptions ( isTrueValue )--import Text.XML.HXT.Parser.ProtocolHandlerUtil- ( parseContentType )-import Text.XML.HXT.Version---- ------------------------------------------------------------------ the global flag for initializing curl in the 1. call--isInitCurl :: MVar Bool-isInitCurl = unsafePerformIO $ newMVar False--{-# NOINLINE isInitCurl #-}--initCurl :: IO ()-initCurl- = do- i <- takeMVar isInitCurl- when (not i) ( do- _ <- curl_global_init 3- return ()- )- putMVar isInitCurl True---- ---------------------------------------------------------------- The curl lib is not thread save--curlResource :: MVar ()-curlResource = unsafePerformIO $ newMVar ()--{-# NOINLINE curlResource #-}--requestCurl :: IO ()-requestCurl = takeMVar curlResource--releaseCurl :: IO ()-releaseCurl = putMVar curlResource ()---- ------------------------------------------------------------------- the http protocol handler implemented by calling libcurl--- (<http://curl.haxx.se/>)--- via the curl binding--- <http://hackage.haskell.org/cgi-bin/hackage-scripts/package/curl>--- This function tries to support mostly all curl options concerning HTTP requests.--- The naming convetion is as follows: A curl option must be prefixed by the string--- \"curl\" and then written exactly as described in the curl man page--- (<http://curl.haxx.se/docs/manpage.html>).------ Example:------ > getCont [("curl--user-agent","My first HXT app"),("curl-e","http://the.referer.url/")] "http://..."------ will set the user agent and the referer URL for this request.--getCont :: [(String, String)] -> String -> IO (Either ([(String, String)], String)- ([(String, String)], String))-getCont options uri- = do- initCurl- requestCurl- resp <- curlGetResponse_ uri curlOptions- let resp' = evalResponse resp- resp' `seq`- releaseCurl- -- dumpResponse- return resp'- where- _dumpResponse r- = do- hPutStrLn stderr $ show $ respCurlCode r- hPutStrLn stderr $ show $ respStatus r- hPutStrLn stderr $ respStatusLine r- hPutStrLn stderr $ show $ respHeaders r- hPutStrLn stderr $ respBody r-- curlOptions- = defaultOptions ++ concatMap (uncurry copt) options ++ standardOptions-- defaultOptions -- these options may be overwritten- = [ CurlUserAgent ("hxt/" ++ hxt_version ++ " via libcurl")- , CurlFollowLocation True- ]-- standardOptions -- these options can't be overwritten- = [ CurlFailOnError False- , CurlHeader False- , CurlNoProgress True- ]- evalResponse r- | rc /= CurlOK- = Left ( [ mkH transferStatus "999"- , mkH transferMessage $ "curl library rc: " ++ show rc- ]- , "curl library error when requesting URI "- ++ show uri- ++ ": (curl return code=" ++ show rc ++ ") "- )- | rs < 200 && rs >= 300- = Left ( contentT rsh ++ headers- , "http error when accessing URI "- ++ show uri- ++ ": "- ++ show rsl- )- | otherwise- = B.length body- `seq`- Right ( contentT rsh ++ headers- , C.unpack body- )- where- body :: B.ByteString- body = respBody r-- mkH x y = (x, dropWhile isSpace y)-- headers- = map (\ (k, v) -> mkH (httpPrefix ++ stringToLower k) v) rsh- ++- statusLine (words rsl)-- contentT- = map (first stringToLower) -- all header names to lowercase- >>>- filter ((== "content-type") . fst) -- select content-type header- >>>- reverse -- when libcurl is called with automatic redirects, there are more than one content-type headers- >>>- take 1 -- take the last one, (if at leat one is found)- >>>- map snd -- select content-type value- >>>- map ( either (const []) id- . parse parseContentType "" -- parse the content-type for mimetype and charset- )- >>>- concat-- statusLine (vers : _code : msg) -- the status line of the curl response can be an old one, e.g. in the case of a redirect,- = [ mkH transferVersion vers -- so the return code is taken from the status field, which is contains the last status- , mkH transferMessage $ unwords msg- , mkH transferStatus $ show rs- ]- statusLine _- = []-- rc = respCurlCode r- rs = respStatus r- rsl = respStatusLine r- rsh = respHeaders r---- --------------------------------------------------------------copt :: String -> String -> [CurlOption]-copt k v- | "curl" `isPrefixOf` k- = opt2copt (drop 4 k) v-- | k `elem` [a_proxy, a_redirect]- = opt2copt k v-- | k == a_options_curl- = curlOptionString v-- | otherwise- = []--opt2copt :: String -> String -> [CurlOption]-opt2copt k v- | k `elem` ["-A", "--user-agent"] = [CurlUserAgent v]- | k `elem` ["-b", "--cookie"] = [CurlCookie v]- | k == "--connect-timeout"- &&- isIntArg v = [CurlConnectTimeout $ read v]- | k == "--crlf" = [CurlCRLF $ isTrue v]- | k `elem` ["-d", "--data"] = [CurlPostFields $ lines v]- | k `elem` ["-e", "--referer"] = [CurlReferer v]- | k `elem` ["-H", "--header"] = [CurlHttpHeaders $ lines v]- | k == "--ignore-content-length" = [CurlIgnoreContentLength $ isTrue v]- | k `elem` ["-I", "--head"] = [CurlNoBody $ isTrue v]- | k `elem` ["-L", "--location", a_redirect]- = [CurlFollowLocation $ isTrue v]- | k == "--max-filesize"- &&- isIntArg v = [CurlMaxFileSizeLarge $ read v]- | k `elem` ["-m", "--max-time"]- &&- isIntArg v = [CurlTimeoutMS $ read v]- | k `elem` ["-n", "--netrc"] = [CurlNetrcFile v]- | k `elem` ["--ssl-verify-peer"] = [CurlSSLVerifyPeer $ read v]- | k `elem` ["-R", "--remote-time"] = [CurlFiletime $ isTrue v]- | k `elem` ["-u", "--user"] = [CurlUserPwd v]- | k `elem` ["-U", "--proxy-user"] = [CurlProxyUserPwd v]- | k `elem` ["-x", "--proxy", a_proxy]- = proxyOptions- | k `elem` ["-X", "--request"] = [CurlCustomRequest v]- | k `elem` ["-y", "--speed-time"]- &&- isIntArg v = [CurlLowSpeedTime $ read v]- | k `elem` ["-Y", "--speed-limit"]- &&- isIntArg v = [CurlLowSpeed $ read v]- | k `elem` ["-z", "--time-cond", a_if_modified_since]- = ifModifiedOptions-- | k == a_if_modified_since = [CurlHttpHeaders $ ["If-Modified-Since: " ++ v] ]- -- CurlTimeValue seems to be buggy, therefore this workaround- | k == "--max-redirs"- &&- isIntArg v = [CurlMaxRedirs $ read v]- | k `elem` ["-0", "--http1.0"] = [CurlHttpVersion HttpVersion10]- | otherwise = []- where- ifModifiedOptions- | "-" `isPrefixOf` v- &&- isIntArg v' = [CurlTimeCondition TimeCondIfUnmodSince- ,CurlTimeValue $ read v'- ]- | isIntArg v = [CurlTimeCondition TimeCondIfModSince- ,CurlTimeValue $ read v'- ]- | otherwise = []- where- v' = tail v-- proxyOptions- = [ CurlProxyPort pport- , CurlProxy phost- ]- where- pport- | isIntArg ppp = read v- | otherwise = 1080- (phost, pp) = span (/=':') v- ppp = drop 1 pp----isTrue :: String -> Bool-isTrue s = null s || isTrueValue s--isIntArg :: String -> Bool-isIntArg s = not (null s) && all isDigit s--curlOptionString :: String -> [CurlOption]-curlOptionString- = concatMap (uncurry copt) . opts . words- where- opts l- | null l = []- | not ("-" `isPrefixOf` k) = opts l1 -- k not an option: ignore- | null l1 = opts (k:"":l1) -- last option- | "-" `isPrefixOf` v = (k, "") : opts (v:l) -- k option without arg- | otherwise = (k, v) : opts l2 -- k with value- where- (k:l1) = l- (v:l2) = l1---- ------------------------------------------------------------
− src/Text/XML/HXT/Parser/TagSoup.hs
@@ -1,495 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.Parser.TagSoup- Copyright : Copyright (C) 2005-2008 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : experimental- Portability: portable-- lazy HTML and simpe XML parser implemented with tagsoup- parsing is done with a very simple monadic top down parser---}---- --------------------------------------------------------------module Text.XML.HXT.Parser.TagSoup- ( parseHtmlTagSoup- )-where---- --------------------------------------------------------------import Data.Char (toLower)-import Data.Maybe--import Text.HTML.TagSoup-import Text.HTML.TagSoup.Entity ( lookupNumericEntity- )-import Text.XML.HXT.DOM.Unicode ( isXmlSpaceChar- )-import Text.XML.HXT.Parser.HtmlParsec ( isEmptyHtmlTag- , isInnerHtmlTagOf- , closesHtmlTag- )-import Text.XML.HXT.Parser.XhtmlEntities-import Text.XML.HXT.DOM.Interface ( XmlTrees- , QName- , NsEnv- , toNsEnv- , newXName- , nullXName- , mkQName'- , mkName- , isWellformedQualifiedName- , c_warn- , a_xml- , a_xmlns- , xmlNamespace- , xmlnsNamespace- )-import Text.XML.HXT.DOM.XmlNode ( isElem- , mkError- , mkCmt- , mkText- , mkElement- , mkAttr- )---- -------------------------------------------- The name table contains the id map. All element and attribute names are stored--- the first time they are ecountered, and later always this name is used,--- not a string built by the parser.--type STag = Tag String--type Tags = [STag]--type Context = ([String], NsEnv)--type State = Tags--newtype Parser a = P { parse :: State -> (a, State)}--instance Monad Parser where- return x = P $ \ ts -> (x, ts)- p >>= f = P $ \ ts -> let- (res, ts') = parse p ts- in- parse (f res) ts'--runParser :: Parser a -> Tags -> a-runParser p ts = fst . parse p $ ts---- ------------------------------------------cond :: Parser Bool -> Parser a -> Parser a -> Parser a-cond c t e = do- p <- c- if p then t else e--lookAhead :: (STag -> Bool) -> Parser Bool-lookAhead p = P $ \ s -> (not (null s) && p (head s), s)---- ------------------------------------------- primitive look ahead tests--isEof :: Parser Bool-isEof = P $ \ s -> (null s, s)--isText :: Parser Bool-isText = lookAhead is- where- is (TagText _) = True- is _ = False--isCmt :: Parser Bool-isCmt = lookAhead is- where- is (TagComment _) = True- is _ = False--isWarn :: Parser Bool-isWarn = lookAhead is- where- is (TagWarning _) = True- is _ = False--isPos :: Parser Bool-isPos = lookAhead is- where- is (TagPosition _ _) = True- is _ = False--isCls :: Parser Bool-isCls = lookAhead is- where- is (TagClose _) = True- is _ = False--isOpn :: Parser Bool-isOpn = lookAhead is- where- is (TagOpen _ _) = True- is _ = False---- ------------------------------------------- primitive symbol parsers--getTag :: Parser STag-getTag = P $ \ (t1:ts1) -> (t1, ts1)--getSym :: (STag -> a) -> Parser a-getSym f = do- t <- getTag- return (f t)--getText :: Parser String-getText = getSym sym- where- sym (TagText t) = t- sym _ = undefined--getCmt :: Parser String-getCmt = getSym sym- where- sym (TagComment c) = c- sym _ = undefined--getWarn :: Parser String-getWarn = getSym sym- where- sym (TagWarning w) = w- sym _ = undefined--getPos :: Parser (Int, Int)-getPos = getSym sym- where- sym (TagPosition l c) = (l, c)- sym _ = undefined--getCls :: Parser String-getCls = getSym sym- where- sym (TagClose n) = n- sym _ = undefined--getOpn :: Parser (String, [(String,String)])-getOpn = getSym sym- where- sym (TagOpen n al) = (n, al)- sym _ = undefined---- ------------------------------------------- pushback parsers for inserting missing tags--pushBack :: STag -> Parser ()-pushBack t = P $ \ ts -> ((), t:ts)--insCls :: String -> Parser ()-insCls n = pushBack (TagClose n)--insOpn :: String -> [(String, String)] -> Parser ()-insOpn n al = pushBack (TagOpen n al)---- ------------------------------------------mkQN :: Bool -> Bool -> NsEnv -> String -> Parser QName-mkQN withNamespaces isAttr env s- | withNamespaces- = return qn1- | otherwise- = return qn0- where- qn1- | isAttr && isSimpleName = s'- | isSimpleName = mkQName' nullXName (newXName s) (nsUri nullXName)- | isWellformedQualifiedName s = mkQName' px' lp' (nsUri px')- | otherwise = s'- qn0 = s'-- nsUri x = fromMaybe nullXName . lookup x $ env- isSimpleName = all (/= ':') s- (px, (_ : lp)) = span(/= ':') s- px' = newXName px- lp' = newXName lp- s' = mkName s--extendNsEnv :: Bool -> [(String, String)] -> NsEnv -> NsEnv-extendNsEnv withNamespaces al1 env- | withNamespaces- = toNsEnv (concatMap (uncurry addNs) al1) ++ env- | otherwise- = env- where- addNs n v- | px == a_xmlns- &&- (null lp || (not . null . tail $ lp))- = [(drop 1 lp, v)]- | otherwise- = []- where- (px, lp) = span (/= ':') n---- -------------------------------------------- own entity lookup to prevent problems with & and tagsoup hack for IE--lookupEntity :: Bool -> Bool -> (String, Bool) -> Tags-lookupEntity withWarnings _asHtml (e0@('#':e), withSemicolon)- = case lookupNumericEntity e of- Just c -> (TagText [c])- : missingSemi- Nothing -> ( TagText $ "&" ++ e0 ++ [';' | withSemicolon])- : if withWarnings- then (TagWarning $ "illegal char reference: &" ++ e ++ ";")- : missingSemi- else []- where- missingSemi- | withWarnings- &&- not withSemicolon = [TagWarning $ "missing \";\" at end of char reference: &" ++ e]- | otherwise = []--lookupEntity withWarnings asHtml (e, withSemicolon)- = case (lookup e entities) of- Just x -> (TagText [toEnum x])- : missingSemi- Nothing -> (TagText $ "&" ++ e ++ [';' | withSemicolon])- : if withWarnings- then (TagWarning $ "Unknown entity reference: &" ++ e ++ ";")- : missingSemi- else []- where- entities- | asHtml = xhtmlEntities- | otherwise = xhtmlEntities -- xmlEntities (TODO: xhtml is xml and html)- missingSemi- | withWarnings- &&- not withSemicolon = [TagWarning $ "missing \";\" at end of entity reference: &" ++ e]- | otherwise = []--lookupEntityAttr :: Bool -> Bool -> (String, Bool) -> (String, Tags)-lookupEntityAttr withWarnings asHtml (e, b)- | null r = (s, r)- | otherwise = ("&" ++ s ++ [';' | b], r)- where- (TagText s) : r = lookupEntity withWarnings asHtml (e, b)---- -----------------------------------------{-- entityData x = case lookupEntity y of- Just y -> [TagText $ fromChar y]- Nothing -> [TagText $ fromString $ "&" ++ y ++ ";"- ,TagWarning $ fromString $ "Unknown entity: " ++ y]- where y = toString x-- entityAttrib (x,b) = case lookupEntity y of- Just y -> (fromChar y, [])- Nothing -> (fromString $ "&" ++ y ++ [';'|b], [TagWarning $ fromString $ "Unknown entity: " ++ y])- where y = toString x--}--- -------------------------------------------- |--- Turns all element and attribute names to lower case--- even !DOCTYPE stuff. But this is discarded when parsing the tagsoup--lowerCaseNames :: Tags -> Tags-lowerCaseNames- = map f- where- f (TagOpen name attrs)- = TagOpen (nameToLower name) (map attrToLower attrs)- f (TagClose name)- = TagClose (nameToLower name)- f a = a- nameToLower = map toLower- attrToLower (an, av) = (nameToLower an, av)---- ------------------------------------------- the main parser--parseHtmlTagSoup :: Bool -> Bool -> Bool -> Bool -> Bool -> String -> String -> XmlTrees-parseHtmlTagSoup withNamespaces withWarnings withComment removeWhiteSpace asHtml doc- = ( docRootElem- . runParser (buildCont initContext)- . ( if asHtml- then lowerCaseNames- else id- )- . tagsoupParse- )- where- tagsoupParse :: String -> Tags- tagsoupParse = parseTagsOptions tagsoupOptions-- tagsoupOptions :: ParseOptions String- tagsoupOptions = parseOptions' { optTagWarning = withWarnings- , optEntityData = lookupEntity withWarnings asHtml- , optEntityAttrib = lookupEntityAttr withWarnings asHtml- }- where- parseOptions' :: ParseOptions String- parseOptions' = parseOptions-- -- This is essential for lazy parsing:- -- the call of "take 1" stops parsing, when the first element is detected- -- no check on end of input sequence is required to build this (0- or 1-element list)- -- so eof is never checked unneccessarily-- docRootElem- = take 1 . filter isElem-- initContext = ( []- , toNsEnv $- [ (a_xml, xmlNamespace)- , (a_xmlns, xmlnsNamespace)- ]- )-- wrap = (:[])-- warn- | withWarnings = wrap . mkError c_warn . show . (doc ++) . (" " ++)- | otherwise = const []- cmt- | withComment = wrap . mkCmt- | otherwise = const []- txt- | removeWhiteSpace- = \ t ->- if all isXmlSpaceChar t- then []- else wrap . mkText $ t- | otherwise = wrap . mkText-- isEmptyElem- | asHtml = isEmptyHtmlTag- | otherwise = const False-- isInnerElem- | asHtml = isInnerHtmlTagOf- | otherwise = const (const False)-- closesElem- | asHtml = \ ns n1 ->- not (null ns)- &&- n1 `closesHtmlTag` (head ns)- | otherwise = const (const False)-- buildCont :: Context -> Parser XmlTrees- buildCont ns- = cond isText ( do- t <- getText- rl <- buildCont ns- return (txt t ++ rl)- )- ( cond isOpn ( do- (n,al) <- getOpn- openTag ns n al- )- ( cond isCls ( do- n <- getCls- closeTag ns n- )- ( cond isCmt ( do- c <- getCmt- rl <- buildCont ns- return (cmt c ++ rl)- )- ( cond isWarn ( do- w <- getWarn- rl <- buildCont ns- return (warn w ++ rl)- )- ( cond isPos ( do- _ <- getPos- buildCont ns- )- ( cond isEof ( do- _ <- isEof- closeAll ns- )- ( return (warn "parse error in tagsoup tree construction")- )- )- )- )- )- )- )- where- closeTag :: Context -> String -> Parser XmlTrees- closeTag ((n':_), _) n1- | n' == n1 = return [] -- a normal closing tag- -- all other cases try to repair wrong html- closeTag ns'@((n':_), _) n1 -- n1 closes n implicitly- | n' `isInnerElem` n1 -- e.g. <td>...</tr>- = do- insCls n1 -- pushback </n1>- insCls n' -- insert a </n'>- buildCont ns' -- try again- closeTag ns' n1- | isEmptyElem n1 = buildCont ns' -- ignore a redundant closing tag for empty element- closeTag ns'@((n':ns1'), _) n1 -- insert a missing closing tag- | n1 `elem` ns1' = do- insCls n1- insCls n'- rl <- buildCont ns'- return ( warn ("closing tag " ++ show n' ++- " expected, but " ++ show n1 ++ " found")- ++ rl- )- closeTag ns' n1 -- ignore a wrong closing tag- = do- rl <- buildCont ns'- return ( warn ("no opening tag for closing tag " ++ show n1)- ++ rl- )-- openTag :: Context -> String -> [(String, String)] -> Parser XmlTrees- openTag cx'@(ns',env') n1 al1- | isPiDT n1 = buildCont cx'- | isEmptyElem n1- = do- qn <- mkElemQN nenv n1- al <- mkAttrs al1- rl <- buildCont cx'- return (mkElement qn al [] : rl)- | closesElem ns' n1 = do- insOpn n1 al1- insCls (head ns')- buildCont cx'- | otherwise = do- qn <- mkElemQN nenv n1- al <- mkAttrs al1- cs <- buildCont ((n1 : ns'), nenv)- rl <- buildCont cx'- return (mkElement qn al cs : rl)- where- nenv = extendNsEnv withNamespaces al1 env'- mkElemQN = mkQN withNamespaces False- mkAttrQN = mkQN withNamespaces True- isPiDT ('?':_) = True- isPiDT ('!':_) = True- isPiDT _ = False- mkAttrs = mapM (uncurry mkA)- mkA an av = do- qan <- mkAttrQN nenv an- return (mkAttr qan (wrap . mkText $ av))-- closeAll :: ([String], NsEnv) -> Parser XmlTrees- closeAll (ns',_) = return (concatMap wrn ns')- where- wrn = warn . ("insert missing closing tag " ++) . show---- ------------------------------------------------------------
src/Text/XML/HXT/Parser/XmlCharParser.hs view
@@ -1,8 +1,19 @@--- |--- UTF-8 character parser and simple XML token parsers------ Version : $Id: XmlCharParser.hs,v 1.2 2005/05/31 16:01:12 hxml Exp $+-- ------------------------------------------------------------ +{- |+ Module : Text.XML.HXT.Parser.XmlCharParser+ Copyright : Copyright (C) 2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : stable+ Portability: portable++ UTF-8 character parser and simple XML token parsers+-}++-- ------------------------------------------------------------+ module Text.XML.HXT.Parser.XmlCharParser ( xmlChar -- xml char parsers , xmlNameChar@@ -14,7 +25,17 @@ ) where -import Text.XML.HXT.DOM.Unicode+import Data.Char.Properties.XMLCharProps( isXmlChar+ , isXmlNameChar+ , isXmlNameStartChar+ , isXmlNCNameChar+ , isXmlNCNameStartChar+ , isXmlLetter+ , isXmlSpaceChar+ )++import Data.String.Unicode+ import Text.ParserCombinators.Parsec -- ------------------------------------------------------------
src/Text/XML/HXT/Parser/XmlDTDTokenParser.hs view
@@ -8,7 +8,6 @@ Maintainer : Uwe Schmidt (uwe@fh-wedel.de) Stability : experimental Portability: portable- Version : $Id: XmlDTDTokenParser.hs,v 1.4 2005/09/02 17:09:39 hxml Exp $ Parsec parser for tokenizing DTD declarations for ELEMENT, ATTLIST, ENTITY and NOTATION
src/Text/XML/HXT/Parser/XmlParsec.hs view
@@ -8,7 +8,6 @@ Maintainer : Uwe Schmidt (uwe@fh-wedel.de) Stability : experimental Portability: portable- Version : $Id: XmlParsec.hs,v 1.14 2005/09/02 17:09:39 hxml Exp $ Xml Parsec parser with pure filter interface
src/Text/XML/HXT/Parser/XmlTokenParser.hs view
@@ -2,13 +2,12 @@ {- | Module : Text.XML.HXT.Parser.XmlTokenParser- Copyright : Copyright (C) 2005 Uwe Schmidt+ Copyright : Copyright (C) 2010 Uwe Schmidt License : MIT Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : experimental+ Stability : stable Portability: portable- Version : $Id: XmlTokenParser.hs,v 1.3 2005/09/02 17:09:39 hxml Exp $ Parsec parser for XML tokens @@ -79,23 +78,23 @@ ) where +import Data.Char.Properties.XMLCharProps+ ( isXmlChar+ )+import Data.String.Unicode+ ( intToCharRef+ , intToCharRefHex+ )+ import Text.ParserCombinators.Parsec import Text.XML.HXT.DOM.Interface- import Text.XML.HXT.DOM.XmlNode ( mkDTDElem , mkText , mkCharRef , mkEntityRef )--import Text.XML.HXT.DOM.Unicode- ( isXmlChar- , intToCharRef- , intToCharRefHex- )- import Text.XML.HXT.Parser.XmlCharParser ( xmlNameChar , xmlNameStartChar
− src/Text/XML/HXT/RelaxNG.hs
@@ -1,24 +0,0 @@--- |--- This helper module exports elements from the basic Relax NG libraries:--- Validator, CreatePattern, PatternToString and DataTypes.--- It is the main entry point to the Relax NG schema validator of the Haskell--- XML Toolbox.------ Author : Torben Kuseler------ Version : $Id: RelaxNG.hs,v 1.1 2005/09/02 17:09:39 hxml Exp $--module Text.XML.HXT.RelaxNG- ( module Text.XML.HXT.RelaxNG.PatternToString- , module Text.XML.HXT.RelaxNG.Validator- , module Text.XML.HXT.RelaxNG.DataTypes- , module Text.XML.HXT.RelaxNG.CreatePattern- , module Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch- )-where--import Text.XML.HXT.RelaxNG.PatternToString-import Text.XML.HXT.RelaxNG.Validator-import Text.XML.HXT.RelaxNG.DataTypes-import Text.XML.HXT.RelaxNG.CreatePattern-import Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch
− src/Text/XML/HXT/RelaxNG/BasicArrows.hs
@@ -1,326 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.RelaxNG.BasicArrows- Copyright : Copyright (C) 2005 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : experimental- Portability: portable- Version : $Id$-- Constants and basic arrows for Relax NG---}---- --------------------------------------------------------------module Text.XML.HXT.RelaxNG.BasicArrows-where--import Control.Arrow.ListArrows--import Text.XML.HXT.DOM.Interface-import Text.XML.HXT.Arrow.XmlArrow- hiding- ( mkText- , mkError- )--hasRngName :: ArrowXml a => String -> a XmlTree XmlTree-hasRngName s- = hasName s- `orElse`- ( hasLocalPart s >>> hasNamespaceUri relaxNamespace )--checkRngName :: ArrowXml a => [String] -> a XmlTree XmlTree-checkRngName l- = ( isElem- >>>- catA (map hasRngName l)- )- `guards` this--noOfChildren :: ArrowXml a => (Int -> Bool) -> a XmlTree XmlTree-noOfChildren p- = getChildren- >>.- (\ l -> if p (length l) then l else [])---- --------------------------------------------------------------isAttributeRef :: ArrowXml a => a XmlTree XmlTree-isAttributeRef- = checkRngName ["attribute", "ref"]--isAttributeRefTextListGroupInterleaveOneOrMoreEmpty :: ArrowXml a => a XmlTree XmlTree-isAttributeRefTextListGroupInterleaveOneOrMoreEmpty- = checkRngName ["attribute", "ref", "text", "list", "group", "interleave", "oneOrMore", "empty"]--isAttributeRefTextListInterleave :: ArrowXml a => a XmlTree XmlTree-isAttributeRefTextListInterleave- = checkRngName ["attribute", "ref", "text", "list", "interleave"]--isAttributeListGroupInterleaveOneOrMore :: ArrowXml a => a XmlTree XmlTree-isAttributeListGroupInterleaveOneOrMore- = checkRngName ["attribute", "list", "group", "interleave", "oneOrMore"]--isExternalRefInclude :: ArrowXml a => a XmlTree XmlTree-isExternalRefInclude- = checkRngName ["externalRef", "include"]--isNameNsNameValue :: ArrowXml a => a XmlTree XmlTree-isNameNsNameValue- = checkRngName ["name", "nsName", "value"]--isNameNsName :: ArrowXml a => a XmlTree XmlTree-isNameNsName- = checkRngName ["name", "nsName"]--isNameAnyNameNsName :: ArrowXml a => a XmlTree XmlTree-isNameAnyNameNsName- = checkRngName ["name", "anyName", "nsName"]--isDefineOneOrMoreZeroOrMoreOptionalListMixed :: ArrowXml a => a XmlTree XmlTree-isDefineOneOrMoreZeroOrMoreOptionalListMixed- = checkRngName ["define", "oneOrMore", "zeroOrMore", "optional", "list", "mixed"]--isChoiceGroupInterleave :: ArrowXml a => a XmlTree XmlTree-isChoiceGroupInterleave- = checkRngName ["choice", "group", "interleave"]--isChoiceGroupInterleaveOneOrMore :: ArrowXml a => a XmlTree XmlTree-isChoiceGroupInterleaveOneOrMore- = checkRngName ["choice", "group", "interleave", "oneOrMore"]--isGroupInterleave :: ArrowXml a => a XmlTree XmlTree-isGroupInterleave- = checkRngName ["group", "interleave"]---- --------------------------------------------------------------isRngAnyName :: ArrowXml a => a XmlTree XmlTree-isRngAnyName = isElem >>> hasRngName "anyName"--isRngAttribute :: ArrowXml a => a XmlTree XmlTree-isRngAttribute = isElem >>> hasRngName "attribute"--isRngChoice :: ArrowXml a => a XmlTree XmlTree-isRngChoice = isElem >>> hasRngName "choice"--isRngCombine :: ArrowXml a => a XmlTree XmlTree-isRngCombine = isElem >>> hasRngName "combine"--isRngData :: ArrowXml a => a XmlTree XmlTree-isRngData = isElem >>> hasRngName "data"--isRngDefine :: ArrowXml a => a XmlTree XmlTree-isRngDefine = isElem >>> hasRngName "define"--isRngDiv :: ArrowXml a => a XmlTree XmlTree-isRngDiv = isElem >>> hasRngName "div"--isRngElement :: ArrowXml a => a XmlTree XmlTree-isRngElement = isElem >>> hasRngName "element"--isRngEmpty :: ArrowXml a => a XmlTree XmlTree-isRngEmpty = isElem >>> hasRngName "empty"--isRngExcept :: ArrowXml a => a XmlTree XmlTree-isRngExcept = isElem >>> hasRngName "except"--isRngExternalRef :: ArrowXml a => a XmlTree XmlTree-isRngExternalRef = isElem >>> hasRngName "externalRef"--isRngGrammar :: ArrowXml a => a XmlTree XmlTree-isRngGrammar = isElem >>> hasRngName "grammar"--isRngGroup :: ArrowXml a => a XmlTree XmlTree-isRngGroup = isElem >>> hasRngName "group"--isRngInclude :: ArrowXml a => a XmlTree XmlTree-isRngInclude = isElem >>> hasRngName "include"--isRngInterleave :: ArrowXml a => a XmlTree XmlTree-isRngInterleave = isElem >>> hasRngName "interleave"--isRngList :: ArrowXml a => a XmlTree XmlTree-isRngList = isElem >>> hasRngName "list"--isRngMixed :: ArrowXml a => a XmlTree XmlTree-isRngMixed = isElem >>> hasRngName "mixed"--isRngName :: ArrowXml a => a XmlTree XmlTree-isRngName = isElem >>> hasRngName "name"--isRngNotAllowed :: ArrowXml a => a XmlTree XmlTree-isRngNotAllowed = isElem >>> hasRngName "notAllowed"--isRngNsName :: ArrowXml a => a XmlTree XmlTree-isRngNsName = isElem >>> hasRngName "nsName"--isRngOneOrMore :: ArrowXml a => a XmlTree XmlTree-isRngOneOrMore = isElem >>> hasRngName "oneOrMore"--isRngOptional :: ArrowXml a => a XmlTree XmlTree-isRngOptional = isElem >>> hasRngName "optional"--isRngParam :: ArrowXml a => a XmlTree XmlTree-isRngParam = isElem >>> hasRngName "param"--isRngParentRef :: ArrowXml a => a XmlTree XmlTree-isRngParentRef = isElem >>> hasRngName "parentRef"--isRngRef :: ArrowXml a => a XmlTree XmlTree-isRngRef = isElem >>> hasRngName "ref"--isRngRelaxError :: ArrowXml a => a XmlTree XmlTree-isRngRelaxError = isElem >>> hasRngName "relaxError"--isRngStart :: ArrowXml a => a XmlTree XmlTree-isRngStart = isElem >>> hasRngName "start"--isRngText :: ArrowXml a => a XmlTree XmlTree-isRngText = isElem >>> hasRngName "text"--isRngType :: ArrowXml a => a XmlTree XmlTree-isRngType = isElem >>> hasRngName "type"--isRngValue :: ArrowXml a => a XmlTree XmlTree-isRngValue = isElem >>> hasRngName "value"--isRngZeroOrMore :: ArrowXml a => a XmlTree XmlTree-isRngZeroOrMore = isElem >>> hasRngName "zeroOrMore"---- --------------------------------------------------------------mkRngElement :: ArrowXml a => String -> a n XmlTree -> a n XmlTree -> a n XmlTree-mkRngElement n = mkElement (mkQName "" n relaxNamespace)--mkRngChoice :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree-mkRngChoice = mkRngElement "choice"--mkRngDefine :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree-mkRngDefine = mkRngElement "define"--mkRngEmpty :: ArrowXml a => a n XmlTree -> a n XmlTree-mkRngEmpty a = mkRngElement "empty" a none--mkRngGrammar :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree-mkRngGrammar = mkRngElement "grammar"--mkRngGroup :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree-mkRngGroup = mkRngElement "group"--mkRngInterleave :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree-mkRngInterleave = mkRngElement "interleave"--mkRngName :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree-mkRngName = mkRngElement "name"--mkRngNotAllowed :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree-mkRngNotAllowed = mkRngElement "notAllowed"--mkRngOneOrMore :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree-mkRngOneOrMore = mkRngElement "oneOrMore"--mkRngRef :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree-mkRngRef = mkRngElement "ref"--mkRngRelaxError :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree-mkRngRelaxError = mkRngElement "relaxError"--mkRngStart :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree-mkRngStart = mkRngElement "start"--mkRngText :: ArrowXml a => a n XmlTree -> a n XmlTree-mkRngText a = mkRngElement "text" a none---- --------------------------------------------------------------setRngName :: ArrowXml a => String -> a XmlTree XmlTree-setRngName n = setElemName (mkQName "" n relaxNamespace)--setRngNameDiv :: ArrowXml a => a XmlTree XmlTree-setRngNameDiv = setRngName "div"--setRngNameRef :: ArrowXml a => a XmlTree XmlTree-setRngNameRef = setRngName "ref"---- ---------------------------------------------------------------- Attributes--isRngAttrAttribute :: ArrowXml a => a XmlTree XmlTree-isRngAttrAttribute = isAttr >>> hasRngName "attribute"--isRngAttrCombine :: ArrowXml a => a XmlTree XmlTree-isRngAttrCombine = isAttr >>> hasRngName "combine"--isRngAttrDatatypeLibrary :: ArrowXml a => a XmlTree XmlTree-isRngAttrDatatypeLibrary = isAttr >>> hasRngName "datatypeLibrary"--isRngAttrHref :: ArrowXml a => a XmlTree XmlTree-isRngAttrHref = isAttr >>> hasRngName "href"--isRngAttrName :: ArrowXml a => a XmlTree XmlTree-isRngAttrName = isAttr >>> hasRngName "name"--isRngAttrNs :: ArrowXml a => a XmlTree XmlTree-isRngAttrNs = isAttr >>> hasRngName "ns"--isRngAttrType :: ArrowXml a => a XmlTree XmlTree-isRngAttrType = isAttr >>> hasRngName "type"---- --------------------------------------------------------------hasRngAttrAttribute :: ArrowXml a => a XmlTree XmlTree-hasRngAttrAttribute = hasAttr "attribute"--hasRngAttrCombine :: ArrowXml a => a XmlTree XmlTree-hasRngAttrCombine = hasAttr "combine"--hasRngAttrDatatypeLibrary :: ArrowXml a => a XmlTree XmlTree-hasRngAttrDatatypeLibrary = hasAttr "datatypeLibrary"--hasRngAttrHref :: ArrowXml a => a XmlTree XmlTree-hasRngAttrHref = hasAttr "href"--hasRngAttrName :: ArrowXml a => a XmlTree XmlTree-hasRngAttrName = hasAttr "name"--hasRngAttrNs :: ArrowXml a => a XmlTree XmlTree-hasRngAttrNs = hasAttr "ns"--hasRngAttrType :: ArrowXml a => a XmlTree XmlTree-hasRngAttrType = hasAttr "type"---- --------------------------------------------------------------getRngAttrAttribute :: ArrowXml a => a XmlTree String-getRngAttrAttribute = getAttrValue "attribute"--getRngAttrCombine :: ArrowXml a => a XmlTree String-getRngAttrCombine = getAttrValue "combine"--getRngAttrDatatypeLibrary :: ArrowXml a => a XmlTree String-getRngAttrDatatypeLibrary = getAttrValue "datatypeLibrary"--getRngAttrDescr :: ArrowXml a => a XmlTree String-getRngAttrDescr = getAttrValue "descr"--getRngAttrHref :: ArrowXml a => a XmlTree String-getRngAttrHref = getAttrValue "href"--getRngAttrName :: ArrowXml a => a XmlTree String-getRngAttrName = getAttrValue "name"--getRngAttrNs :: ArrowXml a => a XmlTree String-getRngAttrNs = getAttrValue "ns"--getRngAttrType :: ArrowXml a => a XmlTree String-getRngAttrType = getAttrValue "type"---- -------------------------------------------------------------
− src/Text/XML/HXT/RelaxNG/CreatePattern.hs
@@ -1,349 +0,0 @@--- |------ Creates the 'Pattern' datastructure from a simplified Relax NG schema.--- The created datastructure is used in the validation algorithm--- (see also: "Text.XML.HXT.RelaxNG.Validation")--module Text.XML.HXT.RelaxNG.CreatePattern- ( createPatternFromXmlTree- , createNameClass- , firstChild- , lastChild- , module Text.XML.HXT.RelaxNG.PatternFunctions- )-where--import Control.Arrow.ListArrows--import Text.XML.HXT.DOM.Interface--import Text.XML.HXT.Arrow.XmlArrow--import Text.XML.HXT.RelaxNG.DataTypes-import Text.XML.HXT.RelaxNG.BasicArrows-import Text.XML.HXT.RelaxNG.PatternFunctions--import Data.Maybe- ( fromMaybe )--import Data.List- ( isPrefixOf )---- ---------------------------------------------------------------- | Creates the 'Pattern' datastructure from a simplified Relax NG schema.--createPatternFromXmlTree :: LA XmlTree Pattern-createPatternFromXmlTree = createPatternFromXml $< createEnv- where- -- | Selects all define-pattern and creates an environment list.- -- Each list entry maps the define name to the children of the define-pattern.- -- The map is used to replace a ref-pattern with the referenced define-pattern.- createEnv :: LA XmlTree Env- createEnv = listA $ deep isRngDefine- >>>- (getRngAttrName &&& getChildren)----- | Transforms each XML-element to the corresponding pattern--createPatternFromXml :: Env -> LA XmlTree Pattern-createPatternFromXml env- = choiceA [- isRoot :-> processRoot env,- isRngEmpty :-> constA Empty,- isRngNotAllowed :-> mkNotAllowed,- isRngText :-> constA Text,- isRngChoice :-> mkRelaxChoice env,- isRngInterleave :-> mkRelaxInterleave env,- isRngGroup :-> mkRelaxGroup env,- isRngOneOrMore :-> mkRelaxOneOrMore env,- isRngList :-> mkRelaxList env,- isRngData :-> mkRelaxData env,- isRngValue :-> mkRelaxValue,- isRngAttribute :-> mkRelaxAttribute env,- isRngElement :-> mkRelaxElement env,- isRngRef :-> mkRelaxRef env,- this :-> mkRelaxError ""- ]---processRoot :: Env -> LA XmlTree Pattern-processRoot env- = getChildren- >>>- choiceA [- isRngRelaxError :-> (mkRelaxError $< getRngAttrDescr),- isRngGrammar :-> (processGrammar env),- this :-> (mkRelaxError "no grammar-pattern in schema")- ]---processGrammar :: Env -> LA XmlTree Pattern-processGrammar env- = getChildren- >>>- choiceA [- isRngDefine :-> none,- isRngRelaxError :-> (mkRelaxError $< getAttrValue "desc"),- isRngStart :-> (getChildren >>> createPatternFromXml env),- this :-> (mkRelaxError "no start-pattern in schema")- ]---{- |- Transforms a ref-element.- The value of the name-attribute is looked up in the environment list- to find the corresponding define-pattern.- Haskells lazy-evaluation is used to transform circular structures.--}-mkRelaxRef :: Env -> LA XmlTree Pattern-mkRelaxRef e- = getRngAttrName- >>>- arr (\n -> fromMaybe (notAllowed $ "define-pattern with name " ++ n ++ " not found")- . lookup n $ transformEnv e- )- where- transformEnv :: [(String, XmlTree)] -> [(String, Pattern)]- transformEnv env = [ (treeName, (transformEnvElem tree env)) | (treeName, tree) <- env]- transformEnvElem :: XmlTree -> [(String, XmlTree)] -> Pattern- transformEnvElem tree env = head $ runLA (createPatternFromXml env) tree----- | Transforms a notAllowed-element.-mkNotAllowed :: LA XmlTree Pattern-mkNotAllowed = constA $ notAllowed "notAllowed-pattern in Relax NG schema definition"----- | Creates an error message.-mkRelaxError :: String -> LA XmlTree Pattern-mkRelaxError errStr- = choiceA [- isRngRelaxError :-> (getRngAttrDescr >>> arr notAllowed),- isElem :-> ( getName- >>>- arr (\n -> notAllowed $ "Pattern " ++ n ++- " is not allowed in Relax NG schema"- )- ),- isAttr :-> ( getName- >>>- arr (\n -> notAllowed $ "Attribute " ++ n ++- " is not allowed in Relax NG schema"- )- ),- isError :-> (getErrorMsg >>> arr notAllowed),- this :-> (arr (\e -> notAllowed $ if errStr /= ""- then errStr- else "Can't create pattern from " ++ show e)- )- ]----- | Transforms a choice-element.-mkRelaxChoice :: Env -> LA XmlTree Pattern-mkRelaxChoice env- = ifA ( getChildren >>.- ( \ l -> if length l == 1 then l else [] )- )- ( createPatternFromXml env )- ( getTwoChildrenPattern env >>> arr2 Choice )---- | Transforms a interleave-element.-mkRelaxInterleave :: Env -> LA XmlTree Pattern-mkRelaxInterleave env- = getTwoChildrenPattern env- >>>- arr2 Interleave----- | Transforms a group-element.-mkRelaxGroup :: Env -> LA XmlTree Pattern-mkRelaxGroup env- = getTwoChildrenPattern env- >>>- arr2 Group----- | Transforms a oneOrMore-element.-mkRelaxOneOrMore :: Env -> LA XmlTree Pattern-mkRelaxOneOrMore env- = getOneChildPattern env- >>>- arr OneOrMore----- | Transforms a list-element.-mkRelaxList :: Env -> LA XmlTree Pattern-mkRelaxList env- = getOneChildPattern env- >>>- arr List----- | Transforms a data- or dataExcept-element.-mkRelaxData :: Env -> LA XmlTree Pattern-mkRelaxData env- = ifA (getChildren >>> isRngExcept)- (processDataExcept >>> arr3 DataExcept)- (processData >>> arr2 Data)- where- processDataExcept :: LA XmlTree (Datatype, (ParamList, Pattern))- processDataExcept = getDatatype &&& getParamList &&&- ( getChildren- >>>- isRngExcept- >>>- getChildren- >>>- createPatternFromXml env- )- processData :: LA XmlTree (Datatype, ParamList)- processData = getDatatype &&& getParamList- getParamList :: LA XmlTree ParamList- getParamList = listA $ getChildren- >>>- isRngParam- >>>- (getRngAttrName &&& (getChildren >>> getText))----- | Transforms a value-element.-mkRelaxValue :: LA XmlTree Pattern-mkRelaxValue = getDatatype &&& getValue &&& getContext- >>>- arr3 Value- where- getContext :: LA XmlTree Context- getContext = getAttrValue contextBaseAttr &&& getMapping- getMapping :: LA XmlTree [(Prefix, Uri)]- getMapping = listA $ getAttrl >>>- ( (getName >>> isA (contextAttributes `isPrefixOf`))- `guards`- ( (getName >>> arr (drop $ length contextAttributes))- &&&- (getChildren >>> getText)- )- )- getValue :: LA XmlTree String- getValue = (getChildren >>> getText) `orElse` (constA "")---getDatatype :: LA XmlTree Datatype-getDatatype = getRngAttrDatatypeLibrary- &&&- getRngAttrType----- | Transforms a attribute-element.--- The first child is a 'NameClass', the second (the last) one a pattern.--mkRelaxAttribute :: Env -> LA XmlTree Pattern-mkRelaxAttribute env- = ( ( firstChild >>> createNameClass )- &&&- ( lastChild >>> createPatternFromXml env )- )- >>>- arr2 Attribute---- | Transforms a element-element.--- The first child is a 'NameClass', the second (the last) one a pattern.-mkRelaxElement :: Env -> LA XmlTree Pattern-mkRelaxElement env- = ( ( firstChild >>> createNameClass )- &&&- ( lastChild >>> createPatternFromXml env )- )- >>>- arr2 Element----- | Creates a 'NameClass' from an \"anyName\"-, \"nsName\"- or \"name\"-Pattern,-createNameClass :: LA XmlTree NameClass-createNameClass- = choiceA- [ isRngAnyName :-> processAnyName- , isRngNsName :-> processNsName- , isRngName :-> processName- , isRngChoice :-> processChoice- , this :-> mkNameClassError- ]- where- processAnyName :: LA XmlTree NameClass- processAnyName- = ifA (getChildren >>> isRngExcept)- ( getChildren- >>> getChildren- >>> createNameClass- >>> arr AnyNameExcept- )- ( constA AnyName )-- processNsName :: LA XmlTree NameClass- processNsName- = ifA (getChildren >>> isRngExcept)- ( ( getRngAttrNs- &&&- ( getChildren >>> getChildren >>> createNameClass )- )- >>>- arr2 NsNameExcept- )- ( getRngAttrNs >>> arr NsName )-- processName :: LA XmlTree NameClass- processName- = (getRngAttrNs &&& (getChildren >>> getText)) >>> arr2 Name-- processChoice :: LA XmlTree NameClass- processChoice- = ( ( firstChild >>> createNameClass )- &&&- ( lastChild >>> createNameClass )- )- >>>- arr2 NameClassChoice--mkNameClassError :: LA XmlTree NameClass-mkNameClassError- = choiceA [ isRngRelaxError- :-> ( getRngAttrDescr- >>>- arr NCError- )- , isElem :-> ( getName- >>>- arr (\n -> NCError ("Can't create name class from element " ++ n))- )- , isAttr :-> ( getName- >>>- arr (\n -> NCError ("Can't create name class from attribute: " ++ n))- )- , isError :-> ( getErrorMsg- >>>- arr NCError- )- , this :-> ( arr (\e -> NCError $ "Can't create name class from " ++ show e) )- ]---getOneChildPattern :: Env -> LA XmlTree Pattern-getOneChildPattern env- = firstChild >>> createPatternFromXml env---getTwoChildrenPattern :: Env -> LA XmlTree (Pattern, Pattern)-getTwoChildrenPattern env- = ( getOneChildPattern env )- &&&- ( lastChild >>> createPatternFromXml env )---- | Simple access arrows--firstChild :: (ArrowTree a, Tree t) => a (t b) (t b)-firstChild = single getChildren--lastChild :: (ArrowTree a, Tree t) => a (t b) (t b)-lastChild = getChildren >>. (take 1 . reverse)
− src/Text/XML/HXT/RelaxNG/DataTypeLibMysql.hs
@@ -1,169 +0,0 @@--- |--- Datatype library for the MySQL datatypes------ $Id: DataTypeLibMysql.hs,v 1.1 2005/09/02 17:09:39 hxml Exp $--module Text.XML.HXT.RelaxNG.DataTypeLibMysql- ( mysqlNS- , mysqlDatatypeLib- )-where--import Text.XML.HXT.RelaxNG.DataTypeLibUtils--import Data.Maybe---- ---------------------------------------------------------------- | Namespace of the MySQL datatype library--mysqlNS :: String-mysqlNS = "http://www.mysql.com"----- | The main entry point to the MySQL datatype library.------ The 'DTC' constructor exports the list of supported datatypes and params.--- It also exports the specialized functions to validate a XML instance value with--- respect to a datatype.--mysqlDatatypeLib :: DatatypeLibrary-mysqlDatatypeLib = (mysqlNS, DTC datatypeAllowsMysql datatypeEqualMysql mysqlDatatypes)----- | All supported datatypes of the library-mysqlDatatypes :: AllowedDatatypes-mysqlDatatypes = [ -- numeric types- ("SIGNED-TINYINT", numericParams)- , ("UNSIGNED-TINYINT", numericParams)- , ("SIGNED-SMALLINT", numericParams)- , ("UNSIGNED-SMALLINT", numericParams)- , ("SIGNED-MEDIUMINT", numericParams)- , ("UNSIGNED-MEDIUMINT", numericParams)- , ("SIGNED-INT", numericParams)- , ("UNSIGNED-INT", numericParams)- , ("SIGNED-BIGINT", numericParams)- , ("UNSIGNED-BIGINT", numericParams)-- -- string types- , ("CHAR", stringParams)- , ("VARCHAR", stringParams)- , ("BINARY", stringParams)- , ("VARBINARY", stringParams)- , ("TINYTEXT", stringParams)- , ("TINYBLOB", stringParams)- , ("TEXT", stringParams)- , ("BLOB", stringParams)- , ("MEDIUMTEXT", stringParams)- , ("MEDIUMBLOB", stringParams)- , ("LONGTEXT", stringParams)- , ("LONGBLOB", stringParams)- ]----- | List of supported string datatypes-stringTypes :: [String]-stringTypes = [ "CHAR"- , "VARCHAR"- , "BINARY"- , "VARBINARY"- , "TINYTEXT"- , "TINYBLOB"- , "TEXT"- , "BLOB"- , "MEDIUMTEXT"- , "MEDIUMBLOB"- , "LONGTEXT"- , "LONGBLOB"- ]----- | List of supported numeric datatypes-numericTypes :: [String]-numericTypes = [ "SIGNED-TINYINT"- , "UNSIGNED-TINYINT"- , "SIGNED-SMALLINT"- , "UNSIGNED-SMALLINT"- , "SIGNED-MEDIUMINT"- , "UNSIGNED-MEDIUMINT"- , "SIGNED-INT"- , "UNSIGNED-INT"- , "SIGNED-BIGINT"- , "UNSIGNED-BIGINT"- ]----- | List of allowed params for the numeric datatypes-numericParams :: AllowedParams-numericParams = [ rng_maxExclusive- , rng_minExclusive- , rng_maxInclusive- , rng_minInclusive- ]----- | List of allowed params for the string datatypes-stringParams :: AllowedParams-stringParams = [ rng_length- , rng_maxLength- , rng_minLength- ]---- ------------------------------------------------------------------ | Tests whether a XML instance value matches a data-pattern.--datatypeAllowsMysql :: DatatypeAllows-datatypeAllowsMysql d params value _- = performCheck check value- where- check- | isJust ndt = checkNum (fromJust ndt)- | isJust sdt = checkStr (fromJust sdt)- | otherwise = failure $ errorMsgDataTypeNotAllowed mysqlNS d params- checkNum r = uncurry (numberValid d) r params- checkStr r = uncurry (stringValid d) r params- ndt = lookup d $- [ ("SIGNED-TINYINT", ((-128), 127))- , ("UNSIGNED-TINYINT", (0, 255))- , ("SIGNED-SMALLINT", ((-32768), 32767))- , ("UNSIGNED-SMALLINT", (0, 65535))- , ("SIGNED-MEDIUMINT", ((-8388608), 8388607))- , ("UNSIGNED-MEDIUMINT", (0, 16777215))- , ("SIGNED-INT", ((-2147483648), 2147483647))- , ("UNSIGNED-INT", (0, 4294967295))- , ("SIGNED-BIGINT", ((-9223372036854775808), 9223372036854775807))- , ("UNSIGNED-BIGINT", (0, 18446744073709551615))- ]- sdt = lookup d $- [ ("CHAR", (0, 255))- , ("VARCHAR", (0, 65535))- , ("BINARY", (0, 255))- , ("VARBINARY", (0, 65535))- , ("TINYTEXT", (0, 256))- , ("TINYBLOB", (0, 256))- , ("TEXT", (0, 65536))- , ("BLOB", (0, 65536))- , ("MEDIUMTEXT", (0, 16777216))- , ("MEDIUMBLOB", (0, 16777216))- , ("LONGTEXT", (0, 4294967296))- , ("LONGBLOB", (0, 4294967296))- ]---- ---------------------------------------------------------------- | Tests whether a XML instance value matches a value-pattern.--datatypeEqualMysql :: DatatypeEqual-datatypeEqualMysql d s1 _ s2 _- = performCheck check (s1, s2)- where- cmp nf = arr (\ (x1, x2) -> (nf x1, nf x2))- >>>- assert (uncurry (==)) (uncurry $ errorMsgEqual d)- check- | d `elem` stringTypes = cmp id- | d `elem` numericTypes = cmp normalizeNumber- | otherwise = failure $ const (errorMsgDataTypeNotAllowed0 mysqlNS d)---- ------------------------------------------------------------
− src/Text/XML/HXT/RelaxNG/DataTypeLibUtils.hs
@@ -1,407 +0,0 @@--- |--- exports helper functions for the integration of new datatype-libraries--module Text.XML.HXT.RelaxNG.DataTypeLibUtils- ( errorMsgEqual- , errorMsgDataTypeNotAllowed- , errorMsgDataTypeNotAllowed0- , errorMsgDataTypeNotAllowed2- , errorMsgDataLibQName- , errorMsgParam-- , rng_length- , rng_maxLength- , rng_minLength- ,rng_maxExclusive- , rng_minExclusive- , rng_maxInclusive- , rng_minInclusive-- , module Control.Arrow- , module Text.XML.HXT.DOM.Util- , module Text.XML.HXT.RelaxNG.Utils- , module Text.XML.HXT.RelaxNG.DataTypes-- , FunctionTable-- , stringValidFT -- generalized checkString- , fctTableString -- minLength, maxLenght, length- , fctTableList -- minLength, maxLenght, length-- , stringValid -- checkString- , numberValid -- checkNumeric-- , numParamValid-- , CheckA -- Check datatype- , CheckString -- CheckA String String- , CheckInteger -- CheckA Integer Integer-- , performCheck -- run a CheckA- , ok -- always true- , failure -- create an error meesage- , assert -- create a primitive check from a predicate- , assertMaybe -- create a primitive check from a maybe- , checkWith -- convert value before checking- )--where-import Prelude hiding (id, (.))--import Control.Category-import Control.Arrow--import Data.Maybe--import Text.XML.HXT.DOM.Util--import Text.XML.HXT.RelaxNG.DataTypes-import Text.XML.HXT.RelaxNG.Utils---- --------------------------------------------------------------newtype CheckA a b = C { runCheck :: a -> Either String b }--instance Category CheckA where- id = C $ Right-- f2 . f1 = C $ -- logical and: f1 and f2 must hold- \ x -> case runCheck f1 x of- Right y -> runCheck f2 y- Left e -> Left e--instance Arrow CheckA where- arr f = C ( Right . f ) -- unit: no check, always o.k., just a conversion-- first f1 = C $ -- check 1. component of a pair- \ ~(x1, x2) -> case runCheck f1 x1 of- Right y1 -> Right (y1, x2)- Left e -> Left e-- second f2 = C $ -- check 2. component of a pair- \ ~(x1, x2) -> case runCheck f2 x2 of- Right y2 -> Right (x1, y2)- Left e -> Left e----instance ArrowZero CheckA where- zeroArrow = C $ const (Left "") -- always false: zero--instance ArrowPlus CheckA where- f1 <+> f2 = C $ -- logical or- \ x -> case runCheck f1 x of- Right y1 -> Right y1- Left e1 -> case runCheck f2 x of- Right y2 -> Right y2- Left e2 -> Left ( if null e1- then e2- else- if null e2- then e1- else e1 ++ " or " ++ e2- )--type CheckString = CheckA String String-type CheckInteger = CheckA Integer Integer---- | run a check and deliver Just an error message or Nothing--performCheck :: CheckA a b -> a -> Maybe String-performCheck c = either Just (const Nothing) . runCheck c---- | always failure--failure :: (a -> String) -> CheckA a b-failure msg = C (Left . msg)---- | every thing is fine--ok :: CheckA a a-ok = arr id---- | perform a simple check with a predicate p,--- when the predicate holds, assert acts as identity,--- else an error message is generated--assert :: (a -> Bool) -> (a -> String) -> CheckA a a-assert p msg = C $ \ x -> if p x then Right x else Left (msg x)---- | perform a simple check with a Maybe function, Nothing indicates error--assertMaybe :: (a -> Maybe b) -> (a -> String) -> CheckA a b-assertMaybe f msg- = C $ \ x -> case f x of- Nothing -> Left (msg x)- Just y -> Right y---- | perform a check, but convert the value before checking--checkWith :: (a -> b) -> CheckA b c -> CheckA a a-checkWith f c = C $- \ x -> case runCheck c (f x) of- Right _ -> Right x- Left e -> Left e---- ---------------------------------------------------------------- RelaxNG attribute names--rng_length, rng_maxLength, rng_minLength- ,rng_maxExclusive, rng_minExclusive, rng_maxInclusive, rng_minInclusive :: String--rng_length = "length"-rng_maxLength = "maxLength"-rng_minLength = "minLength"--rng_maxExclusive = "maxExclusive"-rng_minExclusive = "minExclusive"-rng_maxInclusive = "maxInclusive"-rng_minInclusive = "minInclusive"---- ---------------------------------------------------------------- | Function table type--type FunctionTable = [(String, String -> String -> Bool)]---- | Function table for numeric tests,--- XML document value is first operand, schema value second--fctTableNum :: (Ord a, Num a) => [(String, a -> a -> Bool)]-fctTableNum- = [ (rng_maxExclusive, (<))- , (rng_minExclusive, (>))- , (rng_maxInclusive, (<=))- , (rng_minInclusive, (>=))- ]---- | Function table for string tests,--- XML document value is first operand, schema value second-fctTableString :: FunctionTable-fctTableString- = [ (rng_length, (numParamValid (==)))- , (rng_maxLength, (numParamValid (<=)))- , (rng_minLength, (numParamValid (>=)))- ]---- | Function table for list tests,--- XML document value is first operand, schema value second--fctTableList :: FunctionTable-fctTableList- = [ (rng_length, (listParamValid (==)))- , (rng_maxLength, (listParamValid (<=)))- , (rng_minLength, (listParamValid (>=)))- ]--{- |-tests whether a string value matches a numeric param--valid example:--> <data type="CHAR"> <param name="maxLength">5</param> </data>--invalid example:--> <data type="CHAR"> <param name="minLength">foo</param> </data>---}--numParamValid :: (Integer -> Integer -> Bool) -> String -> String -> Bool-numParamValid fct a b- = isNumber b- &&- ( toInteger (length a) `fct` (read b) )--{- |-tests whether a list value matches a length constraint--valid example:--> <data type="IDREFS"> <param name="maxLength">5</param> </data>--invalid example:--> <data type="IDREFS"> <param name="minLength">foo</param> </data>---}--listParamValid :: (Integer -> Integer -> Bool) -> String -> String -> Bool-listParamValid fct a b- = isNumber b- &&- ( toInteger (length . words $ a) `fct` (read b) )---- --------------------------------------------------------------- new check functions--{- |-Tests whether a \"string\" datatype value is between the lower and-upper bound of the datatype and matches all parameters.--All tests are performed on the string value.-- * 1.parameter : datatype-- - 2.parameter : lower bound of the datatype range-- - 3.parameter : upper bound of the datatype range (-1 = no upper bound)-- - 4.parameter : list of parameters-- - 5.parameter : datatype value to be checked-- - return : Just \"Errormessage\" in case of an error, else Nothing---}--stringValid :: DatatypeName -> Integer -> Integer -> ParamList -> CheckString-stringValid = stringValidFT fctTableString--stringValidFT :: FunctionTable -> DatatypeName -> Integer -> Integer -> ParamList -> CheckString-stringValidFT ft datatype lowerBound upperBound params- = assert boundsOK boundsErr- >>>- paramsStringValid params- where- boundsOK v- = ( (lowerBound == 0)- ||- (toInteger (length v) >= lowerBound)- )- &&- ( (upperBound == (-1))- ||- (toInteger (length v) <= upperBound)- )-- boundsErr v- = "Length of " ++ v- ++ " (" ++ (show $ length v) ++ " chars) out of range: "- ++ show lowerBound ++ " .. " ++ show upperBound- ++ " for datatype " ++ datatype-- paramStringValid :: (LocalName, String) -> CheckString- paramStringValid (pn, pv)- = assert paramOK (errorMsgParam pn pv)- where- paramOK v = paramFct pn v pv- paramFct n = fromMaybe (const . const $ True) $ lookup n ft-- paramsStringValid :: ParamList -> CheckString- paramsStringValid- = foldr (>>>) ok . map paramStringValid---- --------------------------------------------------------------{- |-Tests whether a \"numeric\" datatype value is between the lower and upper-bound of the datatype and matches all parameters.--First, the string value is parsed into a numeric representation.-If no error occur, all following tests are performed on the numeric value.-- * 1.parameter : datatype-- - 2.parameter : lower bound of the datatype range-- - 3.parameter : upper bound of the datatype range (-1 = no upper bound)-- - 4.parameter : list of parameters-- - 5.parameter : datatype value to be checked-- - return : Just \"Errormessage\" in case of an error, else Nothing---}--numberValid :: DatatypeName -> Integer -> Integer -> ParamList -> CheckString-numberValid datatype lowerBound upperBound params- = assert isNumber numErr- >>>- checkWith read ( assert inRange rangeErr- >>>- paramsNumValid params- )- where- inRange :: Integer -> Bool- inRange x = x >= lowerBound- &&- x <= upperBound-- rangeErr v = ( "Value = " ++ show v ++ " out of range: "- ++ show lowerBound ++ " .. " ++ show upperBound- ++ " for datatype " ++ datatype- )- numErr v- = "Value = " ++ v ++ " is not a number"--paramsNumValid :: ParamList -> CheckInteger-paramsNumValid- = foldr (>>>) ok . map paramNumValid--paramNumValid :: (LocalName, String) -> CheckInteger-paramNumValid (pn, pv)- = assert paramOK (errorMsgParam pn pv . show)- where- paramOK v = isNumber pv- &&- paramFct pn v (read pv)- paramFct n = fromJust $ lookup n fctTableNum---- --------------------------------------------------------------{- |-Error Message for the equality test of two datatype values-- * 1.parameter : datatype-- - 2.parameter : datatype value-- - 3.parameter : datatype value--example:--> errorMsgEqual "Int" "21" "42" -> "Datatype Int with value = 21 expected, but value = 42 found"---}--errorMsgParam :: LocalName -> String -> String -> String-errorMsgParam pn pv v- = ( "Parameter restriction: \""- ++ pn ++ " = " ++ pv- ++ "\" does not hold for value = \"" ++ v ++ "\""- )--errorMsgEqual :: DatatypeName -> String -> String -> String-errorMsgEqual d s1 s2- = ( "Datatype" ++ show d ++- " with value = " ++ show s1 ++- " expected, but value = " ++ show s2 ++ " found"- )-errorMsgDataTypeNotAllowed :: String -> String -> [(String, String)] -> String -> String-errorMsgDataTypeNotAllowed l t p v- = ( "Datatype " ++ show t ++ " with parameter(s) " ++- formatStringListPairs p ++ " and value = " ++ show v ++- " not allowed for DatatypeLibrary " ++ show l- )--errorMsgDataTypeNotAllowed0 :: String -> String -> String-errorMsgDataTypeNotAllowed0 l t- = ( "Datatype " ++ show t ++- " not allowed for DatatypeLibrary " ++ show l- )-errorMsgDataTypeNotAllowed2 :: String -> String -> String -> String -> String-errorMsgDataTypeNotAllowed2 l t v1 v2- = ( "Datatype " ++ show t ++- " with values = " ++ show v1 ++- " and " ++ show v2 ++- " not allowed for DatatypeLibrary " ++ show l- )--errorMsgDataLibQName :: String -> String -> String -> String-errorMsgDataLibQName l n v- = show v ++ " is not a valid " ++ n ++ " for DatatypeLibrary " ++ l---- ------------------------------------------------------------
− src/Text/XML/HXT/RelaxNG/DataTypeLibraries.hs
@@ -1,140 +0,0 @@--- | This modul exports the list of supported datatype libraries.--- It also exports the main functions to validate an XML instance value--- with respect to a datatype.--module Text.XML.HXT.RelaxNG.DataTypeLibraries- ( datatypeLibraries- , datatypeEqual- , datatypeAllows- )-where--import Text.XML.HXT.DOM.Interface- ( relaxNamespace- )--import Text.XML.HXT.RelaxNG.DataTypeLibUtils--import Text.XML.HXT.RelaxNG.DataTypeLibMysql- ( mysqlDatatypeLib )--import Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C- ( w3cDatatypeLib )--import Data.Maybe- ( fromJust )---- ----------------------------------------------------------------- | List of all supported datatype libraries which can be--- used within the Relax NG validator modul.--datatypeLibraries :: DatatypeLibraries-datatypeLibraries- = [ relaxDatatypeLib- , relaxDatatypeLib'- , mysqlDatatypeLib- , w3cDatatypeLib- ]---{- |-Tests whether a XML instance value matches a value-pattern.--The following tests are performed:-- * 1. : does the uri exist in the list of supported datatype libraries-- - 2. : does the library support the datatype-- - 3. : does the XML instance value match the value-pattern--The hard work is done by the specialized 'DatatypeEqual' function-(see also: 'DatatypeCheck') of the datatype library.--}--datatypeEqual :: Uri -> DatatypeEqual-datatypeEqual uri d s1 c1 s2 c2- = if elem uri (map fst datatypeLibraries)- then dtEqFct d s1 c1 s2 c2- else Just ( "Unknown DatatypeLibrary " ++ show uri )- where- DTC _ dtEqFct _ = fromJust $ lookup uri datatypeLibraries--{- |-Tests whether a XML instance value matches a data-pattern.--The following tests are performed:-- * 1. : does the uri exist in the list of supported datatype libraries-- - 2. : does the library support the datatype-- - 3. : does the XML instance value match the data-pattern-- - 4. : does the XML instance value match all params--The hard work is done by the specialized 'DatatypeAllows' function-(see also: 'DatatypeCheck') of the datatype library.---}--datatypeAllows :: Uri -> DatatypeAllows-datatypeAllows uri d params s1 c1- = if elem uri (map fst datatypeLibraries)- then dtAllowFct d params s1 c1- else Just ( "Unknown DatatypeLibrary " ++ show uri )- where- DTC dtAllowFct _ _ = fromJust $ lookup uri datatypeLibraries----- ----------------------------------------------------------------------------------------- Relax NG build in datatype library--relaxDatatypeLib :: DatatypeLibrary-relaxDatatypeLib = (relaxNamespace, DTC datatypeAllowsRelax datatypeEqualRelax relaxDatatypes)---- | if there is no datatype uri, the built in datatype library is used-relaxDatatypeLib' :: DatatypeLibrary-relaxDatatypeLib' = ("", DTC datatypeAllowsRelax datatypeEqualRelax relaxDatatypes)---- | The build in Relax NG datatype lib supportes only the token and string datatype,--- without any params.--relaxDatatypes :: AllowedDatatypes-relaxDatatypes- = map ( (\ x -> (x, [])) . fst ) relaxDatatypeTable--datatypeAllowsRelax :: DatatypeAllows-datatypeAllowsRelax d p v _- = maybe notAllowed' allowed . lookup d $ relaxDatatypeTable- where- notAllowed'- = Just $ errorMsgDataTypeNotAllowed relaxNamespace d p v- allowed _- = Nothing---- | If the token datatype is used, the values have to be normalized--- (trailing and leading whitespaces are removed).--- token does not perform any changes to the values.--datatypeEqualRelax :: DatatypeEqual-datatypeEqualRelax d s1 _ s2 _- = maybe notAllowed' checkValues . lookup d $ relaxDatatypeTable- where- notAllowed'- = Just $ errorMsgDataTypeNotAllowed2 relaxNamespace d s1 s2- checkValues predicate- = if predicate s1 s2- then Nothing- else Just $ errorMsgEqual d s1 s2--relaxDatatypeTable :: [(String, String -> String -> Bool)]-relaxDatatypeTable- = [ ("string", (==))- , ("token", \ s1 s2 -> normalizeWhitespace s1 == normalizeWhitespace s2 )- ]----- --------------------------------------------------------------------------------------
− src/Text/XML/HXT/RelaxNG/DataTypes.hs
@@ -1,296 +0,0 @@-module Text.XML.HXT.RelaxNG.DataTypes-where--import Text.XML.HXT.DOM.TypeDefs---- --------------------------------------------------------------relaxSchemaFile :: String-relaxSchemaFile = "Text/XML/HXT/RelaxNG/SpecificationSchema.rng"---relaxSchemaGrammarFile :: String-relaxSchemaGrammarFile = "Text/XML/HXT/RelaxNG/SpecificationSchemaGrammar.rng"---- --------------------------------------------------------------- datatypes for the simplification process--a_numberOfErrors,- a_relaxSimplificationChanges,- defineOrigName :: String--a_numberOfErrors = "numberOfErrors"-a_relaxSimplificationChanges = "relaxSimplificationChanges"-defineOrigName = "RelaxDefineOriginalName"---type Env = [(String, XmlTree)]---- | Start of a context attribute value--- (see also: 'Text.XML.HXT.RelaxNG.Simplification.simplificationStep1')------ The value is always followed by the original attribute name and value--contextAttributes :: String-contextAttributes = "RelaxContext:"----- | Start of base uri attribute value--- (see also: 'simplificationStep1' in "Text.XML.HXT.RelaxNG.Simplification")--contextBaseAttr :: String-contextBaseAttr = "RelaxContextBaseURI"----- see simplificationStep5 in Text.XML.HXT.RelaxNG.Simplification--type OldName = String-type NewName = String-type NamePair = (OldName, NewName)-type RefList = [NamePair]----- --------------------------------------------------------------- datatype library handling---- | Type of all datatype libraries functions that tests whether--- a XML instance value matches a value-pattern.------ Returns Just \"errorMessage\" in case of an error else Nothing.--type DatatypeEqual = DatatypeName -> String -> Context -> String -> Context -> Maybe String----- | Type of all datatype libraries functions that tests whether--- a XML instance value matches a data-pattern.------ Returns Just \"errorMessage\" in case of an error else Nothing.--type DatatypeAllows = DatatypeName -> ParamList -> String -> Context -> Maybe String----- | List of all supported datatype libraries--type DatatypeLibraries = [DatatypeLibrary]----- | Each datatype library is identified by a URI.--type DatatypeLibrary = (Uri, DatatypeCheck)--type DatatypeName = String--type ParamName = String----- | List of all supported params for a datatype--type AllowedParams = [ParamName]----- | List of all supported datatypes and there allowed params--type AllowedDatatypes = [(DatatypeName, AllowedParams)]----- | The Constructor exports the list of supported datatypes for a library.--- It also exports the specialized datatype library functions to validate--- a XML instance value with respect to a datatype.--data DatatypeCheck- = DTC { dtAllowsFct :: DatatypeAllows -- ^ function to test whether a value matches a data-pattern- , dtEqualFct :: DatatypeEqual -- ^ function to test whether a value matches a value-pattern- , dtAllowedTypes :: AllowedDatatypes -- ^ list of all supported params for a datatype- }---- --------------------------------------------------------------- datatypes for the validation process--type Uri = String--type LocalName = String----- | List of parameters; each parameter is a pair consisting of a local name and a value.--type ParamList = [(LocalName, String)]--type Prefix = String----- | A Context represents the context of an XML element.--- It consists of a base URI and a mapping from prefixes to namespace URIs.--type Context = (Uri, [(Prefix, Uri)])---- | A Datatype identifies a datatype by a datatype library name and a local name.--type Datatype = (Uri, LocalName)--showDatatype :: Datatype -> String-showDatatype (u, ln)- | null u = ln- | otherwise = "{" ++ u ++ "}" ++ ln---- | Represents a name class--data NameClass = AnyName- | AnyNameExcept NameClass- | Name Uri LocalName- | NsName Uri- | NsNameExcept Uri NameClass- | NameClassChoice NameClass NameClass- | NCError String- deriving Eq--instance Show NameClass- where- show AnyName = "AnyName"- show (AnyNameExcept nameClass)- = "AnyNameExcept: " ++ show nameClass- show (Name uri localName)- | null uri = localName- | otherwise = "{" ++ uri ++ "}" ++ localName- show (NsName uri) = "{" ++ uri ++ "}AnyName"- show (NsNameExcept uri nameClass)- = "NsNameExcept: {" ++ uri ++ "}" ++ show nameClass- show (NameClassChoice nameClass1 nameClass2)- = "NameClassChoice: " ++ show nameClass1 ++ "|" ++ show nameClass2- show (NCError string)- = "NCError: " ++ string----- | Represents a pattern after simplification--data Pattern = Empty- | NotAllowed ErrMessage- | Text- | Choice Pattern Pattern- | Interleave Pattern Pattern- | Group Pattern Pattern- | OneOrMore Pattern- | List Pattern- | Data Datatype ParamList- | DataExcept Datatype ParamList Pattern- | Value Datatype String Context- | Attribute NameClass Pattern- | Element NameClass Pattern- | After Pattern Pattern--instance Show Pattern where- show Empty = "empty"- show (NotAllowed e) = show e- show Text = "text"- show (Choice p1 p2) = "( " ++ show p1 ++ " | " ++ show p2 ++ " )"- show (Interleave p1 p2) = "( " ++ show p1 ++ " & " ++ show p2 ++ " )"- show (Group p1 p2) = "( " ++ show p1 ++ " , " ++ show p2 ++ " )"- show (OneOrMore p) = show p ++ "+"- show (List p) = "list { " ++ show p ++ " }"- show (Data dt pl) = showDatatype dt ++ showPL pl- where- showPL [] = ""- showPL l = " {" ++ concatMap showP l ++ " }"- showP (ln, v) = " " ++ ln ++ " = " ++ show v- show (DataExcept dt pl p) = show (Data dt pl) ++ " - (" ++ show p ++ " )"- show (Value dt v _cx) = showDatatype dt ++ " " ++ show v- show (Attribute nc p) = "attribute " ++ show nc ++ " { " ++ show p ++ " }"- show (Element nc p) = "element " ++ show nc ++ " { " ++ show p ++ " }"- show (After p1 p2) = "( " ++ show p1 ++ " ; " ++ show p2 ++ " )"--data ErrMessage = ErrMsg ErrLevel [String]- -- deriving Show--instance Show ErrMessage where- show (ErrMsg _lev es) = foldr1 (\ x y -> x ++ "\n" ++ y) es--type ErrLevel = Int---- ---------------------------------------------------------------- smart constructor funtions for Pattern---- | smart constructor for NotAllowed--notAllowed :: String -> Pattern-notAllowed = notAllowedN 0--notAllowed1 :: String -> Pattern-notAllowed1 = notAllowedN 1--notAllowed2 :: String -> Pattern-notAllowed2 = notAllowedN 2--notAllowedN :: ErrLevel -> String -> Pattern-notAllowedN l s = NotAllowed (ErrMsg l [s])---- | merge error messages------ If error levels are different, the more important is taken,--- if level is 2 (max level) both error messages are taken--- else the 1. error mesage is taken--mergeNotAllowed :: Pattern -> Pattern -> Pattern-mergeNotAllowed p1@(NotAllowed (ErrMsg l1 s1)) p2@(NotAllowed (ErrMsg l2 s2))- | l1 < l2 = p2- | l1 > l2 = p1- | l1 == 2 = NotAllowed $ ErrMsg 2 (s1 ++ s2)- | otherwise = p1---- TODO : weird error when collecting error messages errors are duplicated--mergeNotAllowed _p1 _p2- = notAllowed2 "mergeNotAllowed with wrong patterns"---- | smart constructor for Choice--choice :: Pattern -> Pattern -> Pattern-choice p1@(NotAllowed _) p2@(NotAllowed _) = mergeNotAllowed p1 p2-choice p1 (NotAllowed _) = p1-choice (NotAllowed _) p2 = p2-choice p1 p2 = Choice p1 p2---- | smart constructor for Group--group :: Pattern -> Pattern -> Pattern-group p1@(NotAllowed _) p2@(NotAllowed _) = mergeNotAllowed p1 p2-group _ n@(NotAllowed _) = n-group n@(NotAllowed _) _ = n-group p Empty = p-group Empty p = p-group p1 p2 = Group p1 p2---- | smart constructor for OneOrMore--oneOrMore :: Pattern -> Pattern-oneOrMore n@(NotAllowed _) = n-oneOrMore p = OneOrMore p---- | smart constructor for Interleave--interleave :: Pattern -> Pattern -> Pattern-interleave p1@(NotAllowed _) p2@(NotAllowed _) = mergeNotAllowed p1 p2-interleave _ p2@(NotAllowed _) = p2-interleave p1@(NotAllowed _) _ = p1-interleave p1 Empty = p1-interleave Empty p2 = p2-interleave p1 p2 = Interleave p1 p2---- | smart constructor for After--after :: Pattern -> Pattern -> Pattern-after p1@(NotAllowed _) p2@(NotAllowed _) = mergeNotAllowed p1 p2-after _ p2@(NotAllowed _) = p2-after p1@(NotAllowed _) _ = p1-after p1 p2 = After p1 p2----- | Possible content types of a Relax NG pattern.--- (see also chapter 7.2 in Relax NG specification)--data ContentType = CTEmpty- | CTComplex- | CTSimple- | CTNone- deriving (Show, Eq, Ord)---- ------------------------------------------------------------
− src/Text/XML/HXT/RelaxNG/PatternFunctions.hs
@@ -1,108 +0,0 @@--- | basic 'Pattern' functions-----module Text.XML.HXT.RelaxNG.PatternFunctions--where--import Text.XML.HXT.RelaxNG.DataTypes----- --------------------------------------------------------------isRelaxEmpty :: Pattern -> Bool-isRelaxEmpty Empty = True-isRelaxEmpty _ = False--isRelaxNotAllowed :: Pattern -> Bool-isRelaxNotAllowed (NotAllowed _) = True-isRelaxNotAllowed _ = False--isRelaxText :: Pattern -> Bool-isRelaxText Text = True-isRelaxText _ = False--isRelaxChoice :: Pattern -> Bool-isRelaxChoice (Choice _ _) = True-isRelaxChoice _ = False--isRelaxInterleave :: Pattern -> Bool-isRelaxInterleave (Interleave _ _) = True-isRelaxInterleave _ = False--isRelaxGroup :: Pattern -> Bool-isRelaxGroup (Group _ _) = True-isRelaxGroup _ = False--isRelaxOneOrMore :: Pattern -> Bool-isRelaxOneOrMore (OneOrMore _) = True-isRelaxOneOrMore _ = False--isRelaxList :: Pattern -> Bool-isRelaxList (List _) = True-isRelaxList _ = False--isRelaxData :: Pattern -> Bool-isRelaxData (Data _ _) = True-isRelaxData _ = False--isRelaxDataExcept :: Pattern -> Bool-isRelaxDataExcept (DataExcept _ _ _) = True-isRelaxDataExcept _ = False--isRelaxValue :: Pattern -> Bool-isRelaxValue (Value _ _ _) = True-isRelaxValue _ = False--isRelaxAttribute :: Pattern -> Bool-isRelaxAttribute (Attribute _ _) = True-isRelaxAttribute _ = False--isRelaxElement :: Pattern -> Bool-isRelaxElement (Element _ _) = True-isRelaxElement _ = False--isRelaxAfter :: Pattern -> Bool-isRelaxAfter (After _ _) = True-isRelaxAfter _ = False----- | Returns a list of children pattern for each pattern,--- e.g. (Choice p1 p2) = [p1, p2]-getChildrenPattern :: Pattern -> [Pattern]-getChildrenPattern (Choice p1 p2) = [p1, p2]-getChildrenPattern (Interleave p1 p2) = [p1, p2]-getChildrenPattern (Group p1 p2) = [p1, p2]-getChildrenPattern (OneOrMore p) = [p]-getChildrenPattern (List p) = [p]-getChildrenPattern (Element _ p) = [p]-getChildrenPattern (DataExcept _ _ p) = [p]-getChildrenPattern (Attribute _ p) = [p]-getChildrenPattern (After p1 p2) = [p1, p2]-getChildrenPattern _ = []----- | Returns the nameclass of a element- or attribute pattern.--- Otherwise 'NCError' is returned.-getNameClassFromPattern :: Pattern -> NameClass-getNameClassFromPattern (Element nc _) = nc-getNameClassFromPattern (Attribute nc _) = nc-getNameClassFromPattern _ = NCError "Pattern without a NameClass"----- | Returns a string representation of the pattern name-getPatternName :: Pattern -> String-getPatternName (Empty) = "Empty"-getPatternName (NotAllowed _) = "NotAllowed"-getPatternName (Text) = "Text"-getPatternName (Choice _ _) = "Choice"-getPatternName (Interleave _ _) = "Interleave"-getPatternName (Group _ _) = "Group"-getPatternName (OneOrMore _) = "OneOrMore"-getPatternName (List _) = "List"-getPatternName (Data _ _ ) = "Data"-getPatternName (DataExcept _ _ _) = "DataExcept"-getPatternName (Value _ _ _) = "Value"-getPatternName (Attribute _ _) = "Attribute"-getPatternName (Element _ _) = "Element"-getPatternName (After _ _) = "After"
− src/Text/XML/HXT/RelaxNG/PatternToString.hs
@@ -1,360 +0,0 @@-module Text.XML.HXT.RelaxNG.PatternToString- ( patternToStringTree- , patternToFormatedString- , xmlTreeToPatternStringTree- , xmlTreeToPatternFormatedString- , xmlTreeToPatternString- , nameClassToString- )-where--import Control.Arrow.ListArrows--import Data.Tree.NTree.TypeDefs--import Text.XML.HXT.DOM.Interface--import Text.XML.HXT.RelaxNG.DataTypes-import Text.XML.HXT.RelaxNG.CreatePattern-import Text.XML.HXT.RelaxNG.Utils---- --------------------------------------------------------------type PatternTree = NTree String---{- |-Returns a string representation of the pattern structure.-(see also: 'createPatternFromXmlTree')--Example:--> Element {}foo (Choice (Choice (Value ("","token") "abc"-> ("foo","www.bar.baz")]))(Data ("http://www.mysql.com","VARCHAR")-> [("length","2"),("maxLength","5")])) (Element {}bar (Group (Element {}baz--The function can @not@ be used to display circular ref-pattern structures.--}--xmlTreeToPatternString :: LA XmlTree String-xmlTreeToPatternString- = createPatternFromXmlTree- >>^- show----- | Returns a string representation of a nameclass.--nameClassToString :: NameClass -> String-nameClassToString AnyName- = "AnyName"--nameClassToString (AnyNameExcept nc)- = "AnyNameExcept " ++ nameClassToString nc--nameClassToString (Name uri local)- = "{" ++ uri ++ "}" ++ local--nameClassToString (NsName uri)- = "{" ++ uri ++ "}"--nameClassToString (NsNameExcept uri nc)- = uri ++ "except (NsName) " ++ nameClassToString nc--nameClassToString (NameClassChoice nc1 nc2)- = nameClassToString nc1 ++ " " ++ nameClassToString nc2--nameClassToString (NCError e)- = "NameClass Error: " ++ e----- --------------------------------------------------------------{- |-Returns a tree representation of the pattern structure.-The hard work is done by 'formatTree'.--Example:--> +---element {}bar-> |-> +---group-> |-> +---oneOrMore-> | |-> | +---attribute AnyName-> | |-> | +---text-> |-> +---text--The function can be used to display circular ref-pattern structures.--Example:--> <define name="baz">-> <element name="baz">-> ... <ref name="baz"/> ...-> </element>-> </define>---}--patternToStringTree :: LA Pattern String-patternToStringTree- = fromSLA [] pattern2PatternTree- >>^- (\p -> formatTree id p ++ "\n")----- | Returns a tree representation of the pattern structure.--- (see also: 'createPatternFromXmlTree' and 'patternToStringTree')--xmlTreeToPatternStringTree :: LA XmlTree String-xmlTreeToPatternStringTree- = createPatternFromXmlTree- >>>- patternToStringTree---pattern2PatternTree :: SLA [NameClass] Pattern PatternTree-pattern2PatternTree- = choiceA- [ isA isRelaxEmpty :-> (constA $ NTree "empty" [])- , isA isRelaxNotAllowed :-> notAllowed2PatternTree- , isA isRelaxText :-> (constA $ NTree "text" [])- , isA isRelaxChoice :-> choice2PatternTree- , isA isRelaxInterleave :-> children2PatternTree "interleave"- , isA isRelaxGroup :-> children2PatternTree "group"- , isA isRelaxOneOrMore :-> children2PatternTree "oneOrMore"- , isA isRelaxList :-> children2PatternTree "list"- , isA isRelaxData :-> data2PatternTree- , isA isRelaxDataExcept :-> dataExcept2PatternTree- , isA isRelaxValue :-> value2PatternTree- , isA isRelaxAttribute :-> createPatternTreeFromElement "attribute"- , isA isRelaxElement :-> element2PatternTree- , isA isRelaxAfter :-> children2PatternTree "after"- ]--notAllowed2PatternTree :: SLA [NameClass] Pattern PatternTree-notAllowed2PatternTree- = arr $ \(NotAllowed (ErrMsg _l sl)) -> NTree "notAllowed" $ map (\ s -> NTree s []) sl---data2PatternTree :: SLA [NameClass] Pattern PatternTree-data2PatternTree- = arr $ \ (Data d p) -> NTree "data" [ datatype2PatternTree d- , mapping2PatternTree "parameter" p- ]--dataExcept2PatternTree :: SLA [NameClass] Pattern PatternTree-dataExcept2PatternTree- = this &&& (listA $ arrL getChildrenPattern >>> pattern2PatternTree)- >>>- arr2 ( \ (DataExcept d param _) pattern ->- NTree "dataExcept" ([ datatype2PatternTree d- , mapping2PatternTree "parameter" param- ] ++ pattern)- )--value2PatternTree :: SLA [NameClass] Pattern PatternTree-value2PatternTree- = arr $ \ (Value d v c) -> NTree ("value = " ++ v) [ datatype2PatternTree d- , context2PatternTree c- ]---createPatternTreeFromElement :: String -> SLA [NameClass] Pattern PatternTree-createPatternTreeFromElement name- = ( arr getNameClassFromPattern- &&&- listA (arrL getChildrenPattern >>> pattern2PatternTree)- )- >>>- arr2 (\nc rl -> NTree (name ++ " " ++ show nc) rl)--children2PatternTree :: String -> SLA [NameClass] Pattern PatternTree-children2PatternTree name- = listA (arrL getChildrenPattern >>> pattern2PatternTree)- >>^- (NTree name)--choice2PatternTree :: SLA [NameClass] Pattern PatternTree-choice2PatternTree- = ifA ( -- wenn das zweite kind ein noch nicht ausgegebenes element ist,- -- muss dieses anders behandelt werden- -- nur fuer bessere formatierung des outputs- arr (last . getChildrenPattern) >>> isA (isRelaxElement) >>>- (arr getNameClassFromPattern &&& getState) >>>- isA(\ (nc, liste) -> not $ elem nc liste)- )- ( -- element in status aufnehmen, wird dann nicht mehr vom erste kind ausgegeben- arr getChildrenPattern- >>>- changeState (\s p -> (getNameClassFromPattern (last p)) : s)- >>>- ( ( head ^>> pattern2PatternTree ) -- erstes kind normal verarbeiten- &&& -- zweites kind, das element, verarbeiten- ( last ^>> createPatternTreeFromElement "element" )- )- >>>- arr2 ( \ l1 l2 -> NTree "choice" [l1, l2] )- )- ( children2PatternTree "choice" )---element2PatternTree :: SLA [NameClass] Pattern PatternTree-element2PatternTree- = ifA ( (arr getNameClassFromPattern &&& getState)- >>>- isA (\ (nc, liste) -> elem nc liste)- )- ( arr getNameClassFromPattern- >>>- arr (\nc -> NTree ("reference to element " ++ show nc) [])- )- ( changeState (\ s p -> (getNameClassFromPattern p) : s)- >>>- createPatternTreeFromElement "element"- )---mapping2PatternTree :: String -> [(Prefix, Uri)] -> PatternTree-mapping2PatternTree name mapping- = NTree name (map (\(a, b) -> NTree (a ++ " = " ++ b) []) mapping)---datatype2PatternTree :: Datatype -> PatternTree-datatype2PatternTree dt- = NTree (datatype2String dt) []---context2PatternTree :: Context -> PatternTree-context2PatternTree (base, mapping)- = NTree "context" [ NTree ("base-uri = " ++ base) []- , mapping2PatternTree "namespace environment" mapping- ]---- ---------------------------------------------------------------- | Returns a formated string representation of the pattern structure.--- (see also: 'createPatternFromXmlTree' and 'patternToFormatedString')-xmlTreeToPatternFormatedString :: LA XmlTree String-xmlTreeToPatternFormatedString- = createPatternFromXmlTree- >>>- fromSLA [] patternToFormatedString---{- |-Returns a formated string representation of the pattern structure.--Example:--> Element {}foo (Choice (Choice ( Value = abc,-> datatypelibrary = http://relaxng.org/ns/structure/1.0, type = token,-> context (base-uri =file://test.rng,-> parameter: xml = http://www.w3.org/XML/1998/namespaces, foo = www.bar.baz),--The function can be used to display circular ref-pattern structures.--}--patternToFormatedString :: SLA [NameClass] Pattern String-patternToFormatedString- = choiceA- [ isA isRelaxEmpty :-> (constA " empty ")- , isA isRelaxNotAllowed :-> (arr $ \ (NotAllowed errorEnv) -> show errorEnv)- , isA isRelaxText :-> (constA " text ")- , isA isRelaxChoice :-> children2FormatedString "choice"- , isA isRelaxInterleave :-> children2FormatedString "interleave"- , isA isRelaxGroup :-> children2FormatedString "group"- , isA isRelaxOneOrMore :-> children2FormatedString "oneOrMore"- , isA isRelaxList :-> children2FormatedString "list"- , isA isRelaxData :-> data2FormatedString- , isA isRelaxDataExcept :-> dataExcept2FormatedString- , isA isRelaxValue :-> value2FormatedString- , isA isRelaxAttribute :-> createFormatedStringFromElement "attribute"- , isA isRelaxElement :-> element2FormatedString- , isA isRelaxAfter :-> children2FormatedString "after"- ]--children2FormatedString :: String -> SLA [NameClass] Pattern String-children2FormatedString name- = listA (arrL getChildrenPattern >>> patternToFormatedString)- >>^- (\ l -> name ++ " (" ++ formatStringListPatt l ++ ") " )--data2FormatedString :: SLA [NameClass] Pattern String-data2FormatedString- = arr ( \ (Data datatype paramList) ->- "Data " ++ datatype2String datatype ++ "\n " ++- mapping2String "parameter" paramList ++ "\n"- )--dataExcept2FormatedString :: SLA [NameClass] Pattern String-dataExcept2FormatedString- = arr ( \ (DataExcept datatype paramList _) ->- "DataExcept " ++ show datatype ++ "\n " ++- mapping2String "parameter" paramList ++ "\n "- )- &&&- ( arr (\ (DataExcept _ _ p) -> p) >>> patternToFormatedString )- >>>- arr2 (++)---value2FormatedString :: SLA [NameClass] Pattern String-value2FormatedString- = arr $ \(Value datatype val context) ->- "Value = " ++ val ++ ", " ++ datatype2String datatype ++- "\n " ++ context2String context ++ "\n"---element2FormatedString :: SLA [NameClass] Pattern String-element2FormatedString- = ifA ( (arr getNameClassFromPattern &&& getState)- >>>- isA (\ (nc, liste) -> elem nc liste)- )- ( arr getNameClassFromPattern- >>^- ( \nc -> "reference to element " ++ nameClassToString nc ++ " " )- )- ( changeState (\ s p -> (getNameClassFromPattern p) : s)- >>>- createFormatedStringFromElement "element"- )---createFormatedStringFromElement :: String -> SLA [NameClass] Pattern String-createFormatedStringFromElement name- = ( arr getNameClassFromPattern- &&&- ( listA (arrL getChildrenPattern >>> patternToFormatedString)- >>^- formatStringListId- )- )- >>>- arr2 (\ nc rl -> name ++ " " ++ nameClassToString nc ++ " (" ++ rl ++ ")")----- --------------------------------------------------------------mapping2String :: String -> [(Prefix, Uri)] -> String-mapping2String name mapping- = name ++ ": " ++- formatStringList id ", " (map (\(a, b) -> a ++ " = " ++ b) mapping)--datatype2String :: Datatype -> String-datatype2String (lib, localName)- = "datatypelibrary = " ++ getLib ++ ", type = " ++ localName- where- getLib = if lib == "" then relaxNamespace else lib--context2String :: Context -> String-context2String (base, mapping)- = "context (base-uri = " ++ base ++ ", " ++- mapping2String "namespace environment" mapping ++ ")"---- ------------------------------------------------------------
− src/Text/XML/HXT/RelaxNG/Schema.hs
@@ -1,3921 +0,0 @@-{- |- Module : Text.HXT.RelaxNG.Schema-- Don't edit this module, it's generated by RelaxSchemaToXmlTree---}--module Text.XML.HXT.RelaxNG.Schema- ( relaxSchemaTree, relaxSchemaArrow )-where--import Text.XML.HXT.DOM.TypeDefs-import Text.XML.HXT.DOM.XmlNode (mkRoot, mkElement, mkAttr, mkText)--import Control.Arrow.ListArrows--relaxSchemaArrow :: ArrowList a => a b XmlTree-relaxSchemaArrow = constA relaxSchemaTree--relaxSchemaTree :: XmlTree-relaxSchemaTree =- let- ns1 = "http://relaxng.org/ns/structure/1.0"- qn1 = mkSNsName "RelaxContext:xml"- qn2 = mkSNsName "RelaxContextBaseURI"- qn3 = mkSNsName "RelaxContextDefault"- qn4 = mkNsName "anyName" ns1- qn5 = mkNsName "attribute" ns1- qn6 = mkNsName "choice" ns1- qn7 = mkNsName "data" ns1- qn8 = mkSNsName "datatypeLibrary"- qn9 = mkNsName "define" ns1- qn10 = mkNsName "element" ns1- qn11 = mkNsName "empty" ns1- qn12 = mkNsName "except" ns1- qn13 = mkNsName "grammar" ns1- qn14 = mkNsName "group" ns1- qn15 = mkNsName "interleave" ns1- qn16 = mkSNsName "name"- qn17 = mkNsName "name" ns1- qn18 = mkSNsName "ns"- qn19 = mkNsName "nsName" ns1- qn20 = mkNsName "oneOrMore" ns1- qn21 = mkNsName "ref" ns1- qn22 = mkNsName "start" ns1- qn23 = mkNsName "text" ns1- qn24 = mkSNsName "type"- qn25 = mkNsName "value" ns1- in- mkRoot []- [ mkElement qn13 []- [ mkElement qn22 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "44" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "grammar"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "11" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "10" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "22" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "23" ]- ] []- ]- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "43" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "externalRef"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "href"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "42" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "notAllowed"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "39" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "data"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "type"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "NCName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn21- [ mkAttr qn16 [ mkText "41" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "41" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "except"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "40" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "param"- ]- , mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "name"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "NCName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn23 [] []- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "38" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "value"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "type"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "NCName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "37" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "text"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "36" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "empty"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "35" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "parentRef"- ]- , mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "name"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "NCName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "34" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "ref"- ]- , mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "name"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "NCName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "33" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "mixed"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "32" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "list"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "31" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "oneOrMore"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "30" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "zeroOrMore"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "29" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "optional"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "28" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "choice"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "27" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "interleave"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "26" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "group"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "25" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "attribute"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn6 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "name"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "QName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "17" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "18" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "19" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "20" ]- ] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "24" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "element"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "name"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "QName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "17" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "18" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "19" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "20" ]- ] []- ]- ]- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "23" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "include"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "href"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "11" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "10" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "21" ]- ] []- ]- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "22" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "div"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "11" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "10" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "22" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "23" ]- ] []- ]- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "21" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "div"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "11" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "10" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "21" ]- ] []- ]- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "20" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "choice"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "17" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "18" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "19" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "20" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "19" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "nsName"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "18" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "anyName"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "17" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "name"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "QName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "16" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "except"- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "17" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "18" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "19" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "20" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "15" ]- ]- [ mkElement qn10 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn5 []- [ mkElement qn4 [] []- , mkElement qn23 [] []- ]- , mkElement qn23 [] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "0" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "0" ]- ]- [ mkElement qn10 []- [ mkElement qn4 [] []- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn5 []- [ mkElement qn4 [] []- , mkElement qn23 [] []- ]- , mkElement qn23 [] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "0" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "10" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "define"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "name"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "NCName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "combine"- ]- , mkElement qn6 []- [ mkElement qn25- [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]- , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]- , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/Schema.rng" ]- , mkAttr qn8 [ mkText "" ]- , mkAttr qn24 [ mkText "token" ]- , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "choice"- ]- , mkElement qn25- [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]- , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]- , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/Schema.rng" ]- , mkAttr qn8 [ mkText "" ]- , mkAttr qn24 [ mkText "token" ]- , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "interleave"- ]- ]- ]- ]- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "11" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "start"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "combine"- ]- , mkElement qn6 []- [ mkElement qn25- [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]- , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]- , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/Schema.rng" ]- , mkAttr qn8 [ mkText "" ]- , mkAttr qn24 [ mkText "token" ]- , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "choice"- ]- , mkElement qn25- [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]- , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]- , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/Schema.rng" ]- , mkAttr qn8 [ mkText "" ]- , mkAttr qn24 [ mkText "token" ]- , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "interleave"- ]- ]- ]- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "15" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- ]- ]- ]- ]- ]- ]
− src/Text/XML/HXT/RelaxNG/SchemaGrammar.hs
@@ -1,3831 +0,0 @@-{- |- Module : Text.HXT.RelaxNG.SchemaGrammar-- Don't edit this module, it's generated by RelaxSchemaToXmlTree---}--module Text.XML.HXT.RelaxNG.SchemaGrammar- ( relaxSchemaTree, relaxSchemaArrow )-where--import Text.XML.HXT.DOM.TypeDefs-import Text.XML.HXT.DOM.XmlNode (mkRoot, mkElement, mkAttr, mkText)--import Control.Arrow.ListArrows--relaxSchemaArrow :: ArrowList a => a b XmlTree-relaxSchemaArrow = constA relaxSchemaTree--relaxSchemaTree :: XmlTree-relaxSchemaTree =- let- ns1 = "http://relaxng.org/ns/structure/1.0"- qn1 = mkSNsName "RelaxContext:xml"- qn2 = mkSNsName "RelaxContextBaseURI"- qn3 = mkSNsName "RelaxContextDefault"- qn4 = mkNsName "anyName" ns1- qn5 = mkNsName "attribute" ns1- qn6 = mkNsName "choice" ns1- qn7 = mkNsName "data" ns1- qn8 = mkSNsName "datatypeLibrary"- qn9 = mkNsName "define" ns1- qn10 = mkNsName "element" ns1- qn11 = mkNsName "empty" ns1- qn12 = mkNsName "except" ns1- qn13 = mkNsName "grammar" ns1- qn14 = mkNsName "group" ns1- qn15 = mkNsName "interleave" ns1- qn16 = mkSNsName "name"- qn17 = mkNsName "name" ns1- qn18 = mkSNsName "ns"- qn19 = mkNsName "nsName" ns1- qn20 = mkNsName "oneOrMore" ns1- qn21 = mkNsName "ref" ns1- qn22 = mkNsName "start" ns1- qn23 = mkNsName "text" ns1- qn24 = mkSNsName "type"- qn25 = mkNsName "value" ns1- in- mkRoot []- [ mkElement qn13 []- [ mkElement qn22 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "44" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "externalRef"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "href"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "43" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "notAllowed"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "40" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "data"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "type"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "NCName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "41" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn21- [ mkAttr qn16 [ mkText "42" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "42" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "except"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "41" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "param"- ]- , mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "name"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "NCName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn23 [] []- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "39" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "value"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "type"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "NCName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "38" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "text"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "37" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "empty"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "36" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "parentRef"- ]- , mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "name"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "NCName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "35" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "ref"- ]- , mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "name"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "NCName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "34" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "mixed"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "33" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "list"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "32" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "oneOrMore"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "31" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "zeroOrMore"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "30" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "optional"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "29" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "choice"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "28" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "interleave"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "27" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "group"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "26" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "attribute"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn6 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "name"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "QName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "18" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "19" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "20" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "21" ]- ] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "25" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "element"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "name"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "QName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "18" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "19" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "20" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "21" ]- ] []- ]- ]- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "24" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "include"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "href"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "11" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "10" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "22" ]- ] []- ]- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "23" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "div"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "11" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "10" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "23" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- ]- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "22" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "div"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "11" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "10" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "22" ]- ] []- ]- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "21" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "choice"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "18" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "19" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "20" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "21" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "20" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "nsName"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn21- [ mkAttr qn16 [ mkText "17" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "19" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "anyName"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn21- [ mkAttr qn16 [ mkText "17" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "18" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "name"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "QName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "17" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "except"- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "18" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "19" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "20" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "21" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "16" ]- ]- [ mkElement qn10 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn5 []- [ mkElement qn4 [] []- , mkElement qn23 [] []- ]- , mkElement qn23 [] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "0" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "0" ]- ]- [ mkElement qn10 []- [ mkElement qn4 [] []- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn5 []- [ mkElement qn4 [] []- , mkElement qn23 [] []- ]- , mkElement qn23 [] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "0" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "10" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "define"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "name"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "NCName" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "combine"- ]- , mkElement qn6 []- [ mkElement qn25- [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]- , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]- , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/SchemaGrammar.rng" ]- , mkAttr qn8 [ mkText "" ]- , mkAttr qn24 [ mkText "token" ]- , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "choice"- ]- , mkElement qn25- [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]- , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]- , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/SchemaGrammar.rng" ]- , mkAttr qn8 [ mkText "" ]- , mkAttr qn24 [ mkText "token" ]- , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "interleave"- ]- ]- ]- ]- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "11" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "start"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "combine"- ]- , mkElement qn6 []- [ mkElement qn25- [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]- , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]- , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/SchemaGrammar.rng" ]- , mkAttr qn8 [ mkText "" ]- , mkAttr qn24 [ mkText "token" ]- , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "choice"- ]- , mkElement qn25- [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]- , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]- , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/SchemaGrammar.rng" ]- , mkAttr qn8 [ mkText "" ]- , mkAttr qn24 [ mkText "token" ]- , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "interleave"- ]- ]- ]- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "25" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "26" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "27" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "28" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "29" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "30" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "31" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "32" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "33" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "34" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "35" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "36" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "37" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "38" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "39" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "40" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "43" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "44" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "14" ]- ] []- ]- ]- ]- ]- ]- , mkElement qn9- [ mkAttr qn16 [ mkText "14" ]- ]- [ mkElement qn10 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ]- [ mkText "grammar"- ]- , mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn14 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "ns"- ]- , mkElement qn23 [] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn5 []- [ mkElement qn17- [ mkAttr qn18 [ mkText "" ]- ]- [ mkText "datatypeLibrary"- ]- , mkElement qn7- [ mkAttr qn24 [ mkText "anyURI" ]- , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]- ] []- ]- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn5 []- [ mkElement qn4 []- [ mkElement qn12 []- [ mkElement qn6 []- [ mkElement qn19- [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]- ] []- , mkElement qn19- [ mkAttr qn18 [ mkText "" ]- ] []- ]- ]- ]- , mkElement qn23 [] []- ]- ]- ]- ]- , mkElement qn15 []- [ mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "16" ]- ] []- ]- ]- , mkElement qn6 []- [ mkElement qn11 [] []- , mkElement qn20 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn6 []- [ mkElement qn21- [ mkAttr qn16 [ mkText "11" ]- ] []- , mkElement qn21- [ mkAttr qn16 [ mkText "10" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "23" ]- ] []- ]- , mkElement qn21- [ mkAttr qn16 [ mkText "24" ]- ] []- ]- ]- ]- ]- ]- ]- ]- ]- ]
− src/Text/XML/HXT/RelaxNG/Simplification.hs
@@ -1,2321 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.RelaxNG.Simplification- Copyright : Copyright (C) 2008 Torben Kuseler, Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : stable- Portability: portable-- The modul creates the simplified form of a Relax NG schema.- See also chapter 4 of the Relax NG specification.---}---- --------------------------------------------------------------module Text.XML.HXT.RelaxNG.Simplification- ( createSimpleForm- , getErrors- )--where---import Control.Arrow.ListArrows--import Text.XML.HXT.DOM.Interface-import qualified Text.XML.HXT.DOM.XmlNode as XN- ( mkAttr- , mkText- )--import Text.XML.HXT.Arrow.XmlArrow-import Text.XML.HXT.Arrow.XmlIOStateArrow--import Text.XML.HXT.Arrow.Namespace- ( processWithNsEnv- , propagateNamespaces- )--import Text.XML.HXT.Arrow.Edit- ( removeWhiteSpace- )--import Text.XML.HXT.RelaxNG.DataTypes-import Text.XML.HXT.RelaxNG.BasicArrows-import Text.XML.HXT.RelaxNG.CreatePattern-import Text.XML.HXT.RelaxNG.DataTypeLibraries-import Text.XML.HXT.RelaxNG.Utils-import Text.XML.HXT.RelaxNG.Validation-import Text.XML.HXT.RelaxNG.Schema as S-import Text.XML.HXT.RelaxNG.SchemaGrammar as SG--import Data.Maybe- ( fromJust- , fromMaybe- , isNothing- )-import Data.List- ( elemIndices- , isPrefixOf- , nub- , deleteBy- , find- , (\\)- )--import System.Directory- ( doesFileExist )----- --------------------------------------------------------------{--- 4.1. Annotations: Foreign attributes and elements are removed.-- 4.2. Whitespace:- - For each element other than value and param, each child that is a string- containing only whitespace characters is removed. -> fertig- - Leading and trailing whitespace characters are removed from the value of each name,- type and combine attribute and from the content of each name element. -> fertig-- 4.3. datatypeLibrary attribute:- - The value of each datatypeLibary attribute is transformed by escaping disallowed characters- - For any data or value element that does not have a datatypeLibrary attribute,- a datatypeLibrary attribute is added.- - Any datatypeLibrary attribute that is on an element other than data or value is removed.-- 4.4. type attribute of value element--}-simplificationStep1 :: IOSArrow XmlTree XmlTree-simplificationStep1- = ( {-- - 4.5. href attribute- - The value of the href attribute on an externalRef or include element is first- - transformed by escaping disallowed characters- - The URI reference is then resolved into an absolute form- - The value of the href attribute will be used to construct an element.- -}- ( processHref $< getBaseURI )- >>>- -- 4.10 QNames- processWithNsEnv processEnvNames (toNsEnv [("xml",xmlNamespace)])- >>>- -- 4.4 For any data or value element that does not have a datatypeLibrary attribute,- -- a datatypeLibrary attribute is added.- -- Wird vorgezogen, da danach der Rest in einem Baumdurchlauf erledigt werden kann- processdatatypeLib ""- >>>- processTopDownWithAttrl- (- ( -- 4.1 Foreign attributes and elements are removed- none- `when`- ( ( isElem >>> neg isRoot- >>>- getNamespaceUri- >>>- isA (\ uri -> (not $ compareURI uri relaxNamespace))- )- `orElse`- ( isAttr- >>>- getNamespaceUri- >>>- isA (\ uri -> (uri /= "" && (not $ compareURI uri relaxNamespace)))- )- )- )- >>>- ( -- 4.2 For each element other than value and param, each child that- -- is a string containing only whitespace characters is removed.- ( processChildren removeWhiteSpace- `whenNot`- (isRngParam `orElse` isRngValue)- )- `when` isElem- )- >>>- ( -- 4.2 Leading and trailing whitespace characters are removed from the value- -- of each name, type and combine attribute ...- changeAttrValue normalizeWhitespace- `when`- ( isRngAttrName `orElse` isRngAttrType `orElse` isRngAttrCombine)- )- >>>- ( -- 4.2 ... and from the content of each name element.- processChildren (changeText normalizeWhitespace)- `when`- isRngName- )- >>>- ( -- 4.3 The value of each datatypeLibary attribute is transformed- -- by escaping disallowed characters- changeAttrValue escapeURI- `when`- isRngAttrDatatypeLibrary- )- >>>- ( -- The value of the datatypeLibary attribute has to be a valid URI- ( mkRelaxError "" $< ( getRngAttrDatatypeLibrary- >>>- arr (\ a -> ( "datatypeLibrary attribute: " ++- a ++ " is not a valid URI"- )- )- )- )- `when`- ( isElem- >>>- hasRngAttrDatatypeLibrary- >>>- getRngAttrDatatypeLibrary >>> isA (not . isRelaxAnyURI)- )- )- >>>- ( -- 4.3 Any datatypeLibrary attribute that is on an element- -- other than data or value is removed.- removeAttr "datatypeLibrary"- `when`- ( isElem- >>>- neg (isRngData `orElse` isRngValue)- >>>- hasRngAttrDatatypeLibrary- )- )- >>>- ( -- 4.4 For any value element that does not have a type attribute,- -- a type attribute is added with value token and the value of- -- the datatypeLibrary attribute is changed to the empty string.- ( addAttr "type" "token"- >>>- addAttr "datatypeLibrary" ""- )- `when`- ( isRngValue >>> neg hasRngAttrType )- )- )- ) `when` collectErrors- where- processHref :: String -> IOSArrow XmlTree XmlTree- processHref uri- = processChildren- ( choiceA- [ ( isElem >>> hasAttr "xml:base" )- :-> ( ifA ( isExternalRefInclude >>> hasRngAttrHref )- ( -- The value of the href attribute is transformed by- -- escaping disallowed characters- (processAttrl (changeAttrValue escapeURI `when` isRngAttrHref))- >>> -- compute the new base uri from the old uri and the href attribute- (addAttr "href" $< (absURI "href" $< (absURI "xml:base" uri)))- >>>- (processHref $< absURI "xml:base" uri)- ) -- element without a href attribute, just compute the new base uri- (processHref $< absURI "xml:base" uri)- )- , ( isExternalRefInclude >>> hasRngAttrHref )- :-> ( -- The value of the href attribute is transformed by- -- escaping disallowed characters- (processAttrl (changeAttrValue escapeURI `when` isRngAttrHref))- >>>- (addAttr "href" $< absURI "href" uri)- )- , this- :-> processHref uri- ]- )- where- absURI :: String -> String -> IOSArrow XmlTree String- absURI attrName u- = ( getAttrValue attrName- >>>- arr (\ a -> fromMaybe "" (expandURIString a u))- >>> -- the uri should not have a fragment-identifier (4.5)- ( arr ("illegal URI, fragment identifier not allowed: " ++)- `whenNot`- (getFragmentFromURI >>> isA null)- )- )-- processEnvNames :: NsEnv -> IOSArrow XmlTree XmlTree- processEnvNames env- = ( ( (replaceQNames env $< getAttrValue "name")- `when`- ( (isRngElement `orElse` isRngAttribute)- >>>- getRngAttrName- >>>- isA (elem ':')- )- )- >>>- ( (addAttrl (getBaseURI >>> createAttrL))- `when`- isRngValue- )- )- where- createAttrL :: IOSArrow String XmlTree- createAttrL- = setBaseUri &&& constA (map createAttr env) >>> arr2L (:)- where-- createAttr :: (XName, XName) -> XmlTree- createAttr (pre, uri)- = XN.mkAttr (mkName nm) [XN.mkText (show uri)]- where- nm | isNullXName pre = "RelaxContextDefault"- | otherwise = contextAttributes ++ show pre-- setBaseUri :: IOSArrow String XmlTree- setBaseUri = mkAttr (mkName contextBaseAttr) (txt $< this)-- replaceQNames :: NsEnv -> String -> IOSArrow XmlTree XmlTree- replaceQNames e name- | isNothing uri- = mkRelaxError "" ( "No Namespace-Mapping for the prefix " ++ show pre ++- " in the Context of Element: " ++ show name- )- | otherwise- = addAttr "name" ( "{" ++ (show . fromJust $ uri) ++ "}" ++ local )- where- (pre, local') = span (/= ':') name- local = tail local'- uri :: Maybe XName- uri = lookup (newXName pre) e-- -- The value of the added datatypeLibrary attribute is the value of the- -- datatypeLibrary attribute of the nearest ancestor element that- -- has a datatypeLibrary attribute, or the empty string- -- if there is no such ancestor.- processdatatypeLib :: (ArrowXml a) => String -> a XmlTree XmlTree- processdatatypeLib lib- = processChildren $- choiceA- [ ( isElem >>> hasRngAttrDatatypeLibrary- -- set the new datatypeLibrary value- )- :->- ( processdatatypeLib $< getRngAttrDatatypeLibrary )- , ( (isRngData `orElse` isRngValue)- >>>- neg hasRngAttrDatatypeLibrary- -- add a datatypeLibrary attribute- )- :->- ( addAttr "datatypeLibrary" lib >>> processdatatypeLib lib )- , this- :->- processdatatypeLib lib- ]---- ---------------------------------------------------------------{--- 4.5. href attribute- - see simplificationStep1-- 4.6. externalRef element- - An element is constructed using the URI reference- that is the value of href attribute- - This element must match the syntax for pattern.- - The element is transformed by recursively applying the rules from- this subsection and from previous subsections of this section.- - This must not result in a loop.- - Any ns attribute on the externalRef element is transferred- to the referenced element if the referenced element does- not already have an ns attribute.- - The externalRef element is then replaced by the referenced element.-- 4.7. include element- - An element is constructed using the URI reference that is the- value of href attribute- - This element must be a grammar element, matching the syntax for grammar.- - This grammar element is transformed by recursively applying the rules- from this subsection and from previous subsections of this section.- - This must not result in a loop.-- - If the include element has a start component, then the grammar element- must have a start component.- - If the include element has a start component, then all start components- are removed from the grammar element.- - If the include element has a define component, then the grammar element- must have a define component with the same name.- - For every define component of the include element, all define components- with the same name are removed from the grammar element.-- - The include element is transformed into a div element.- - The attributes of the div element are the attributes of the- include element other than the href attribute.- - The children of the div element are the grammar element- - The grammar element is then renamed to div.--}--simplificationStep2 :: Attributes -> Bool -> Bool -> [Uri] -> [Uri] -> IOSArrow XmlTree XmlTree-simplificationStep2 readOptions validateExternalRef validateInclude extHRefs includeHRefs =- ( processTopDown (- ( (importExternalRef $<< (getRngAttrNs &&& getRngAttrHref))- `when`- isRngExternalRef- )- >>>- ( (importInclude $< getAttrValue "href")- `when`- isRngInclude- )- )- ) `when` collectErrors- where- importExternalRef :: String -> String -> IOSArrow XmlTree XmlTree- importExternalRef ns href- = ifA ( neg $ constA href- >>> getPathFromURI- >>> ( isA (not . ("illegal URI" `isPrefixOf`))- `guards`- isIOA doesFileExist- )- )- ( mkRelaxError ""- ( show href ++- ": can't read URI, referenced in externalRef-Pattern"- )- )- ( ifP (const $ elem href extHRefs)- -- if the referenced name already exists in the list of processed ref attributes- -- we have found a loop- ( mkRelaxError ""- ( "loop in externalRef-Pattern, " ++- formatStringListArr (reverse $ href:extHRefs)- )- )- ( ifA ( if validateExternalRef -- if validation parameters are set- then validateDocWithRelax S.relaxSchemaArrow [] href -- the referenced schema is validated with respect to- else none -- the Relax NG specification- )- ( mkRelaxError ""- ( "The content of the schema " ++ show href ++- ", referenced in externalRef does not " ++- "match the syntax for pattern"- )- )- ( readForRelax readOptions href- >>>- simplificationStep1 -- perform the transformations from previous steps- >>>- simplificationStep2 readOptions validateExternalRef validateInclude (href:extHRefs) includeHRefs- >>>- getChildren -- remove the root node- >>>- ( -- Any ns attribute on the externalRef element- -- is transferred to the referenced element- addAttr "ns" ns- `when`- (getRngAttrNs >>> isA (\a -> a == "" && ns /= ""))- )- )- )- )-- importInclude :: String -> IOSArrow XmlTree XmlTree- importInclude href- = ifA ( -- test whether the referenced schema exists- neg $ constA href >>> getPathFromURI >>> isIOA doesFileExist- )- ( mkRelaxError ""- ( "Can't read " ++ show href ++- ", referenced in include-Pattern"- )- )- ( ifP (const $ elem href includeHRefs)- -- if the referenced name still exists in the list of processed- -- ref attributes we have found a loop- ( mkRelaxError ""- ( "loop in include-Pattern, " ++- formatStringListArr (reverse $ href:includeHRefs)- )- )- ( ifA ( if validateInclude -- if the parameter is set- then validateDocWithRelax SG.relaxSchemaArrow [] href -- the referenced schema is validated with respect to- else none -- the Relax NG grammar element- )- ( mkRelaxError ""- ( "The content of the schema " ++ show href ++- ", referenced in include does not match " ++- "the syntax for grammar"- )- )- ( processInclude href $< ( readForRelax readOptions href- >>>- simplificationStep1 -- perform the transformations from previous steps- >>>- simplificationStep2 readOptions validateExternalRef validateInclude extHRefs (href:includeHRefs)- >>>- getChildren -- remove the root node- )- )- )- )-- processInclude :: String -> XmlTree -> IOSArrow XmlTree XmlTree- processInclude href newDoc- = -- The include element is transformed into a div element.- setRngNameDiv- >>>- -- The attributes of the div element are the attributes of- -- the include element other than the href attribute.- removeAttr "href"- >>>- checkInclude href newDoc--- insertNewDoc :: XmlTree -> Bool -> [String] -> IOSArrow XmlTree XmlTree- insertNewDoc newDoc hasStart defNames- = insertChildrenAt 0 $- constA newDoc- >>>- -- If the include element has a start component, then all start components- -- are removed from the grammar element.- (removeStartComponent `whenP` (const hasStart))- >>>- -- For every define component of the include element, all define components- -- with the same name are removed from the grammar element.- ((removeDefineComponent defNames) `whenP` (const $ defNames /= []))- >>>- -- The grammar element is then renamed to div.- setRngNameDiv--- checkInclude :: String -> XmlTree -> IOSArrow XmlTree XmlTree- checkInclude href newDoc- = ifA ( -- If the include element has a start component, then the grammar element- -- must have a start component.- hasStartComponent &&& (constA newDoc >>> hasStartComponent)- >>>- isA (\ (a, b) -> if a then b else True)- )- ( ifA ( -- If the include element has a define component, then the grammar element- -- must have a define component with the same name.- getDefineComponents &&& (constA newDoc >>> getDefineComponents)- >>>- isA (\ (a, b) -> (diff a b) == [])- )- (insertNewDoc newDoc $<< hasStartComponent &&& getDefineComponents)- ( mkRelaxError ""- ( "Define-pattern missing in schema " ++ show href ++- ", referenced in include-pattern"- )- )- )- ( mkRelaxError ""- ( "Grammar-element without a start-pattern in schema " ++- show href ++ ", referenced in include-pattern"- )- )- where- diff a b = (noDoubles a) \\ (noDoubles b)-- removeStartComponent :: IOSArrow XmlTree XmlTree- removeStartComponent- = processChildren $- choiceA [- isRngStart :-> none,- isRngDiv :-> removeStartComponent,- this :-> this- ]-- removeDefineComponent :: [String] -> IOSArrow XmlTree XmlTree- removeDefineComponent defNames- = processChildren $- choiceA [- ( isRngDefine- >>>- getRngAttrName- >>>- isA (\n -> elem n defNames)) :-> none,- (isElem >>> getName >>> isA (== "div")) :-> (removeDefineComponent defNames),- (constA "foo" >>> isA (== "foo")) :-> this- ]-- hasStartComponent :: IOSArrow XmlTree Bool- hasStartComponent = listA hasStartComponent' >>> arr (any id)- where- hasStartComponent' :: IOSArrow XmlTree Bool- hasStartComponent'- = getChildren- >>>- choiceA [- isRngStart :-> (constA True),- isRngDiv :-> hasStartComponent',- this :-> (constA False)- ]-- getDefineComponents :: IOSArrow XmlTree [String]- getDefineComponents = listA getDefineComponents'- >>>- arr (\xs -> [x | x <- xs, x /= ""])- where- getDefineComponents' :: IOSArrow XmlTree String- getDefineComponents'- = getChildren- >>>- choiceA- [ isRngDefine :-> getRngAttrName- , isRngDiv :-> getDefineComponents'- , this :-> constA ""- ]----- ---------------------------------------------------------------{--- 4.8. name attribute of element and attribute elements- - The name attribute on an element or attribute element- is transformed into a name child element.- - If an attribute element has a name attribute but no ns attribute,- then an ns="" attribute is added to the name child element.-- 4.9. ns attribute- - For any name, nsName or value element that does not have- an ns attribute, an ns attribute is added.- - any ns attribute that is on an element other than name,- nsName or value is removed.-- 4.10. QNames- - For any name element containing a prefix, the prefix is removed- and an ns attribute is added replacing any existing ns attribute.- - The value of the added ns attribute is the value to which the- namespace map of the context of the name element maps the prefix.- - The context must have a mapping for the prefix.--}-simplificationStep3 :: IOSArrow XmlTree XmlTree-simplificationStep3 =- ( processTopDown (- ( -- 4.8 The name attribute on an element or attribute- -- element is transformed into a name child element- ( insertChildrenAt 0 (mkRngName none (txt $< getRngAttrName))- )- >>>- ( -- 4.8 If an attribute element has a name attribute but no ns attribute,- -- then an ns="" attribute is added to the name child element- (processChildren (addAttr "ns" "" `when` isRngName))- `when`- (isRngAttribute >>> hasRngAttrName >>> neg hasRngAttrNs)- )- >>>- removeAttr "name"- )- `when`- ( (isRngElement `orElse` isRngAttribute) >>> hasRngAttrName )- )- >>>- -- 4.9 For any name, nsName or value element that does not have- -- an ns attribute, an ns attribute is added.- processnsAttribute ""- >>>- processTopDown (- ( -- 4.9 any ns attribute that is on an element other than name,- -- nsName or value is removed.- (removeAttr "ns")- `when`- (isElem >>> neg (isRngName `orElse` isRngNsName `orElse` isRngValue))- )- >>>- ( -- 4.10 For any name element containing a prefix, the prefix is removed and an ns attribute- -- is added replacing any existing ns attribute.- (replaceNameAttr $< (getChildren >>> isText >>> getText))- `when`- isRngName- )- )- ) `when` collectErrors- where- replaceNameAttr :: (ArrowXml a) => String -> a XmlTree XmlTree- replaceNameAttr name- = (addAttr "ns" pre >>> processChildren (changeText $ const local))- `whenP`- (const $ elem '}' name)- where- (pre', local') = span (/= '}') name- pre = tail pre'- local = tail local'-- processnsAttribute :: String -> IOSArrow XmlTree XmlTree- processnsAttribute name- = processChildren $- choiceA [- -- set the new ns attribute value- (isElem >>> hasRngAttrNs)- :-> (processnsAttribute $< getRngAttrNs),- -- For any name, nsName or value element that does not have- -- an ns attribute, an ns attribute is added.- ( isNameNsNameValue >>> neg hasRngAttrNs)- :-> (addAttr "ns" name >>> processnsAttribute name),- this :-> (processnsAttribute name)- ]----- ---------------------------------------------------------------{--- 4.11 Each div element is replaced by its children-- 4.12 Number of child elements- - A define, oneOrMore, zeroOrMore, optional, list or mixed element- is transformed so that it has exactly one child element- - An element element is transformed so that it has exactly two child elements- - A except element is transformed so that it has exactly one child element- - If an attribute element has only one child element (a name class), then a text element is added.- - A choice, group or interleave element is transformed so that it has exactly two child elements.-- 4.13 A mixed element is transformed into an interleaving with a text element-- 4.14 An optional element is transformed into a choice with empty-- 4.15 A zeroOrMore element is transformed into a choice between oneOrMore and empty-- 4.16. Constraints: no transformation is performed, but various constraints are checked.- - An except element that is a child of an anyName element must not have any anyName descendant elements.- - An except element that is a child of an nsName element must not have any nsName or anyName- descendant elements.- - A name element that occurs as the first child of an attribute element or as the descendant of the- first child of an attribute element and that has an ns attribute with value equal to the empty- string must not have content equal to xmlns.- - A name or nsName element that occurs as the first child of an attribute element or as the- descendant of the first child of an attribute element must not have an ns attribute with- value http://www.w3.org/2000/xmlns.- - A data or value element must be correct in its use of datatypes.--}-simplificationStep4 :: IOSArrow XmlTree XmlTree-simplificationStep4 =- ( processTopDown (- ( -- Each div element is replaced by its children.- (getChildren >>> simplificationStep4)- `when`- isRngDiv- )- >>>- ( -- A define, oneOrMore, zeroOrMore, optional, list or mixed element- -- is transformed so that it has exactly one child element- ( replaceChildren- ( mkRngGroup- (setChangesAttr $< (getName >>> arr ("group-Pattern: " ++)))- getChildren- )- )- `when`- ( isDefineOneOrMoreZeroOrMoreOptionalListMixed- >>>- noOfChildren (> 1)- )- )- >>>- ( -- An element element is transformed so that it has exactly two child elements- ( replaceChildren- ( ( getChildren >>> isNameAnyNameNsName )- <+>- ( mkRngGroup none- ( getChildren- >>>- neg isNameAnyNameNsName- )- )- )- )- `when`- ( isRngElement >>> noOfChildren (> 2) )- )- >>>- ( -- A except element is transformed so that it has exactly one child element.- replaceChildren ( mkRngChoice none getChildren )- `when`- ( isRngExcept >>> noOfChildren (> 1) )- )- >>>- ( -- If an attribute element has only one child element- -- (a name class), then a text element is added.- insertChildrenAt 1 (mkRngText none)- `when`- ( isRngAttribute >>> noOfChildren (== 1) )- )- >>>- ( -- A choice, group or interleave element is transformed so- -- that it has exactly two child elements.- ((wrapPattern2Two $< getName) >>> simplificationStep4)- `when`- ( isChoiceGroupInterleave- >>>- noOfChildren (\ i -> i > 2 || i == 1)- )- )- >>>- ( -- A mixed element is transformed into an interleaving with a text element- ( mkRngInterleave- ( setChangesAttr "mixed is transformed into an interleave" )- ( getChildren- <+>- mkRngText- ( setChangesAttr ( "new text-Pattern: mixed is transformed into " ++- " an interleave with text"- )- )- )- )- `when`- isRngMixed- )- >>>- ( -- An optional element is transformed into a choice with empty- ( mkRngChoice- ( setChangesAttr "optional is transformed into a choice" )- ( getChildren- <+>- mkRngEmpty- ( setChangesAttr ( "new empty-Pattern: optional is transformed " ++- " into a choice with empty"- )- )- )- )- `when`- isRngOptional- )- >>>- ( -- A zeroOrMore element is transformed into a choice between oneOrMore and empty- ( mkRngChoice- ( setChangesAttr "zeroOrMore is transformed into a choice" )- ( ( mkRngOneOrMore- ( setChangesAttr ( "zeroOrMore is transformed into a " ++- "choice between oneOrMore and empty"- )- )- getChildren- )- <+>- ( mkRngEmpty- ( setChangesAttr ( "new empty-Pattern: zeroOrMore is transformed " ++- "into a choice between oneOrMore and empty"- )- )- )- )- )- `when`- isRngZeroOrMore- )- )- ) `when` collectErrors----- ---------------------------------------------------------------restrictionsStep1 :: IOSArrow XmlTree XmlTree-restrictionsStep1 =- ( processTopDown (- ( ( mkRelaxError ""- ( "An except element that is a child of an anyName " ++- "element must not have any anyName descendant elements"- )- )- `when`- ( isRngAnyName- >>>- getChildren- >>>- isRngExcept- >>>- deep isRngAnyName- )- )- >>>- ( ( mkRelaxError ""- ( "An except element that is a child of an nsName element " ++- "must not have any nsName or anyName descendant elements."- )- )- `when`- ( isRngNsName- >>>- getChildren- >>>- isRngExcept- >>>- deep (isRngAnyName `orElse` isRngNsName)- )- )- >>>- ( ( mkRelaxError ""- ( "A name element that occurs as the first child or descendant of " ++- "an attribute and has an ns attribute with an empty value must " ++- "not have content equal to \"xmlns\""- )- )- `when`- ( isRngAttribute- >>>- firstChild- >>>- ( multi (isRngName >>> hasRngAttrNs) )- >>>- ( ( getRngAttrNs >>> isA null)- `guards`- (getChildren >>> getText >>> isA (== "xmlns"))- )- )- )- >>>- ( ( mkRelaxError ""- ( "A name or nsName element that occurs as the first child or " ++- "descendant of an attribute must not have an ns attribute " ++- "with value http://www.w3.org/2000/xmlns"- )- )- `when`- ( isRngAttribute- >>>- firstChild- >>>- ( multi (isNameNsName >>> hasRngAttrNs) )- >>>- getRngAttrNs- >>>- isA (compareURI xmlnsNamespace)- )- )- >>> -- A data or value element must be correct in its use of datatypes.- ( ( checkDatatype $<< getRngAttrDatatypeLibrary &&& getRngAttrType )- `when`- ( isRngData `orElse` isRngValue )- )- )- ) `when` collectErrors- where-- -- the datatypeLibrary attribute must identify a valid datatype library-- checkDatatype :: Uri -> DatatypeName -> IOSArrow XmlTree XmlTree- checkDatatype libName typeName- = ifP (const $ elem libName $ map fst datatypeLibraries)- ( checkType libName typeName allowedDataTypes )- ( mkRelaxError ""- ( "DatatypeLibrary " ++ show libName ++ " not found" )- )- where- DTC _ _ allowedDataTypes = fromJust $ lookup libName datatypeLibraries-- -- the type attribute must identify a datatype within the datatype library identified- -- by the value of the datatypeLibrary attribute.-- checkType :: Uri -> DatatypeName -> AllowedDatatypes -> IOSArrow XmlTree XmlTree- checkType libName typeName allowedTypes- = ifP (const $ elem typeName $ map fst allowedTypes)- ( checkParams typeName libName getParams $<- ( listA (getChildren >>> isRngParam >>> getRngAttrName) )- )- ( mkRelaxError ""- ( "Datatype " ++ show typeName ++- " not declared for DatatypeLibrary " ++ show libName- )- )- where- getParams = fromJust $ lookup typeName allowedTypes-- -- For a data element, the parameter list must be one that is allowed by the datatype-- checkParams :: DatatypeName -> Uri -> AllowedParams -> [ParamName] -> IOSArrow XmlTree XmlTree- checkParams typeName libName allowedParams paramNames- = ( mkRelaxError ""- ( "Param(s): " ++ formatStringListQuot diff ++- " not allowed for Datatype " ++ show typeName ++- " in Library " ++- show ( if null libName- then relaxNamespace- else libName- )- )- )- `when`- ( isRngData >>> isA (const $ diff /= []) )- where- diff = filter (\param -> not $ elem param allowedParams) paramNames----- ---------------------------------------------------------------{--- 4.17. combine attribute- - For each grammar element, all define elements with the same name are combined together.- - Similarly, for each grammar element all start elements are combined together.-- 4.18. grammar element- - A grammar must have a start child element.- - Transform the top-level pattern p into <grammar><start>p</start></grammar>.- - Rename define elements so that no two define elements anywhere in the schema- have the same name. To rename a define element, change the value of its name- attribute and change the value of the name attribute of all ref and parentRef- elements that refer to that define element.- - Move all define elements to be children of the top-level grammar element- - Replace each nested grammar element by the child of its start element- - Rename each parentRef element to ref.--}-simplificationStep5 :: IOSArrow XmlTree XmlTree-simplificationStep5- = ( processTopDown- ( ( ( ( (deep isRngRelaxError)- <+>- ( mkRelaxError "" "A grammar must have a start child element" )- )- `when`- (neg (getChildren >>> isRngStart))- )- >>>- -- For each grammar element, all define elements with the same- -- name are combined together.- ( combinePatternList "define" $< (getPatternNamesInGrammar "define" >>> arr nub) )- >>>- -- Similarly, for each grammar element all start elements- -- are combined together.- ( combinePatternList "start" $< (getPatternNamesInGrammar "start" >>> arr nub) )- )- `when`- isRngGrammar- )- >>>- ( -- transform the top-level pattern p into <grammar><start>p</start></grammar>.- ( replaceChildren- ( mkRngGrammar none- ( mkRngStart none getChildren )- )- )- `when`- neg (getChildren >>> isRngGrammar)- )- >>>- ( renameDefines $<<- ( getPatternNamesInGrammar "define"- >>>- (createUniqueNames $< (getAndSetCounter "define_id" >>> arr read))- &&&- constA []- )- )- >>>- -- Move all define elements to be children of the top-level grammar element- ( processChildren- ( -- root node- processChildren- ( -- the first grammar pattern remains unchanged- ( deleteAllDefines- <+>- ( getAllDefines >>> processChildren deleteAllDefines )- )- >>>- processTopDown- ( ( -- Replace each nested grammar element by the child of its start element- ( getChildren >>> isRngStart >>> getChildren )- `when`- isRngGrammar- )- >>>- ( -- Rename each parentRef element to ref.- ( setRngNameRef- `when`- isRngParentRef- )- )- )- )- )- )- ) `when` collectErrors- where- getPatternNamesInGrammar :: (ArrowXml a) => String -> a XmlTree [String]- getPatternNamesInGrammar pattern- = processChildren- ( processTopDown ( none `when` isRngGrammar ) )- >>>- listA ( (multi (isElem >>> hasRngName pattern))- >>>- getRngAttrName- )-- createUniqueNames :: Int -> IOSArrow [String] RefList- createUniqueNames num- = arr (\ l -> unique l num)- >>>- perform (setParamInt "define_id" $< arr (max num . getNextValue))- where- unique :: [String] -> Int -> RefList- unique [] _ = []- unique (x:xs) num' = (x, (show num')):(unique xs (num'+1))- getNextValue :: RefList -> Int- getNextValue [] = 0- getNextValue rl = maximum (map (read . snd) rl) + 1-- renameDefines :: RefList -> RefList -> IOSArrow XmlTree XmlTree- renameDefines ref parentRef- = processChildren- ( choiceA- [ isRngDefine- :-> ( -- the original name is needed for error messages- addAttr defineOrigName $< getRngAttrName- >>>- -- rename the define-pattern- -- the new name is looked up in the ref table- addAttr "name" $< ( getRngAttrName- >>>- arr (\n -> fromJust $ lookup n ref)- )- >>>- renameDefines ref parentRef- )- , isRngGrammar- :-> ( renameDefines $<< ( ( -- compute all define names in the grammar- getPatternNamesInGrammar "define"- >>>- -- create a new (unique) name for all define names- (createUniqueNames $< (getParamInt 0 "define_id"))- )- &&&- -- set the old ref list to be the new parentRef list- constA ref- )- )- , isRngRef- :-> ( ifA ( getRngAttrName- >>>- isA (\name -> (elem name (map fst ref)))- )- ( -- the original name is needed for error messages- addAttr defineOrigName $< getRngAttrName- >>>- -- rename the ref-pattern- -- the new name is looked up in the ref table- addAttr "name" $< ( getRngAttrName- >>>- arr (\n -> fromJust $ lookup n ref)- )- )- ( -- the referenced pattern does not exist in the schema- mkRelaxError "" $< ( getRngAttrName- >>>- arr (\ n -> ( "Define-Pattern with name " ++ show n ++- " referenced in ref-Pattern not " ++- "found in schema"- )- )- )- )- )- , isRngParentRef -- same as ref, but the parentRef list is used- :-> ( ifA ( getRngAttrName- >>>- isA (\name -> (elem name (map fst parentRef)))- )- ( addAttr defineOrigName $< getRngAttrName- >>>- addAttr "name" $< ( getRngAttrName- >>>- arr (\n -> fromJust $ lookup n parentRef)- )- )- ( mkRelaxError "" $<- ( getRngAttrName- >>>- arr (\ n -> ( "Define-Pattern with name " ++ show n ++- " referenced in parentRef-Pattern " ++- "not found in schema"- )- )- )- )- )- , this- :-> renameDefines ref parentRef- ]- )--- getAllDefines :: IOSArrow XmlTree XmlTree- getAllDefines = multi isRngDefine-- deleteAllDefines :: IOSArrow XmlTree XmlTree- deleteAllDefines = processTopDown $ none `when` isRngDefine-- combinePatternList :: String -> [String] -> IOSArrow XmlTree XmlTree- combinePatternList _ [] = this- combinePatternList pattern (x:xs)- = (replaceChildren $ combinePattern pattern x)- >>>- combinePatternList pattern xs-- -- combine a define- or start-pattern (first parameter) with a- -- specific name (second parameter)- combinePattern :: String -> String -> IOSArrow XmlTree XmlTree- combinePattern pattern name- = createPatternElems pattern name- <+>- (getChildren >>> deletePatternElems pattern name)-- createPatternElems :: String -> String -> IOSArrow XmlTree XmlTree- createPatternElems pattern name- = ( ( (listA (getElems pattern name >>> getRngAttrCombine))- >>>- checkPatternCombine pattern name- )- -- After determining this unique value, the combine attributes are removed.- &&&- (listA (getElems pattern name >>> removeAttr "combine")))- >>> -- ((errorCode::Int,errorMessage::String), result::XmlTrees)- choiceA- [ isA (\ ((code,_) , _) -> code == 0)- :->- (mkRelaxError "" $< arr (snd . fst))- , isA (\ ((code,str) , _) -> code == 1 && str == "")- :->- arrL snd- , isA (\ ((code,str) , _) -> code == 1 && str /= "")- :->- ( createPatternElem pattern name $<<- ( arr (snd . fst) &&& (arr snd) )- )- , this- :->- ( mkRelaxError ""- ( "Can't create Pattern: " ++ show pattern ++- " with name " ++ show name ++ " in createPatternElems"- )- )- ]-- createPatternElem :: (ArrowXml a) => String -> String -> String -> XmlTrees -> a n XmlTree- createPatternElem pattern name combine trees- = mkRngElement pattern (mkAttr (mkName "name") (txt name))- ( ( mkRngElement combine none- (arrL (const trees) >>> getChildren)- )- >>>- wrapPattern2Two combine- )-- checkPatternCombine :: (ArrowXml a) => String -> String -> a [String] (Int, String)- checkPatternCombine pattern name- = choiceA- [ -- just one pattern with that name -> ok, no combine is needed- (isA (\ cl -> length cl == 1))- :->- constA (1, "")- , (isA (\ cl -> (length $ elemIndices "" cl) > 1))- :->- constA ( 0- , "More than one " ++ pattern ++ "-Pattern: " ++ show name ++- " without an combine-attribute in the same grammar"- )- , (isA (\ cl -> (length $ nub $ deleteBy (==) "" cl) > 1))- :->- arr (\ cl -> ( 0- , "Different combine-Attributes: " ++- (formatStringListQuot $ noDoubles cl) ++- " for the " ++ pattern ++ "-Pattern " ++- show name ++ " in the same grammar"- )- )- , -- ok -> combine value is returned- this- :->- arr (\ cl -> (1, fromJust $ find (/= "") cl))- ]-- isElemWithNameValue :: (ArrowXml a) => String -> String -> a XmlTree XmlTree- isElemWithNameValue ename nvalue- = ( isElem- >>>- hasRngName ename- >>>- getRngAttrName- >>>- isA (== nvalue)- )- `guards` this-- getElems :: (ArrowXml a) => String -> String -> a XmlTree XmlTree- getElems pattern name- = getChildren- >>>- choiceA- [ isElemWithNameValue pattern name- :->- (this <+> getElems pattern name)- , isRngGrammar- :-> none- , this- :->- getElems pattern name- ]-- deletePatternElems :: (ArrowXml a) => String -> String -> a XmlTree XmlTree- deletePatternElems pattern name- = choiceA- [ isElemWithNameValue pattern name- :->- none- , isRngGrammar- :-> this- , this- :->- processChildren ( deletePatternElems pattern name )- ]----- ---------------------------------------------------------------{--- 4.19. define and ref elements- - Remove any define element that is not reachable.- - Now, for each element element that is not the child of a define element,- add a define element to the grammar element,- and replace the element element by a ref element referring- to the added define element.- - For each ref element that is expandable and is a descendant- of a start element or an element element, expand it by replacing- the ref element by the child of the define element to which it refers- - This must not result in a loop.- - Remove any define element whose child is not an element element.--}-simplificationStep6 :: IOSArrow XmlTree XmlTree-simplificationStep6 =- ( -- Remove any define element that is not reachable.- (removeUnreachableDefines $<<< getAllDeepDefines- &&&- constA []- &&&- getRefsFromStartPattern- )- >>>- -- for each element element that is not the child of a define element,- -- add a define element to the grammar element,- ( processElements False- >>>- processChildren (insertChildrenAt 1 (getParam "elementTable"))- )- >>>- -- For each ref element that is expandable...- -- Remove any define element whose child is not an element element- (replaceExpandableRefs [] $< getExpandableDefines >>> deleteExpandableDefines)- ) `when` collectErrors- where- replaceExpandableRefs :: RefList -> Env -> IOSArrow XmlTree XmlTree- replaceExpandableRefs foundNames defTable- = choiceA [- isRngRef- :-> (ifA ( getRngAttrName- >>>- isA (\name -> elem name (map fst foundNames))- )- -- we have found a loop if the name is in the list- (mkRelaxError "" $< ( getAttrValue defineOrigName- >>>- arr (\ n -> ( "Recursion in ref-Pattern: " ++- formatStringListArr (reverse $ (n:) $ map snd foundNames)- )- )- )- )- (replaceRef $<< getRngAttrName &&& getAttrValue defineOrigName)- ),- this :-> (processChildren $ replaceExpandableRefs foundNames defTable)- ]- where- replaceRef :: NewName -> OldName -> IOSArrow XmlTree XmlTree- replaceRef name oldname- = ( constA (fromJust $ lookup name defTable)- >>>- getChildren- >>>- replaceExpandableRefs ((name,oldname):foundNames) defTable- )- `whenP`- (const $ elem name $ map fst defTable)--- processElements :: Bool -> IOSArrow XmlTree XmlTree- processElements parentIsDefine- = processChildren- ( choiceA- [ isRngElement- :-> ( ifP (const parentIsDefine)- (processElements False)- ( processElements' $<< ( getAndSetCounter "define_id"- &&&- getDefineName- )- )- )- , isRngDefine- :-> processElements True- , this- :-> processElements False- ])- where- getDefineName :: IOSArrow XmlTree String- getDefineName- = firstChild- >>>- fromLA createNameClass- >>>- arr show-- processElements' :: NewName -> OldName -> IOSArrow XmlTree XmlTree- processElements' name oldname- = storeElement name oldname- >>>- mkRngRef (createAttr name oldname) none-- storeElement :: NewName -> OldName -> IOSArrow XmlTree XmlTree- storeElement name oldname- = perform $- ( mkRngDefine- (createAttr name oldname) (processElements False)- )- &&&- (listA $ getParam "elementTable")- >>>- arr2 (:)- >>>- setParamList "elementTable"-- createAttr :: NewName -> OldName -> IOSArrow XmlTree XmlTree- createAttr name oldname- = mkAttr (mkName "name") (txt name)- <+>- mkAttr (mkName defineOrigName) (txt $ "created for element " ++ oldname)-- getExpandableDefines :: (ArrowXml a) => a XmlTree Env- getExpandableDefines- = listA $ (multi ( ( isRngDefine- >>>- getChildren- >>>- neg isRngElement- )- `guards`- this- )- )- >>>- (getRngAttrName &&& this)-- deleteExpandableDefines :: (ArrowXml a) => a XmlTree XmlTree- deleteExpandableDefines- = processTopDown $ none- `when`- ( isRngDefine- >>>- getChildren- >>>- neg isRngElement- )----- ---------------------------------------------------------------{--- 4.20. notAllowed element- - An attribute, list, group, interleave, or oneOrMore element that has- a notAllowed child element is transformed into a notAllowed element.- - A choice element that has two notAllowed child elements- is transformed into a notAllowed element- - A choice element that has one notAllowed child element- is transformed into its other child element.- - An except element that has a notAllowed child element is removed.- - The preceding transformations are applied repeatedly- until none of them is applicable any more.- - Any define element that is no longer reachable is removed.-- 4.21. empty element- - A group, interleave or choice element that has two empty child- elements is transformed into an empty element.- - A group or interleave element that has one empty child element- is transformed into its other child element.- - A choice element whose second child element is an empty element- is transformed by interchanging its two child elements.- - A oneOrMore element that has an empty child element- is transformed into an empty element.- - The preceding transformations are applied repeatedly- until none of them is applicable any more.--}--simplificationStep7 :: IOSArrow XmlTree XmlTree-simplificationStep7- = ( markTreeChanged 0 -- 0 = no changes, 1 = changes performed- >>>- processTopDownWithAttrl- ( ( -- An attribute, list, group, interleave, or oneOrMore element that has a- -- notAllowed child element is transformed into a notAllowed element.- ( ( mkRngNotAllowed none none- >>>- markTreeChanged 1- )- `whenNot` -- keep all errors- (deep isRngRelaxError)- )- `when`- ( isAttributeListGroupInterleaveOneOrMore- >>>- getChildren- >>>- isRngNotAllowed- )- )- >>>- ( -- A choice element that has two notAllowed child elements is- -- transformed into a notAllowed element- ( mkRngNotAllowed none none- >>>- markTreeChanged 1- )- `when`- ( isRngChoice- >>>- listA (getChildren >>> isRngNotAllowed)- >>>- isA (\s -> length s == 2)- )- )- >>>- ( -- A choice element that has one notAllowed child element is- -- transformed into its other child element.- ( getChildren >>> neg isRngNotAllowed- >>>- markTreeChanged 1- )- `when`- ( isRngChoice >>> getChildren >>> isRngNotAllowed )- )- >>>- ( -- An except element that has a notAllowed child element is removed.- ( ( markTreeChanged 1- >>>- none- )- `whenNot` -- keep all errors- deep isRngRelaxError- )- `when`- ( isRngExcept >>> getChildren >>> isRngNotAllowed )- )- >>> -- transforming the empty pattern (4.21)- ( -- A group, interleave or choice element that has two empty child elements- -- is transformed into an empty element.- ( mkRngEmpty none- >>>- markTreeChanged 1- )- `when`- ( isChoiceGroupInterleave- >>>- listA (getChildren >>> isRngEmpty)- >>>- isA (\s -> length s == 2)- )- )- >>>- ( -- A group or interleave element that has one empty child element- -- is transformed into its other child element.- ( getChildren- >>>- neg isRngEmpty- >>>- markTreeChanged 1- )- `when`- ( isGroupInterleave >>> getChildren >>> isRngEmpty )- )- >>>- ( -- A choice element whose second child element is an empty element is transformed- -- by interchanging its two child elements.- changeChoiceChildren- `when`- ( isRngChoice >>> getChildren >>> isRngEmpty )- )- >>>- ( -- A oneOrMore element that has an empty child element- -- is transformed into an empty element.- ( mkRngEmpty none- >>>- markTreeChanged 1- )- `when`- ( isRngOneOrMore >>> getChildren >>> isRngEmpty )- )- )- >>>- -- The preceding transformations are applied repeatedly- -- until none of them is applicable any more.- ( simplificationStep7- `when`- hasTreeChanged- )- ) `when` collectErrors- where- changeChoiceChildren :: IOSArrow XmlTree XmlTree- changeChoiceChildren- = ( ( replaceChildren- ( mkRngEmpty none- <+>- (getChildren >>> neg isRngEmpty)- )- >>>- markTreeChanged 1- )- `when`- ( single (getChildren >>> isElem) -- first child not "empty" elem- >>>- neg isRngEmpty- )- )--hasTreeChanged :: IOSArrow b Int-hasTreeChanged- = getParamInt 0 "rng:changeTree"- >>>- isA (== 1)--markTreeChanged :: Int -> IOSArrow b b-markTreeChanged i- = perform (setParamInt "rng:changeTree" i)---- ---------------------------------------------------------------simplificationStep8 :: IOSArrow XmlTree XmlTree-simplificationStep8 -- Remove any define element that is not reachable.- = ( ( removeUnreachableDefines $<<<- ( getAllDeepDefines- &&&- constA []- &&&- getRefsFromStartPattern- )- )- `when` collectErrors- )----- ---------------------------------------------------------------restrictionsStep2 :: IOSArrow XmlTree XmlTree-restrictionsStep2 =- processTopDown (- choiceA [--- 7.1.1. attribute pattern, the following paths are prohibited:--- attribute//(ref | attribute)- isRngAttribute :->- ( ( deep isRngRelaxError- <+>- ( mkRelaxError $<< (getChangesAttr- &&&- ( listA ( getChildren- >>>- deep isAttributeRef- >>>- (getName &&& getChangesAttr >>> arr2 (++))- )- >>>- arr (\n -> formatStringListPatt n ++- "Pattern not allowed as descendent(s)" ++- " of a attribute-Pattern"- )- )- )- )- )- `when`- ( getChildren >>> deep isAttributeRef )- ),---- 7.1.2. oneOrMore pattern, the following paths are prohibited:--- oneOrMore//(group | interleave)//attribute- isRngOneOrMore :->- ( ( deep isRngRelaxError- <+>- ( mkRelaxError $<< (getChangesAttr- &&&- ( listA ( getChildren- >>>- deep isGroupInterleave- >>>- (getName &&& getChangesAttr >>> arr2 (++))- )- &&&- getChangesAttr- >>>- arr2 (\ n c -> ( formatStringListPatt n ++- "Pattern not allowed as descendent(s) " ++- "of a oneOrMore-Pattern" ++- (if null c then "" else " " ++ show c) ++- " followed by an attribute descendent"- )- )- )- )- )- )- `when`- ( getChildren >>> deep isGroupInterleave- >>>- getChildren >>> deep isRngAttribute- )- ),---- 7.1.3. list pattern, the following paths are prohibited:--- list//( list | ref | attribute | text | interleave)- isRngList :->- ( ( deep isRngRelaxError- <+>- ( mkRelaxError $<< (getChangesAttr- &&&- ( listA ( getChildren- >>>- deep isAttributeRefTextListInterleave- >>>- (getName &&& getChangesAttr >>> arr2 (++))- )- >>>- arr (\n -> formatStringListPatt n ++- "Pattern not allowed as descendent(s) of a list-Pattern")- )- )- )- )- `when`- ( getChildren- >>>- deep isAttributeRefTextListInterleave- )- ),---- 7.1.4. except in data pattern, the following paths are prohibited:--- data/except//(attribute | ref | text | list | group | interleave | oneOrMore | empty)- isRngData :->- ( ( deep isRngRelaxError- <+>- ( mkRelaxError $<< (getChangesAttr- &&&- ( listA (getChildren- >>>- deep isAttributeRefTextListGroupInterleaveOneOrMoreEmpty- >>>- (getName &&& getChangesAttr >>> arr2 (++))- )- >>>- arr (\n -> formatStringListPatt n ++- "Pattern not allowed as descendent(s) of a data/except-Pattern")- )- )- )- )- `when`- ( getChildren- >>>- isRngExcept- >>>- deep isAttributeRefTextListGroupInterleaveOneOrMoreEmpty- )- ),---- 7.1.5. start element, the following paths are prohibited:--- start//(attribute | data | value | text | list | group | interleave | oneOrMore | empty)- isRngStart :->- ( ( deep isRngRelaxError- <+>- ( mkRelaxError $<< (getChangesAttr- &&&- ( listA (getChildren- >>>- deep (checkElemName [ "attribute", "data", "value", "text", "list",- "group", "interleave", "oneOrMore", "empty"])- >>>- (getName &&& getChangesAttr >>> arr2 (++))- )- >>>- arr (\n -> formatStringListPatt n ++- "Pattern not allowed as descendent(s) of a start-Pattern")- )- )- )- )- `when`- ( getChildren- >>>- deep (checkElemName [ "attribute", "data", "value", "text", "list",- "group", "interleave", "oneOrMore", "empty"])- )- ),-- this :-> this- ]- ) `when` collectErrors----- ---------------------------------------------------------------restrictionsStep3 :: IOSArrow XmlTree XmlTree-restrictionsStep3- = processTopDown- ( ( deep isRngRelaxError- <+>- ( mkRelaxError "" $<- ( -- getRngAttrName- ( getChildren >>> isRngName >>> getChildren >>> getText )- >>>- arr (\ n -> ( "Content of element " ++ show n ++ " contains a pattern that can match " ++- "a child and a pattern that matches a single string"- )- )- )- )- )- `when`- ( isRngElement- >>>- ( getChildren >>. (take 1 . reverse) )- >>>- getContentType >>> isA (== CTNone)- )- ) `when` collectErrors----getContentType :: IOSArrow XmlTree ContentType-getContentType- = choiceA- [ isRngValue :-> (constA CTSimple)- , isRngData :-> processData- , isRngList :-> (constA CTSimple)- , isRngText :-> (constA CTComplex)- , isRngRef :-> (constA CTComplex)- , isRngEmpty :-> (constA CTEmpty)- , isRngAttribute :-> processAttribute- , isRngGroup :-> processGroup- , isRngInterleave :-> processInterleave- , isRngOneOrMore :-> processOneOrMore- , isRngChoice :-> processChoice- ]- where- processData :: IOSArrow XmlTree ContentType- processData- = ifA (neg (getChildren >>> isRngExcept))- (constA CTSimple)- ( getChildren- >>>- isRngExcept- >>>- getChildren- >>>- getContentType- >>>- ifP (/= CTNone) (constA CTSimple) (constA CTNone)- )- processAttribute :: IOSArrow XmlTree ContentType- processAttribute- = ifA ( lastChild- >>>- getContentType- >>>- isA (/= CTNone)- )- (constA CTEmpty)- (constA CTNone)-- processGroup :: IOSArrow XmlTree ContentType- processGroup- = get2ContentTypes- >>>- arr2 (\a b -> if isGroupable a b then max a b else CTNone)-- processInterleave :: IOSArrow XmlTree ContentType- processInterleave- = get2ContentTypes- >>>- arr2 (\a b -> if isGroupable a b then max a b else CTNone)-- processOneOrMore :: IOSArrow XmlTree ContentType- processOneOrMore- = ifA ( getChildren- >>>- getContentType >>> isA (/= CTNone)- >>>- isA (\t -> isGroupable t t)- )- ( getChildren >>> getContentType )- ( constA CTNone )-- processChoice :: IOSArrow XmlTree ContentType- processChoice- = get2ContentTypes- >>>- arr2 max-- isGroupable :: ContentType -> ContentType -> Bool- isGroupable CTEmpty _ = True- isGroupable _ CTEmpty = True- isGroupable CTComplex CTComplex = True- isGroupable _ _ = False---checkPattern :: IOSArrow (XmlTree, ([NameClass], [NameClass])) XmlTree-checkPattern- = (\ (_, (a, b)) -> isIn a b) `guardsP` (arr fst)- where- isIn :: [NameClass] -> [NameClass] -> Bool- isIn _ [] = False- isIn [] _ = False- isIn (x:xs) ys = (any (overlap x) ys) || isIn xs ys---occur :: String -> IOSArrow XmlTree XmlTree -> IOSArrow XmlTree XmlTree-occur name fct- = choiceA- [ ( isElem >>> hasRngName name )- :->- fct- , isChoiceGroupInterleaveOneOrMore- :->- (getChildren >>> occur name fct)- ]--get2ContentTypes :: IOSArrow XmlTree (ContentType, ContentType)-get2ContentTypes- = ( ( firstChild >>> getContentType )- &&&- ( lastChild >>> getContentType )- )---- ----------------------------------------------------------------- Duplicate attributes are not allowed. -> fertig--- Attributes using infinite name classes must be repeated; an attribute element that--- has an anyName or nsName descendant element must have a oneOrMore ancestor element. -> fertig---- berechnet alle define-Namen (fuer ref-Pattern) und Nameclasses der element-Pattern--restrictionsStep4 :: IOSArrow XmlTree XmlTree-restrictionsStep4- = ( restrictionsStep4' $<- listA ( deep isRngDefine -- get all defines- >>>- ( getRngAttrName -- get define name- &&&- ( single ( getChildren- >>>- getChildren- >>>- fromLA createNameClass -- compute the name class from 1. grandchild- )- `orElse`- (constA AnyName)- )- )- )- ) `when` collectErrors--restrictionsStep4' :: [(String, NameClass)] -> IOSArrow XmlTree XmlTree-restrictionsStep4' nc =- processTopDown (- (- ( deep isRngRelaxError- <+>- ( mkRelaxError "" $<- ( getRngAttrName- >>>- arr (\ n -> ( "Both attribute-pattern occuring in an " ++- show n ++ " belong to the same name-class"- )- )- )- )- )- `when`- ( (isRngGroup `orElse` isRngInterleave)- >>>- ( getChildren- &&&- ( firstChild- >>>- listA ( occur "attribute" (single getChildren)- >>>- fromLA createNameClass- )- )- &&&- ( lastChild- >>>- listA ( occur "attribute" (single getChildren)- >>>- fromLA createNameClass- )- )- )- >>> checkPattern- )- )- >>>- (- ( deep isRngRelaxError- <+>- ( mkRelaxError ""- ( "An attribute that has an anyName or nsName descendant element " ++- "must have a oneOrMore ancestor element"- )- )- )- `when`- (isRngElement >>> checkInfiniteAttribute)- )- >>>- ( ( deep isRngRelaxError- <+>- ( mkRelaxError ""- ( "Both element-pattern occuring in an interleave " ++- "belong to the same name-class"- )- )- )- `when`- ( isRngInterleave- >>>- ( getChildren- &&&- (firstChild >>> listA (occur "ref" this >>> getRngAttrName))- &&&- (lastChild >>> listA (occur "ref" this >>> getRngAttrName))- )- >>>- checkNames- )- )- >>>- ( ( deep isRngRelaxError- <+>- ( mkRelaxError "" "A text pattern must not occur in both children of an interleave" )- )- `when`- (isRngInterleave >>> checkText)- )- )- where- checkInfiniteAttribute :: IOSArrow XmlTree XmlTree- checkInfiniteAttribute- = getChildren- >>>- choiceA- [ isRngOneOrMore :-> none- , ( isRngAttribute- >>>- deep (isRngAnyName `orElse` isRngNsName)- ) :-> this- , this :-> checkInfiniteAttribute- ]-- checkNames :: IOSArrow (XmlTree, ([String], [String])) XmlTree- checkNames = (arr fst)- &&&- (arr (\(_, (a, _)) -> getNameClasses nc a))- &&&- (arr (\(_, (_, b)) -> getNameClasses nc b))- >>>- checkPattern- where- getNameClasses :: [(String, NameClass)] -> [String] -> [NameClass]- getNameClasses nc' l = map (\x -> fromJust $ lookup x nc') l-- checkText :: IOSArrow XmlTree XmlTree- checkText- = ( firstChild >>> occur "text" this )- `guards`- ( lastChild >>> occur "text" this )---- ---------------------------------------------------------------overlap :: NameClass -> NameClass -> Bool-overlap nc1 nc2- = any (bothContain nc1 nc2) (representatives nc1 ++ representatives nc2)--bothContain :: NameClass -> NameClass -> QName -> Bool-bothContain nc1 nc2 qn- = contains nc1 qn && contains nc2 qn--illegalLocalName :: LocalName-illegalLocalName = ""--illegalUri :: Uri-illegalUri = "\x1"--representatives :: NameClass -> [QName]-representatives AnyName- = [mkQName "" illegalLocalName illegalUri]--representatives (AnyNameExcept nc)- = (mkQName "" illegalLocalName illegalUri) : (representatives nc)--representatives (NsName ns)- = [mkQName "" illegalLocalName ns]--representatives (NsNameExcept ns nc)- = (mkQName "" illegalLocalName ns) : (representatives nc)--representatives (Name ns ln)- = [mkQName "" ln ns]--representatives (NameClassChoice nc1 nc2)- = (representatives nc1) ++ (representatives nc2)--representatives _- = []---- --------------------------------------------------------------------------------------------------------resetStates :: IOSArrow XmlTree XmlTree-resetStates- = ( perform (constA $ setParamInt "define_id" 0)- >>>- perform (constA [] >>> setParamList "elementTable" )- >>>- perform (constA $ setParamInt a_numberOfErrors 0)- )---getAllDeepDefines :: IOSArrow XmlTree Env-getAllDeepDefines- = listA $ deep isRngDefine- >>>- ( getRngAttrName &&& this )----- | Return all reachable defines from the start pattern--getRefsFromStartPattern :: IOSArrow XmlTree [String]-getRefsFromStartPattern- = listA- ( getChildren- >>>- isRngGrammar- >>>- getChildren- >>>- isRngStart- >>>- deep isRngRef- >>>- getRngAttrName- )--removeUnreachableDefines :: Env -> [String] -> [String] -> IOSArrow XmlTree XmlTree-removeUnreachableDefines allDefs processedDefs reachableDefs- = ifP (const $ unprocessedDefs /= [])- ( removeUnreachableDefines allDefs (nextTreeName : processedDefs) $< newReachableDefs )- ( processChildren $ -- root node- processChildren $ -- first grammar- ( none- `when`- ( isRngDefine- >>>- getRngAttrName- >>>- isA (\n -> not $ elem n reachableDefs)- )- )- )- where- unprocessedDefs :: [String]- unprocessedDefs- = reachableDefs \\ processedDefs-- newReachableDefs :: IOSArrow n [String]- newReachableDefs- = constA getTree- >>>- listA ( deep isRngRef- >>>- getRngAttrName- )- >>>- arr (noDoubles . (reachableDefs ++))-- getTree :: XmlTree- getTree- = fromJust $ lookup nextTreeName allDefs-- nextTreeName :: String- nextTreeName- = head unprocessedDefs----- ----------------------------------------------------------------------------------------------------------checkElemName :: [String] -> IOSArrow XmlTree XmlTree-checkElemName l- = ( isElem >>> getLocalPart >>> isA (\s -> elem s l) )- `guards`- this--wrapPattern2Two :: (ArrowXml a) => String -> a XmlTree XmlTree-wrapPattern2Two name- = choiceA- [ noOfChildren (> 2)- :-> ( replaceChildren ( (mkRngElement name none- (getChildren >>. take 2)- )- <+>- (getChildren >>. drop 2)- )- >>>- wrapPattern2Two name- )- , noOfChildren (== 1)- :-> getChildren- , this- :-> this- ]--mkRelaxError :: String -> String -> IOSArrow n XmlTree-mkRelaxError changesStr errStr- = perform (getAndSetCounter a_numberOfErrors)- >>>- mkRngRelaxError none none- >>>- addAttr "desc" errStr- >>>- ( addAttr "changes" changesStr- `whenP`- (const $ changesStr /= "")- )--collectErrors :: IOSArrow XmlTree XmlTree-collectErrors- = none- `when`- ( stopAfterFirstError- >>>- getParamInt 0 a_numberOfErrors >>> isA (>0)- )- where- stopAfterFirstError = getParamString a_do_not_collect_errors- >>>- isA (== "1")----- | Returns the list of simplification errors or 'none'-getErrors :: IOSArrow XmlTree XmlTree-getErrors = (getParamInt 0 a_numberOfErrors >>> isA (>0))- `guards`- (root [] [multi isRngRelaxError])--setChangesAttr :: String -> IOSArrow XmlTree XmlTree-setChangesAttr str- = ifA (hasAttr a_relaxSimplificationChanges)- ( processAttrl $- changeAttrValue (++ (", " ++ str))- `when`- (hasRngName a_relaxSimplificationChanges)- )- (mkAttr (mkName a_relaxSimplificationChanges) (txt str))---getChangesAttr :: IOSArrow XmlTree String-getChangesAttr- = getAttrValue a_relaxSimplificationChanges- &&&- getParamString a_output_changes- >>>- ifP (\(changes, param) -> changes /= "" && param == "1")- (arr2 $ \l _ -> " (" ++ l ++ ")")- (constA "")---getAndSetCounter :: String -> IOSArrow b String-getAndSetCounter name- = genNewId $< getParamInt 0 name- where- genNewId :: Int -> IOSArrow b String- genNewId i = setParamInt name (i+1) >>> constA (show i)----- ----------------------------------------------------------------------------------------------------------- | Creates the simple form of a Relax NG schema--- (see also: 'relaxOptions')--createSimpleForm :: Attributes -> Bool -> Bool -> Bool -> IOSArrow XmlTree XmlTree-createSimpleForm remainingOptions checkRestrictions validateExternalRef validateInclude- = traceMsg 2 ("createSimpleForm: " ++ show (remainingOptions, checkRestrictions,validateExternalRef, validateInclude))- >>>- ( if checkRestrictions- then createSimpleWithRest- else createSimpleWithoutRest- )- where-- createSimpleWithRest :: IOSArrow XmlTree XmlTree- createSimpleWithRest- = seqA $ concat [ simplificationPart1- , return $ traceDoc "relax NG: simplificationPart1 done"- , restrictionsPart1- , return $ traceDoc "relax NG: restrictionsPart1 done"- , simplificationPart2- , return $ traceDoc "relax NG simplificationPart2 done"- , restrictionsPart2- , return $ traceDoc "relax NG: restrictionsPart2 done"- , finalCleanUp- , return $ traceDoc "relax NG: finalCleanUp done"- ]-- createSimpleWithoutRest :: IOSArrow XmlTree XmlTree- createSimpleWithoutRest- = seqA $ concat [ simplificationPart1- , simplificationPart2- , finalCleanUp- ]- simplificationPart1 :: [IOSArrow XmlTree XmlTree]- simplificationPart1- = [ propagateNamespaces- , simplificationStep1- , simplificationStep2 remainingOptions validateExternalRef validateInclude [] []- , simplificationStep3- , simplificationStep4- ]-- simplificationPart2 :: [IOSArrow XmlTree XmlTree]- simplificationPart2- = [ simplificationStep5- , simplificationStep6- , simplificationStep7- , simplificationStep8- ]-- restrictionsPart1 :: [IOSArrow XmlTree XmlTree]- restrictionsPart1- = [ restrictionsStep1 ]-- restrictionsPart2 :: [IOSArrow XmlTree XmlTree]- restrictionsPart2- = [ restrictionsStep2- , restrictionsStep3- , restrictionsStep4- ]-- finalCleanUp :: [IOSArrow XmlTree XmlTree]- finalCleanUp- = [ cleanUp- , resetStates- ]-- cleanUp :: IOSArrow XmlTree XmlTree- cleanUp = processTopDown $- removeAttr a_relaxSimplificationChanges- >>>- removeAttr defineOrigName---- -------------------------------------------------------------------------------------------------------
− src/Text/XML/HXT/RelaxNG/Unicode/Blocks.hs
@@ -1,229 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.RelaxNG.Unicode.Blocks- Copyright : Copyright (C) 2005 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : experimental- Portability: portable- Version : $Id$-- Unicode Code Blocks-- don't edit this module- it's generated from 'http:\/\/www.unicode.org\/Public\/UNIDATA\/Blocks.txt'--}---- --------------------------------------------------------------module Text.XML.HXT.RelaxNG.Unicode.Blocks- ( codeBlocks )-where---- --------------------------------------------------------------codeBlocks :: [(String, (Char, Char))]-codeBlocks =- [ ( "BasicLatin", ( '\x0000', '\x007F') )- , ( "Latin-1Supplement", ( '\x0080', '\x00FF') )- , ( "LatinExtended-A", ( '\x0100', '\x017F') )- , ( "LatinExtended-B", ( '\x0180', '\x024F') )- , ( "IPAExtensions", ( '\x0250', '\x02AF') )- , ( "SpacingModifierLetters", ( '\x02B0', '\x02FF') )- , ( "CombiningDiacriticalMarks", ( '\x0300', '\x036F') )- , ( "GreekandCoptic", ( '\x0370', '\x03FF') )- , ( "Cyrillic", ( '\x0400', '\x04FF') )- , ( "CyrillicSupplement", ( '\x0500', '\x052F') )- , ( "Armenian", ( '\x0530', '\x058F') )- , ( "Hebrew", ( '\x0590', '\x05FF') )- , ( "Arabic", ( '\x0600', '\x06FF') )- , ( "Syriac", ( '\x0700', '\x074F') )- , ( "ArabicSupplement", ( '\x0750', '\x077F') )- , ( "Thaana", ( '\x0780', '\x07BF') )- , ( "NKo", ( '\x07C0', '\x07FF') )- , ( "Samaritan", ( '\x0800', '\x083F') )- , ( "Devanagari", ( '\x0900', '\x097F') )- , ( "Bengali", ( '\x0980', '\x09FF') )- , ( "Gurmukhi", ( '\x0A00', '\x0A7F') )- , ( "Gujarati", ( '\x0A80', '\x0AFF') )- , ( "Oriya", ( '\x0B00', '\x0B7F') )- , ( "Tamil", ( '\x0B80', '\x0BFF') )- , ( "Telugu", ( '\x0C00', '\x0C7F') )- , ( "Kannada", ( '\x0C80', '\x0CFF') )- , ( "Malayalam", ( '\x0D00', '\x0D7F') )- , ( "Sinhala", ( '\x0D80', '\x0DFF') )- , ( "Thai", ( '\x0E00', '\x0E7F') )- , ( "Lao", ( '\x0E80', '\x0EFF') )- , ( "Tibetan", ( '\x0F00', '\x0FFF') )- , ( "Myanmar", ( '\x1000', '\x109F') )- , ( "Georgian", ( '\x10A0', '\x10FF') )- , ( "HangulJamo", ( '\x1100', '\x11FF') )- , ( "Ethiopic", ( '\x1200', '\x137F') )- , ( "EthiopicSupplement", ( '\x1380', '\x139F') )- , ( "Cherokee", ( '\x13A0', '\x13FF') )- , ( "UnifiedCanadianAboriginalSyllabics", ( '\x1400', '\x167F') )- , ( "Ogham", ( '\x1680', '\x169F') )- , ( "Runic", ( '\x16A0', '\x16FF') )- , ( "Tagalog", ( '\x1700', '\x171F') )- , ( "Hanunoo", ( '\x1720', '\x173F') )- , ( "Buhid", ( '\x1740', '\x175F') )- , ( "Tagbanwa", ( '\x1760', '\x177F') )- , ( "Khmer", ( '\x1780', '\x17FF') )- , ( "Mongolian", ( '\x1800', '\x18AF') )- , ( "UnifiedCanadianAboriginalSyllabicsExtended", ( '\x18B0', '\x18FF') )- , ( "Limbu", ( '\x1900', '\x194F') )- , ( "TaiLe", ( '\x1950', '\x197F') )- , ( "NewTaiLue", ( '\x1980', '\x19DF') )- , ( "KhmerSymbols", ( '\x19E0', '\x19FF') )- , ( "Buginese", ( '\x1A00', '\x1A1F') )- , ( "TaiTham", ( '\x1A20', '\x1AAF') )- , ( "Balinese", ( '\x1B00', '\x1B7F') )- , ( "Sundanese", ( '\x1B80', '\x1BBF') )- , ( "Lepcha", ( '\x1C00', '\x1C4F') )- , ( "OlChiki", ( '\x1C50', '\x1C7F') )- , ( "VedicExtensions", ( '\x1CD0', '\x1CFF') )- , ( "PhoneticExtensions", ( '\x1D00', '\x1D7F') )- , ( "PhoneticExtensionsSupplement", ( '\x1D80', '\x1DBF') )- , ( "CombiningDiacriticalMarksSupplement", ( '\x1DC0', '\x1DFF') )- , ( "LatinExtendedAdditional", ( '\x1E00', '\x1EFF') )- , ( "GreekExtended", ( '\x1F00', '\x1FFF') )- , ( "GeneralPunctuation", ( '\x2000', '\x206F') )- , ( "SuperscriptsandSubscripts", ( '\x2070', '\x209F') )- , ( "CurrencySymbols", ( '\x20A0', '\x20CF') )- , ( "CombiningDiacriticalMarksforSymbols", ( '\x20D0', '\x20FF') )- , ( "LetterlikeSymbols", ( '\x2100', '\x214F') )- , ( "NumberForms", ( '\x2150', '\x218F') )- , ( "Arrows", ( '\x2190', '\x21FF') )- , ( "MathematicalOperators", ( '\x2200', '\x22FF') )- , ( "MiscellaneousTechnical", ( '\x2300', '\x23FF') )- , ( "ControlPictures", ( '\x2400', '\x243F') )- , ( "OpticalCharacterRecognition", ( '\x2440', '\x245F') )- , ( "EnclosedAlphanumerics", ( '\x2460', '\x24FF') )- , ( "BoxDrawing", ( '\x2500', '\x257F') )- , ( "BlockElements", ( '\x2580', '\x259F') )- , ( "GeometricShapes", ( '\x25A0', '\x25FF') )- , ( "MiscellaneousSymbols", ( '\x2600', '\x26FF') )- , ( "Dingbats", ( '\x2700', '\x27BF') )- , ( "MiscellaneousMathematicalSymbols-A", ( '\x27C0', '\x27EF') )- , ( "SupplementalArrows-A", ( '\x27F0', '\x27FF') )- , ( "BraillePatterns", ( '\x2800', '\x28FF') )- , ( "SupplementalArrows-B", ( '\x2900', '\x297F') )- , ( "MiscellaneousMathematicalSymbols-B", ( '\x2980', '\x29FF') )- , ( "SupplementalMathematicalOperators", ( '\x2A00', '\x2AFF') )- , ( "MiscellaneousSymbolsandArrows", ( '\x2B00', '\x2BFF') )- , ( "Glagolitic", ( '\x2C00', '\x2C5F') )- , ( "LatinExtended-C", ( '\x2C60', '\x2C7F') )- , ( "Coptic", ( '\x2C80', '\x2CFF') )- , ( "GeorgianSupplement", ( '\x2D00', '\x2D2F') )- , ( "Tifinagh", ( '\x2D30', '\x2D7F') )- , ( "EthiopicExtended", ( '\x2D80', '\x2DDF') )- , ( "CyrillicExtended-A", ( '\x2DE0', '\x2DFF') )- , ( "SupplementalPunctuation", ( '\x2E00', '\x2E7F') )- , ( "CJKRadicalsSupplement", ( '\x2E80', '\x2EFF') )- , ( "KangxiRadicals", ( '\x2F00', '\x2FDF') )- , ( "IdeographicDescriptionCharacters", ( '\x2FF0', '\x2FFF') )- , ( "CJKSymbolsandPunctuation", ( '\x3000', '\x303F') )- , ( "Hiragana", ( '\x3040', '\x309F') )- , ( "Katakana", ( '\x30A0', '\x30FF') )- , ( "Bopomofo", ( '\x3100', '\x312F') )- , ( "HangulCompatibilityJamo", ( '\x3130', '\x318F') )- , ( "Kanbun", ( '\x3190', '\x319F') )- , ( "BopomofoExtended", ( '\x31A0', '\x31BF') )- , ( "CJKStrokes", ( '\x31C0', '\x31EF') )- , ( "KatakanaPhoneticExtensions", ( '\x31F0', '\x31FF') )- , ( "EnclosedCJKLettersandMonths", ( '\x3200', '\x32FF') )- , ( "CJKCompatibility", ( '\x3300', '\x33FF') )- , ( "CJKUnifiedIdeographsExtensionA", ( '\x3400', '\x4DBF') )- , ( "YijingHexagramSymbols", ( '\x4DC0', '\x4DFF') )- , ( "CJKUnifiedIdeographs", ( '\x4E00', '\x9FFF') )- , ( "YiSyllables", ( '\xA000', '\xA48F') )- , ( "YiRadicals", ( '\xA490', '\xA4CF') )- , ( "Lisu", ( '\xA4D0', '\xA4FF') )- , ( "Vai", ( '\xA500', '\xA63F') )- , ( "CyrillicExtended-B", ( '\xA640', '\xA69F') )- , ( "Bamum", ( '\xA6A0', '\xA6FF') )- , ( "ModifierToneLetters", ( '\xA700', '\xA71F') )- , ( "LatinExtended-D", ( '\xA720', '\xA7FF') )- , ( "SylotiNagri", ( '\xA800', '\xA82F') )- , ( "CommonIndicNumberForms", ( '\xA830', '\xA83F') )- , ( "Phags-pa", ( '\xA840', '\xA87F') )- , ( "Saurashtra", ( '\xA880', '\xA8DF') )- , ( "DevanagariExtended", ( '\xA8E0', '\xA8FF') )- , ( "KayahLi", ( '\xA900', '\xA92F') )- , ( "Rejang", ( '\xA930', '\xA95F') )- , ( "HangulJamoExtended-A", ( '\xA960', '\xA97F') )- , ( "Javanese", ( '\xA980', '\xA9DF') )- , ( "Cham", ( '\xAA00', '\xAA5F') )- , ( "MyanmarExtended-A", ( '\xAA60', '\xAA7F') )- , ( "TaiViet", ( '\xAA80', '\xAADF') )- , ( "MeeteiMayek", ( '\xABC0', '\xABFF') )- , ( "HangulSyllables", ( '\xAC00', '\xD7AF') )- , ( "HangulJamoExtended-B", ( '\xD7B0', '\xD7FF') )- , ( "HighSurrogates", ( '\xD800', '\xDB7F') )- , ( "HighPrivateUseSurrogates", ( '\xDB80', '\xDBFF') )- , ( "LowSurrogates", ( '\xDC00', '\xDFFF') )- , ( "PrivateUseArea", ( '\xE000', '\xF8FF') )- , ( "CJKCompatibilityIdeographs", ( '\xF900', '\xFAFF') )- , ( "AlphabeticPresentationForms", ( '\xFB00', '\xFB4F') )- , ( "ArabicPresentationForms-A", ( '\xFB50', '\xFDFF') )- , ( "VariationSelectors", ( '\xFE00', '\xFE0F') )- , ( "VerticalForms", ( '\xFE10', '\xFE1F') )- , ( "CombiningHalfMarks", ( '\xFE20', '\xFE2F') )- , ( "CJKCompatibilityForms", ( '\xFE30', '\xFE4F') )- , ( "SmallFormVariants", ( '\xFE50', '\xFE6F') )- , ( "ArabicPresentationForms-B", ( '\xFE70', '\xFEFF') )- , ( "HalfwidthandFullwidthForms", ( '\xFF00', '\xFFEF') )- , ( "Specials", ( '\xFFF0', '\xFFFF') )- , ( "LinearBSyllabary", ( '\x10000', '\x1007F') )- , ( "LinearBIdeograms", ( '\x10080', '\x100FF') )- , ( "AegeanNumbers", ( '\x10100', '\x1013F') )- , ( "AncientGreekNumbers", ( '\x10140', '\x1018F') )- , ( "AncientSymbols", ( '\x10190', '\x101CF') )- , ( "PhaistosDisc", ( '\x101D0', '\x101FF') )- , ( "Lycian", ( '\x10280', '\x1029F') )- , ( "Carian", ( '\x102A0', '\x102DF') )- , ( "OldItalic", ( '\x10300', '\x1032F') )- , ( "Gothic", ( '\x10330', '\x1034F') )- , ( "Ugaritic", ( '\x10380', '\x1039F') )- , ( "OldPersian", ( '\x103A0', '\x103DF') )- , ( "Deseret", ( '\x10400', '\x1044F') )- , ( "Shavian", ( '\x10450', '\x1047F') )- , ( "Osmanya", ( '\x10480', '\x104AF') )- , ( "CypriotSyllabary", ( '\x10800', '\x1083F') )- , ( "ImperialAramaic", ( '\x10840', '\x1085F') )- , ( "Phoenician", ( '\x10900', '\x1091F') )- , ( "Lydian", ( '\x10920', '\x1093F') )- , ( "Kharoshthi", ( '\x10A00', '\x10A5F') )- , ( "OldSouthArabian", ( '\x10A60', '\x10A7F') )- , ( "Avestan", ( '\x10B00', '\x10B3F') )- , ( "InscriptionalParthian", ( '\x10B40', '\x10B5F') )- , ( "InscriptionalPahlavi", ( '\x10B60', '\x10B7F') )- , ( "OldTurkic", ( '\x10C00', '\x10C4F') )- , ( "RumiNumeralSymbols", ( '\x10E60', '\x10E7F') )- , ( "Kaithi", ( '\x11080', '\x110CF') )- , ( "Cuneiform", ( '\x12000', '\x123FF') )- , ( "CuneiformNumbersandPunctuation", ( '\x12400', '\x1247F') )- , ( "EgyptianHieroglyphs", ( '\x13000', '\x1342F') )- , ( "ByzantineMusicalSymbols", ( '\x1D000', '\x1D0FF') )- , ( "MusicalSymbols", ( '\x1D100', '\x1D1FF') )- , ( "AncientGreekMusicalNotation", ( '\x1D200', '\x1D24F') )- , ( "TaiXuanJingSymbols", ( '\x1D300', '\x1D35F') )- , ( "CountingRodNumerals", ( '\x1D360', '\x1D37F') )- , ( "MathematicalAlphanumericSymbols", ( '\x1D400', '\x1D7FF') )- , ( "MahjongTiles", ( '\x1F000', '\x1F02F') )- , ( "DominoTiles", ( '\x1F030', '\x1F09F') )- , ( "EnclosedAlphanumericSupplement", ( '\x1F100', '\x1F1FF') )- , ( "EnclosedIdeographicSupplement", ( '\x1F200', '\x1F2FF') )- , ( "CJKUnifiedIdeographsExtensionB", ( '\x20000', '\x2A6DF') )- , ( "CJKUnifiedIdeographsExtensionC", ( '\x2A700', '\x2B73F') )- , ( "CJKCompatibilityIdeographsSupplement", ( '\x2F800', '\x2FA1F') )- , ( "Tags", ( '\xE0000', '\xE007F') )- , ( "VariationSelectorsSupplement", ( '\xE0100', '\xE01EF') )- , ( "SupplementaryPrivateUseArea-A", ( '\xF0000', '\xFFFFF') )- , ( "SupplementaryPrivateUseArea-B", ( '\x100000', '\x10FFFF') )- ]---- -------------------------------------------------------------
− src/Text/XML/HXT/RelaxNG/Unicode/CharProps.hs
@@ -1,3945 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.RelaxNG.Unicode.CharProps- Copyright : Copyright (C) 2005 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : experimental- Portability: portable- Version : $Id$-- Unicode character properties-- don't edit this module- it's generated from 'http:\/\/www.unicode.org\/Public\/UNIDATA\/UnicodeData.txt'---}---- --------------------------------------------------------------module Text.XML.HXT.RelaxNG.Unicode.CharProps- ( isUnicodeC- , isUnicodeCc- , isUnicodeCf- , isUnicodeCo- , isUnicodeCs- , isUnicodeL- , isUnicodeLl- , isUnicodeLm- , isUnicodeLo- , isUnicodeLt- , isUnicodeLu- , isUnicodeM- , isUnicodeMc- , isUnicodeMe- , isUnicodeMn- , isUnicodeN- , isUnicodeNd- , isUnicodeNl- , isUnicodeNo- , isUnicodeP- , isUnicodePc- , isUnicodePd- , isUnicodePe- , isUnicodePf- , isUnicodePi- , isUnicodePo- , isUnicodePs- , isUnicodeS- , isUnicodeSc- , isUnicodeSk- , isUnicodeSm- , isUnicodeSo- , isUnicodeZ- , isUnicodeZl- , isUnicodeZp- , isUnicodeZs- )-where---- --------------------------------------------------------------isInList :: Char -> [(Char, Char)] -> Bool-isInList i =- foldr (\(lb, ub) b -> i >= lb && (i <= ub || b)) False---- --------------------------------------------------------------isUnicodeC :: Char -> Bool-isUnicodeC c- = isInList c- [ ('\NUL','\US')- , ('\DEL','\159')- , ('\173','\173')- , ('\1536','\1539')- , ('\1757','\1757')- , ('\1807','\1807')- , ('\6068','\6069')- , ('\8203','\8207')- , ('\8234','\8238')- , ('\8288','\8292')- , ('\8298','\8303')- , ('\55296','\55296')- , ('\56191','\56192')- , ('\56319','\56320')- , ('\57343','\57344')- , ('\63743','\63743')- , ('\65279','\65279')- , ('\65529','\65531')- , ('\69821','\69821')- , ('\119155','\119162')- , ('\917505','\917505')- , ('\917536','\917631')- , ('\983040','\983040')- , ('\1048573','\1048573')- , ('\1048576','\1048576')- , ('\1114109','\1114109')- ]---- --------------------------------------------------------------isUnicodeCc :: Char -> Bool-isUnicodeCc c- = isInList c- [ ('\NUL','\US')- , ('\DEL','\159')- ]---- --------------------------------------------------------------isUnicodeCf :: Char -> Bool-isUnicodeCf c- = isInList c- [ ('\173','\173')- , ('\1536','\1539')- , ('\1757','\1757')- , ('\1807','\1807')- , ('\6068','\6069')- , ('\8203','\8207')- , ('\8234','\8238')- , ('\8288','\8292')- , ('\8298','\8303')- , ('\65279','\65279')- , ('\65529','\65531')- , ('\69821','\69821')- , ('\119155','\119162')- , ('\917505','\917505')- , ('\917536','\917631')- ]---- --------------------------------------------------------------isUnicodeCo :: Char -> Bool-isUnicodeCo c- = isInList c- [ ('\57344','\57344')- , ('\63743','\63743')- , ('\983040','\983040')- , ('\1048573','\1048573')- , ('\1048576','\1048576')- , ('\1114109','\1114109')- ]---- --------------------------------------------------------------isUnicodeCs :: Char -> Bool-isUnicodeCs c- = isInList c- [ ('\55296','\55296')- , ('\56191','\56192')- , ('\56319','\56320')- , ('\57343','\57343')- ]---- --------------------------------------------------------------isUnicodeL :: Char -> Bool-isUnicodeL c- = isInList c- [ ('A','Z')- , ('a','z')- , ('\170','\170')- , ('\181','\181')- , ('\186','\186')- , ('\192','\214')- , ('\216','\246')- , ('\248','\705')- , ('\710','\721')- , ('\736','\740')- , ('\748','\748')- , ('\750','\750')- , ('\880','\884')- , ('\886','\887')- , ('\890','\893')- , ('\902','\902')- , ('\904','\906')- , ('\908','\908')- , ('\910','\929')- , ('\931','\1013')- , ('\1015','\1153')- , ('\1162','\1317')- , ('\1329','\1366')- , ('\1369','\1369')- , ('\1377','\1415')- , ('\1488','\1514')- , ('\1520','\1522')- , ('\1569','\1610')- , ('\1646','\1647')- , ('\1649','\1747')- , ('\1749','\1749')- , ('\1765','\1766')- , ('\1774','\1775')- , ('\1786','\1788')- , ('\1791','\1791')- , ('\1808','\1808')- , ('\1810','\1839')- , ('\1869','\1957')- , ('\1969','\1969')- , ('\1994','\2026')- , ('\2036','\2037')- , ('\2042','\2042')- , ('\2048','\2069')- , ('\2074','\2074')- , ('\2084','\2084')- , ('\2088','\2088')- , ('\2308','\2361')- , ('\2365','\2365')- , ('\2384','\2384')- , ('\2392','\2401')- , ('\2417','\2418')- , ('\2425','\2431')- , ('\2437','\2444')- , ('\2447','\2448')- , ('\2451','\2472')- , ('\2474','\2480')- , ('\2482','\2482')- , ('\2486','\2489')- , ('\2493','\2493')- , ('\2510','\2510')- , ('\2524','\2525')- , ('\2527','\2529')- , ('\2544','\2545')- , ('\2565','\2570')- , ('\2575','\2576')- , ('\2579','\2600')- , ('\2602','\2608')- , ('\2610','\2611')- , ('\2613','\2614')- , ('\2616','\2617')- , ('\2649','\2652')- , ('\2654','\2654')- , ('\2674','\2676')- , ('\2693','\2701')- , ('\2703','\2705')- , ('\2707','\2728')- , ('\2730','\2736')- , ('\2738','\2739')- , ('\2741','\2745')- , ('\2749','\2749')- , ('\2768','\2768')- , ('\2784','\2785')- , ('\2821','\2828')- , ('\2831','\2832')- , ('\2835','\2856')- , ('\2858','\2864')- , ('\2866','\2867')- , ('\2869','\2873')- , ('\2877','\2877')- , ('\2908','\2909')- , ('\2911','\2913')- , ('\2929','\2929')- , ('\2947','\2947')- , ('\2949','\2954')- , ('\2958','\2960')- , ('\2962','\2965')- , ('\2969','\2970')- , ('\2972','\2972')- , ('\2974','\2975')- , ('\2979','\2980')- , ('\2984','\2986')- , ('\2990','\3001')- , ('\3024','\3024')- , ('\3077','\3084')- , ('\3086','\3088')- , ('\3090','\3112')- , ('\3114','\3123')- , ('\3125','\3129')- , ('\3133','\3133')- , ('\3160','\3161')- , ('\3168','\3169')- , ('\3205','\3212')- , ('\3214','\3216')- , ('\3218','\3240')- , ('\3242','\3251')- , ('\3253','\3257')- , ('\3261','\3261')- , ('\3294','\3294')- , ('\3296','\3297')- , ('\3333','\3340')- , ('\3342','\3344')- , ('\3346','\3368')- , ('\3370','\3385')- , ('\3389','\3389')- , ('\3424','\3425')- , ('\3450','\3455')- , ('\3461','\3478')- , ('\3482','\3505')- , ('\3507','\3515')- , ('\3517','\3517')- , ('\3520','\3526')- , ('\3585','\3632')- , ('\3634','\3635')- , ('\3648','\3654')- , ('\3713','\3714')- , ('\3716','\3716')- , ('\3719','\3720')- , ('\3722','\3722')- , ('\3725','\3725')- , ('\3732','\3735')- , ('\3737','\3743')- , ('\3745','\3747')- , ('\3749','\3749')- , ('\3751','\3751')- , ('\3754','\3755')- , ('\3757','\3760')- , ('\3762','\3763')- , ('\3773','\3773')- , ('\3776','\3780')- , ('\3782','\3782')- , ('\3804','\3805')- , ('\3840','\3840')- , ('\3904','\3911')- , ('\3913','\3948')- , ('\3976','\3979')- , ('\4096','\4138')- , ('\4159','\4159')- , ('\4176','\4181')- , ('\4186','\4189')- , ('\4193','\4193')- , ('\4197','\4198')- , ('\4206','\4208')- , ('\4213','\4225')- , ('\4238','\4238')- , ('\4256','\4293')- , ('\4304','\4346')- , ('\4348','\4348')- , ('\4352','\4680')- , ('\4682','\4685')- , ('\4688','\4694')- , ('\4696','\4696')- , ('\4698','\4701')- , ('\4704','\4744')- , ('\4746','\4749')- , ('\4752','\4784')- , ('\4786','\4789')- , ('\4792','\4798')- , ('\4800','\4800')- , ('\4802','\4805')- , ('\4808','\4822')- , ('\4824','\4880')- , ('\4882','\4885')- , ('\4888','\4954')- , ('\4992','\5007')- , ('\5024','\5108')- , ('\5121','\5740')- , ('\5743','\5759')- , ('\5761','\5786')- , ('\5792','\5866')- , ('\5888','\5900')- , ('\5902','\5905')- , ('\5920','\5937')- , ('\5952','\5969')- , ('\5984','\5996')- , ('\5998','\6000')- , ('\6016','\6067')- , ('\6103','\6103')- , ('\6108','\6108')- , ('\6176','\6263')- , ('\6272','\6312')- , ('\6314','\6314')- , ('\6320','\6389')- , ('\6400','\6428')- , ('\6480','\6509')- , ('\6512','\6516')- , ('\6528','\6571')- , ('\6593','\6599')- , ('\6656','\6678')- , ('\6688','\6740')- , ('\6823','\6823')- , ('\6917','\6963')- , ('\6981','\6987')- , ('\7043','\7072')- , ('\7086','\7087')- , ('\7168','\7203')- , ('\7245','\7247')- , ('\7258','\7293')- , ('\7401','\7404')- , ('\7406','\7409')- , ('\7424','\7615')- , ('\7680','\7957')- , ('\7960','\7965')- , ('\7968','\8005')- , ('\8008','\8013')- , ('\8016','\8023')- , ('\8025','\8025')- , ('\8027','\8027')- , ('\8029','\8029')- , ('\8031','\8061')- , ('\8064','\8116')- , ('\8118','\8124')- , ('\8126','\8126')- , ('\8130','\8132')- , ('\8134','\8140')- , ('\8144','\8147')- , ('\8150','\8155')- , ('\8160','\8172')- , ('\8178','\8180')- , ('\8182','\8188')- , ('\8305','\8305')- , ('\8319','\8319')- , ('\8336','\8340')- , ('\8450','\8450')- , ('\8455','\8455')- , ('\8458','\8467')- , ('\8469','\8469')- , ('\8473','\8477')- , ('\8484','\8484')- , ('\8486','\8486')- , ('\8488','\8488')- , ('\8490','\8493')- , ('\8495','\8505')- , ('\8508','\8511')- , ('\8517','\8521')- , ('\8526','\8526')- , ('\8579','\8580')- , ('\11264','\11310')- , ('\11312','\11358')- , ('\11360','\11492')- , ('\11499','\11502')- , ('\11520','\11557')- , ('\11568','\11621')- , ('\11631','\11631')- , ('\11648','\11670')- , ('\11680','\11686')- , ('\11688','\11694')- , ('\11696','\11702')- , ('\11704','\11710')- , ('\11712','\11718')- , ('\11720','\11726')- , ('\11728','\11734')- , ('\11736','\11742')- , ('\11823','\11823')- , ('\12293','\12294')- , ('\12337','\12341')- , ('\12347','\12348')- , ('\12353','\12438')- , ('\12445','\12447')- , ('\12449','\12538')- , ('\12540','\12543')- , ('\12549','\12589')- , ('\12593','\12686')- , ('\12704','\12727')- , ('\12784','\12799')- , ('\13312','\13312')- , ('\19893','\19893')- , ('\19968','\19968')- , ('\40907','\40907')- , ('\40960','\42124')- , ('\42192','\42237')- , ('\42240','\42508')- , ('\42512','\42527')- , ('\42538','\42539')- , ('\42560','\42591')- , ('\42594','\42606')- , ('\42623','\42647')- , ('\42656','\42725')- , ('\42775','\42783')- , ('\42786','\42888')- , ('\42891','\42892')- , ('\43003','\43009')- , ('\43011','\43013')- , ('\43015','\43018')- , ('\43020','\43042')- , ('\43072','\43123')- , ('\43138','\43187')- , ('\43250','\43255')- , ('\43259','\43259')- , ('\43274','\43301')- , ('\43312','\43334')- , ('\43360','\43388')- , ('\43396','\43442')- , ('\43471','\43471')- , ('\43520','\43560')- , ('\43584','\43586')- , ('\43588','\43595')- , ('\43616','\43638')- , ('\43642','\43642')- , ('\43648','\43695')- , ('\43697','\43697')- , ('\43701','\43702')- , ('\43705','\43709')- , ('\43712','\43712')- , ('\43714','\43714')- , ('\43739','\43741')- , ('\43968','\44002')- , ('\44032','\44032')- , ('\55203','\55203')- , ('\55216','\55238')- , ('\55243','\55291')- , ('\63744','\64045')- , ('\64048','\64109')- , ('\64112','\64217')- , ('\64256','\64262')- , ('\64275','\64279')- , ('\64285','\64285')- , ('\64287','\64296')- , ('\64298','\64310')- , ('\64312','\64316')- , ('\64318','\64318')- , ('\64320','\64321')- , ('\64323','\64324')- , ('\64326','\64433')- , ('\64467','\64829')- , ('\64848','\64911')- , ('\64914','\64967')- , ('\65008','\65019')- , ('\65136','\65140')- , ('\65142','\65276')- , ('\65313','\65338')- , ('\65345','\65370')- , ('\65382','\65470')- , ('\65474','\65479')- , ('\65482','\65487')- , ('\65490','\65495')- , ('\65498','\65500')- , ('\65536','\65547')- , ('\65549','\65574')- , ('\65576','\65594')- , ('\65596','\65597')- , ('\65599','\65613')- , ('\65616','\65629')- , ('\65664','\65786')- , ('\66176','\66204')- , ('\66208','\66256')- , ('\66304','\66334')- , ('\66352','\66368')- , ('\66370','\66377')- , ('\66432','\66461')- , ('\66464','\66499')- , ('\66504','\66511')- , ('\66560','\66717')- , ('\67584','\67589')- , ('\67592','\67592')- , ('\67594','\67637')- , ('\67639','\67640')- , ('\67644','\67644')- , ('\67647','\67669')- , ('\67840','\67861')- , ('\67872','\67897')- , ('\68096','\68096')- , ('\68112','\68115')- , ('\68117','\68119')- , ('\68121','\68147')- , ('\68192','\68220')- , ('\68352','\68405')- , ('\68416','\68437')- , ('\68448','\68466')- , ('\68608','\68680')- , ('\69763','\69807')- , ('\73728','\74606')- , ('\77824','\78894')- , ('\119808','\119892')- , ('\119894','\119964')- , ('\119966','\119967')- , ('\119970','\119970')- , ('\119973','\119974')- , ('\119977','\119980')- , ('\119982','\119993')- , ('\119995','\119995')- , ('\119997','\120003')- , ('\120005','\120069')- , ('\120071','\120074')- , ('\120077','\120084')- , ('\120086','\120092')- , ('\120094','\120121')- , ('\120123','\120126')- , ('\120128','\120132')- , ('\120134','\120134')- , ('\120138','\120144')- , ('\120146','\120485')- , ('\120488','\120512')- , ('\120514','\120538')- , ('\120540','\120570')- , ('\120572','\120596')- , ('\120598','\120628')- , ('\120630','\120654')- , ('\120656','\120686')- , ('\120688','\120712')- , ('\120714','\120744')- , ('\120746','\120770')- , ('\120772','\120779')- , ('\131072','\131072')- , ('\173782','\173782')- , ('\173824','\173824')- , ('\177972','\177972')- , ('\194560','\195101')- ]---- --------------------------------------------------------------isUnicodeLl :: Char -> Bool-isUnicodeLl c- = isInList c- [ ('a','z')- , ('\170','\170')- , ('\181','\181')- , ('\186','\186')- , ('\223','\246')- , ('\248','\255')- , ('\257','\257')- , ('\259','\259')- , ('\261','\261')- , ('\263','\263')- , ('\265','\265')- , ('\267','\267')- , ('\269','\269')- , ('\271','\271')- , ('\273','\273')- , ('\275','\275')- , ('\277','\277')- , ('\279','\279')- , ('\281','\281')- , ('\283','\283')- , ('\285','\285')- , ('\287','\287')- , ('\289','\289')- , ('\291','\291')- , ('\293','\293')- , ('\295','\295')- , ('\297','\297')- , ('\299','\299')- , ('\301','\301')- , ('\303','\303')- , ('\305','\305')- , ('\307','\307')- , ('\309','\309')- , ('\311','\312')- , ('\314','\314')- , ('\316','\316')- , ('\318','\318')- , ('\320','\320')- , ('\322','\322')- , ('\324','\324')- , ('\326','\326')- , ('\328','\329')- , ('\331','\331')- , ('\333','\333')- , ('\335','\335')- , ('\337','\337')- , ('\339','\339')- , ('\341','\341')- , ('\343','\343')- , ('\345','\345')- , ('\347','\347')- , ('\349','\349')- , ('\351','\351')- , ('\353','\353')- , ('\355','\355')- , ('\357','\357')- , ('\359','\359')- , ('\361','\361')- , ('\363','\363')- , ('\365','\365')- , ('\367','\367')- , ('\369','\369')- , ('\371','\371')- , ('\373','\373')- , ('\375','\375')- , ('\378','\378')- , ('\380','\380')- , ('\382','\384')- , ('\387','\387')- , ('\389','\389')- , ('\392','\392')- , ('\396','\397')- , ('\402','\402')- , ('\405','\405')- , ('\409','\411')- , ('\414','\414')- , ('\417','\417')- , ('\419','\419')- , ('\421','\421')- , ('\424','\424')- , ('\426','\427')- , ('\429','\429')- , ('\432','\432')- , ('\436','\436')- , ('\438','\438')- , ('\441','\442')- , ('\445','\447')- , ('\454','\454')- , ('\457','\457')- , ('\460','\460')- , ('\462','\462')- , ('\464','\464')- , ('\466','\466')- , ('\468','\468')- , ('\470','\470')- , ('\472','\472')- , ('\474','\474')- , ('\476','\477')- , ('\479','\479')- , ('\481','\481')- , ('\483','\483')- , ('\485','\485')- , ('\487','\487')- , ('\489','\489')- , ('\491','\491')- , ('\493','\493')- , ('\495','\496')- , ('\499','\499')- , ('\501','\501')- , ('\505','\505')- , ('\507','\507')- , ('\509','\509')- , ('\511','\511')- , ('\513','\513')- , ('\515','\515')- , ('\517','\517')- , ('\519','\519')- , ('\521','\521')- , ('\523','\523')- , ('\525','\525')- , ('\527','\527')- , ('\529','\529')- , ('\531','\531')- , ('\533','\533')- , ('\535','\535')- , ('\537','\537')- , ('\539','\539')- , ('\541','\541')- , ('\543','\543')- , ('\545','\545')- , ('\547','\547')- , ('\549','\549')- , ('\551','\551')- , ('\553','\553')- , ('\555','\555')- , ('\557','\557')- , ('\559','\559')- , ('\561','\561')- , ('\563','\569')- , ('\572','\572')- , ('\575','\576')- , ('\578','\578')- , ('\583','\583')- , ('\585','\585')- , ('\587','\587')- , ('\589','\589')- , ('\591','\659')- , ('\661','\687')- , ('\881','\881')- , ('\883','\883')- , ('\887','\887')- , ('\891','\893')- , ('\912','\912')- , ('\940','\974')- , ('\976','\977')- , ('\981','\983')- , ('\985','\985')- , ('\987','\987')- , ('\989','\989')- , ('\991','\991')- , ('\993','\993')- , ('\995','\995')- , ('\997','\997')- , ('\999','\999')- , ('\1001','\1001')- , ('\1003','\1003')- , ('\1005','\1005')- , ('\1007','\1011')- , ('\1013','\1013')- , ('\1016','\1016')- , ('\1019','\1020')- , ('\1072','\1119')- , ('\1121','\1121')- , ('\1123','\1123')- , ('\1125','\1125')- , ('\1127','\1127')- , ('\1129','\1129')- , ('\1131','\1131')- , ('\1133','\1133')- , ('\1135','\1135')- , ('\1137','\1137')- , ('\1139','\1139')- , ('\1141','\1141')- , ('\1143','\1143')- , ('\1145','\1145')- , ('\1147','\1147')- , ('\1149','\1149')- , ('\1151','\1151')- , ('\1153','\1153')- , ('\1163','\1163')- , ('\1165','\1165')- , ('\1167','\1167')- , ('\1169','\1169')- , ('\1171','\1171')- , ('\1173','\1173')- , ('\1175','\1175')- , ('\1177','\1177')- , ('\1179','\1179')- , ('\1181','\1181')- , ('\1183','\1183')- , ('\1185','\1185')- , ('\1187','\1187')- , ('\1189','\1189')- , ('\1191','\1191')- , ('\1193','\1193')- , ('\1195','\1195')- , ('\1197','\1197')- , ('\1199','\1199')- , ('\1201','\1201')- , ('\1203','\1203')- , ('\1205','\1205')- , ('\1207','\1207')- , ('\1209','\1209')- , ('\1211','\1211')- , ('\1213','\1213')- , ('\1215','\1215')- , ('\1218','\1218')- , ('\1220','\1220')- , ('\1222','\1222')- , ('\1224','\1224')- , ('\1226','\1226')- , ('\1228','\1228')- , ('\1230','\1231')- , ('\1233','\1233')- , ('\1235','\1235')- , ('\1237','\1237')- , ('\1239','\1239')- , ('\1241','\1241')- , ('\1243','\1243')- , ('\1245','\1245')- , ('\1247','\1247')- , ('\1249','\1249')- , ('\1251','\1251')- , ('\1253','\1253')- , ('\1255','\1255')- , ('\1257','\1257')- , ('\1259','\1259')- , ('\1261','\1261')- , ('\1263','\1263')- , ('\1265','\1265')- , ('\1267','\1267')- , ('\1269','\1269')- , ('\1271','\1271')- , ('\1273','\1273')- , ('\1275','\1275')- , ('\1277','\1277')- , ('\1279','\1279')- , ('\1281','\1281')- , ('\1283','\1283')- , ('\1285','\1285')- , ('\1287','\1287')- , ('\1289','\1289')- , ('\1291','\1291')- , ('\1293','\1293')- , ('\1295','\1295')- , ('\1297','\1297')- , ('\1299','\1299')- , ('\1301','\1301')- , ('\1303','\1303')- , ('\1305','\1305')- , ('\1307','\1307')- , ('\1309','\1309')- , ('\1311','\1311')- , ('\1313','\1313')- , ('\1315','\1315')- , ('\1317','\1317')- , ('\1377','\1415')- , ('\7424','\7467')- , ('\7522','\7543')- , ('\7545','\7578')- , ('\7681','\7681')- , ('\7683','\7683')- , ('\7685','\7685')- , ('\7687','\7687')- , ('\7689','\7689')- , ('\7691','\7691')- , ('\7693','\7693')- , ('\7695','\7695')- , ('\7697','\7697')- , ('\7699','\7699')- , ('\7701','\7701')- , ('\7703','\7703')- , ('\7705','\7705')- , ('\7707','\7707')- , ('\7709','\7709')- , ('\7711','\7711')- , ('\7713','\7713')- , ('\7715','\7715')- , ('\7717','\7717')- , ('\7719','\7719')- , ('\7721','\7721')- , ('\7723','\7723')- , ('\7725','\7725')- , ('\7727','\7727')- , ('\7729','\7729')- , ('\7731','\7731')- , ('\7733','\7733')- , ('\7735','\7735')- , ('\7737','\7737')- , ('\7739','\7739')- , ('\7741','\7741')- , ('\7743','\7743')- , ('\7745','\7745')- , ('\7747','\7747')- , ('\7749','\7749')- , ('\7751','\7751')- , ('\7753','\7753')- , ('\7755','\7755')- , ('\7757','\7757')- , ('\7759','\7759')- , ('\7761','\7761')- , ('\7763','\7763')- , ('\7765','\7765')- , ('\7767','\7767')- , ('\7769','\7769')- , ('\7771','\7771')- , ('\7773','\7773')- , ('\7775','\7775')- , ('\7777','\7777')- , ('\7779','\7779')- , ('\7781','\7781')- , ('\7783','\7783')- , ('\7785','\7785')- , ('\7787','\7787')- , ('\7789','\7789')- , ('\7791','\7791')- , ('\7793','\7793')- , ('\7795','\7795')- , ('\7797','\7797')- , ('\7799','\7799')- , ('\7801','\7801')- , ('\7803','\7803')- , ('\7805','\7805')- , ('\7807','\7807')- , ('\7809','\7809')- , ('\7811','\7811')- , ('\7813','\7813')- , ('\7815','\7815')- , ('\7817','\7817')- , ('\7819','\7819')- , ('\7821','\7821')- , ('\7823','\7823')- , ('\7825','\7825')- , ('\7827','\7827')- , ('\7829','\7837')- , ('\7839','\7839')- , ('\7841','\7841')- , ('\7843','\7843')- , ('\7845','\7845')- , ('\7847','\7847')- , ('\7849','\7849')- , ('\7851','\7851')- , ('\7853','\7853')- , ('\7855','\7855')- , ('\7857','\7857')- , ('\7859','\7859')- , ('\7861','\7861')- , ('\7863','\7863')- , ('\7865','\7865')- , ('\7867','\7867')- , ('\7869','\7869')- , ('\7871','\7871')- , ('\7873','\7873')- , ('\7875','\7875')- , ('\7877','\7877')- , ('\7879','\7879')- , ('\7881','\7881')- , ('\7883','\7883')- , ('\7885','\7885')- , ('\7887','\7887')- , ('\7889','\7889')- , ('\7891','\7891')- , ('\7893','\7893')- , ('\7895','\7895')- , ('\7897','\7897')- , ('\7899','\7899')- , ('\7901','\7901')- , ('\7903','\7903')- , ('\7905','\7905')- , ('\7907','\7907')- , ('\7909','\7909')- , ('\7911','\7911')- , ('\7913','\7913')- , ('\7915','\7915')- , ('\7917','\7917')- , ('\7919','\7919')- , ('\7921','\7921')- , ('\7923','\7923')- , ('\7925','\7925')- , ('\7927','\7927')- , ('\7929','\7929')- , ('\7931','\7931')- , ('\7933','\7933')- , ('\7935','\7943')- , ('\7952','\7957')- , ('\7968','\7975')- , ('\7984','\7991')- , ('\8000','\8005')- , ('\8016','\8023')- , ('\8032','\8039')- , ('\8048','\8061')- , ('\8064','\8071')- , ('\8080','\8087')- , ('\8096','\8103')- , ('\8112','\8116')- , ('\8118','\8119')- , ('\8126','\8126')- , ('\8130','\8132')- , ('\8134','\8135')- , ('\8144','\8147')- , ('\8150','\8151')- , ('\8160','\8167')- , ('\8178','\8180')- , ('\8182','\8183')- , ('\8458','\8458')- , ('\8462','\8463')- , ('\8467','\8467')- , ('\8495','\8495')- , ('\8500','\8500')- , ('\8505','\8505')- , ('\8508','\8509')- , ('\8518','\8521')- , ('\8526','\8526')- , ('\8580','\8580')- , ('\11312','\11358')- , ('\11361','\11361')- , ('\11365','\11366')- , ('\11368','\11368')- , ('\11370','\11370')- , ('\11372','\11372')- , ('\11377','\11377')- , ('\11379','\11380')- , ('\11382','\11388')- , ('\11393','\11393')- , ('\11395','\11395')- , ('\11397','\11397')- , ('\11399','\11399')- , ('\11401','\11401')- , ('\11403','\11403')- , ('\11405','\11405')- , ('\11407','\11407')- , ('\11409','\11409')- , ('\11411','\11411')- , ('\11413','\11413')- , ('\11415','\11415')- , ('\11417','\11417')- , ('\11419','\11419')- , ('\11421','\11421')- , ('\11423','\11423')- , ('\11425','\11425')- , ('\11427','\11427')- , ('\11429','\11429')- , ('\11431','\11431')- , ('\11433','\11433')- , ('\11435','\11435')- , ('\11437','\11437')- , ('\11439','\11439')- , ('\11441','\11441')- , ('\11443','\11443')- , ('\11445','\11445')- , ('\11447','\11447')- , ('\11449','\11449')- , ('\11451','\11451')- , ('\11453','\11453')- , ('\11455','\11455')- , ('\11457','\11457')- , ('\11459','\11459')- , ('\11461','\11461')- , ('\11463','\11463')- , ('\11465','\11465')- , ('\11467','\11467')- , ('\11469','\11469')- , ('\11471','\11471')- , ('\11473','\11473')- , ('\11475','\11475')- , ('\11477','\11477')- , ('\11479','\11479')- , ('\11481','\11481')- , ('\11483','\11483')- , ('\11485','\11485')- , ('\11487','\11487')- , ('\11489','\11489')- , ('\11491','\11492')- , ('\11500','\11500')- , ('\11502','\11502')- , ('\11520','\11557')- , ('\42561','\42561')- , ('\42563','\42563')- , ('\42565','\42565')- , ('\42567','\42567')- , ('\42569','\42569')- , ('\42571','\42571')- , ('\42573','\42573')- , ('\42575','\42575')- , ('\42577','\42577')- , ('\42579','\42579')- , ('\42581','\42581')- , ('\42583','\42583')- , ('\42585','\42585')- , ('\42587','\42587')- , ('\42589','\42589')- , ('\42591','\42591')- , ('\42595','\42595')- , ('\42597','\42597')- , ('\42599','\42599')- , ('\42601','\42601')- , ('\42603','\42603')- , ('\42605','\42605')- , ('\42625','\42625')- , ('\42627','\42627')- , ('\42629','\42629')- , ('\42631','\42631')- , ('\42633','\42633')- , ('\42635','\42635')- , ('\42637','\42637')- , ('\42639','\42639')- , ('\42641','\42641')- , ('\42643','\42643')- , ('\42645','\42645')- , ('\42647','\42647')- , ('\42787','\42787')- , ('\42789','\42789')- , ('\42791','\42791')- , ('\42793','\42793')- , ('\42795','\42795')- , ('\42797','\42797')- , ('\42799','\42801')- , ('\42803','\42803')- , ('\42805','\42805')- , ('\42807','\42807')- , ('\42809','\42809')- , ('\42811','\42811')- , ('\42813','\42813')- , ('\42815','\42815')- , ('\42817','\42817')- , ('\42819','\42819')- , ('\42821','\42821')- , ('\42823','\42823')- , ('\42825','\42825')- , ('\42827','\42827')- , ('\42829','\42829')- , ('\42831','\42831')- , ('\42833','\42833')- , ('\42835','\42835')- , ('\42837','\42837')- , ('\42839','\42839')- , ('\42841','\42841')- , ('\42843','\42843')- , ('\42845','\42845')- , ('\42847','\42847')- , ('\42849','\42849')- , ('\42851','\42851')- , ('\42853','\42853')- , ('\42855','\42855')- , ('\42857','\42857')- , ('\42859','\42859')- , ('\42861','\42861')- , ('\42863','\42863')- , ('\42865','\42872')- , ('\42874','\42874')- , ('\42876','\42876')- , ('\42879','\42879')- , ('\42881','\42881')- , ('\42883','\42883')- , ('\42885','\42885')- , ('\42887','\42887')- , ('\42892','\42892')- , ('\64256','\64262')- , ('\64275','\64279')- , ('\65345','\65370')- , ('\66600','\66639')- , ('\119834','\119859')- , ('\119886','\119892')- , ('\119894','\119911')- , ('\119938','\119963')- , ('\119990','\119993')- , ('\119995','\119995')- , ('\119997','\120003')- , ('\120005','\120015')- , ('\120042','\120067')- , ('\120094','\120119')- , ('\120146','\120171')- , ('\120198','\120223')- , ('\120250','\120275')- , ('\120302','\120327')- , ('\120354','\120379')- , ('\120406','\120431')- , ('\120458','\120485')- , ('\120514','\120538')- , ('\120540','\120545')- , ('\120572','\120596')- , ('\120598','\120603')- , ('\120630','\120654')- , ('\120656','\120661')- , ('\120688','\120712')- , ('\120714','\120719')- , ('\120746','\120770')- , ('\120772','\120777')- , ('\120779','\120779')- ]---- --------------------------------------------------------------isUnicodeLm :: Char -> Bool-isUnicodeLm c- = isInList c- [ ('\688','\705')- , ('\710','\721')- , ('\736','\740')- , ('\748','\748')- , ('\750','\750')- , ('\884','\884')- , ('\890','\890')- , ('\1369','\1369')- , ('\1600','\1600')- , ('\1765','\1766')- , ('\2036','\2037')- , ('\2042','\2042')- , ('\2074','\2074')- , ('\2084','\2084')- , ('\2088','\2088')- , ('\2417','\2417')- , ('\3654','\3654')- , ('\3782','\3782')- , ('\4348','\4348')- , ('\6103','\6103')- , ('\6211','\6211')- , ('\6823','\6823')- , ('\7288','\7293')- , ('\7468','\7521')- , ('\7544','\7544')- , ('\7579','\7615')- , ('\8305','\8305')- , ('\8319','\8319')- , ('\8336','\8340')- , ('\11389','\11389')- , ('\11631','\11631')- , ('\11823','\11823')- , ('\12293','\12293')- , ('\12337','\12341')- , ('\12347','\12347')- , ('\12445','\12446')- , ('\12540','\12542')- , ('\40981','\40981')- , ('\42232','\42237')- , ('\42508','\42508')- , ('\42623','\42623')- , ('\42775','\42783')- , ('\42864','\42864')- , ('\42888','\42888')- , ('\43471','\43471')- , ('\43632','\43632')- , ('\43741','\43741')- , ('\65392','\65392')- , ('\65438','\65439')- ]---- --------------------------------------------------------------isUnicodeLo :: Char -> Bool-isUnicodeLo c- = isInList c- [ ('\443','\443')- , ('\448','\451')- , ('\660','\660')- , ('\1488','\1514')- , ('\1520','\1522')- , ('\1569','\1599')- , ('\1601','\1610')- , ('\1646','\1647')- , ('\1649','\1747')- , ('\1749','\1749')- , ('\1774','\1775')- , ('\1786','\1788')- , ('\1791','\1791')- , ('\1808','\1808')- , ('\1810','\1839')- , ('\1869','\1957')- , ('\1969','\1969')- , ('\1994','\2026')- , ('\2048','\2069')- , ('\2308','\2361')- , ('\2365','\2365')- , ('\2384','\2384')- , ('\2392','\2401')- , ('\2418','\2418')- , ('\2425','\2431')- , ('\2437','\2444')- , ('\2447','\2448')- , ('\2451','\2472')- , ('\2474','\2480')- , ('\2482','\2482')- , ('\2486','\2489')- , ('\2493','\2493')- , ('\2510','\2510')- , ('\2524','\2525')- , ('\2527','\2529')- , ('\2544','\2545')- , ('\2565','\2570')- , ('\2575','\2576')- , ('\2579','\2600')- , ('\2602','\2608')- , ('\2610','\2611')- , ('\2613','\2614')- , ('\2616','\2617')- , ('\2649','\2652')- , ('\2654','\2654')- , ('\2674','\2676')- , ('\2693','\2701')- , ('\2703','\2705')- , ('\2707','\2728')- , ('\2730','\2736')- , ('\2738','\2739')- , ('\2741','\2745')- , ('\2749','\2749')- , ('\2768','\2768')- , ('\2784','\2785')- , ('\2821','\2828')- , ('\2831','\2832')- , ('\2835','\2856')- , ('\2858','\2864')- , ('\2866','\2867')- , ('\2869','\2873')- , ('\2877','\2877')- , ('\2908','\2909')- , ('\2911','\2913')- , ('\2929','\2929')- , ('\2947','\2947')- , ('\2949','\2954')- , ('\2958','\2960')- , ('\2962','\2965')- , ('\2969','\2970')- , ('\2972','\2972')- , ('\2974','\2975')- , ('\2979','\2980')- , ('\2984','\2986')- , ('\2990','\3001')- , ('\3024','\3024')- , ('\3077','\3084')- , ('\3086','\3088')- , ('\3090','\3112')- , ('\3114','\3123')- , ('\3125','\3129')- , ('\3133','\3133')- , ('\3160','\3161')- , ('\3168','\3169')- , ('\3205','\3212')- , ('\3214','\3216')- , ('\3218','\3240')- , ('\3242','\3251')- , ('\3253','\3257')- , ('\3261','\3261')- , ('\3294','\3294')- , ('\3296','\3297')- , ('\3333','\3340')- , ('\3342','\3344')- , ('\3346','\3368')- , ('\3370','\3385')- , ('\3389','\3389')- , ('\3424','\3425')- , ('\3450','\3455')- , ('\3461','\3478')- , ('\3482','\3505')- , ('\3507','\3515')- , ('\3517','\3517')- , ('\3520','\3526')- , ('\3585','\3632')- , ('\3634','\3635')- , ('\3648','\3653')- , ('\3713','\3714')- , ('\3716','\3716')- , ('\3719','\3720')- , ('\3722','\3722')- , ('\3725','\3725')- , ('\3732','\3735')- , ('\3737','\3743')- , ('\3745','\3747')- , ('\3749','\3749')- , ('\3751','\3751')- , ('\3754','\3755')- , ('\3757','\3760')- , ('\3762','\3763')- , ('\3773','\3773')- , ('\3776','\3780')- , ('\3804','\3805')- , ('\3840','\3840')- , ('\3904','\3911')- , ('\3913','\3948')- , ('\3976','\3979')- , ('\4096','\4138')- , ('\4159','\4159')- , ('\4176','\4181')- , ('\4186','\4189')- , ('\4193','\4193')- , ('\4197','\4198')- , ('\4206','\4208')- , ('\4213','\4225')- , ('\4238','\4238')- , ('\4304','\4346')- , ('\4352','\4680')- , ('\4682','\4685')- , ('\4688','\4694')- , ('\4696','\4696')- , ('\4698','\4701')- , ('\4704','\4744')- , ('\4746','\4749')- , ('\4752','\4784')- , ('\4786','\4789')- , ('\4792','\4798')- , ('\4800','\4800')- , ('\4802','\4805')- , ('\4808','\4822')- , ('\4824','\4880')- , ('\4882','\4885')- , ('\4888','\4954')- , ('\4992','\5007')- , ('\5024','\5108')- , ('\5121','\5740')- , ('\5743','\5759')- , ('\5761','\5786')- , ('\5792','\5866')- , ('\5888','\5900')- , ('\5902','\5905')- , ('\5920','\5937')- , ('\5952','\5969')- , ('\5984','\5996')- , ('\5998','\6000')- , ('\6016','\6067')- , ('\6108','\6108')- , ('\6176','\6210')- , ('\6212','\6263')- , ('\6272','\6312')- , ('\6314','\6314')- , ('\6320','\6389')- , ('\6400','\6428')- , ('\6480','\6509')- , ('\6512','\6516')- , ('\6528','\6571')- , ('\6593','\6599')- , ('\6656','\6678')- , ('\6688','\6740')- , ('\6917','\6963')- , ('\6981','\6987')- , ('\7043','\7072')- , ('\7086','\7087')- , ('\7168','\7203')- , ('\7245','\7247')- , ('\7258','\7287')- , ('\7401','\7404')- , ('\7406','\7409')- , ('\8501','\8504')- , ('\11568','\11621')- , ('\11648','\11670')- , ('\11680','\11686')- , ('\11688','\11694')- , ('\11696','\11702')- , ('\11704','\11710')- , ('\11712','\11718')- , ('\11720','\11726')- , ('\11728','\11734')- , ('\11736','\11742')- , ('\12294','\12294')- , ('\12348','\12348')- , ('\12353','\12438')- , ('\12447','\12447')- , ('\12449','\12538')- , ('\12543','\12543')- , ('\12549','\12589')- , ('\12593','\12686')- , ('\12704','\12727')- , ('\12784','\12799')- , ('\13312','\13312')- , ('\19893','\19893')- , ('\19968','\19968')- , ('\40907','\40907')- , ('\40960','\40980')- , ('\40982','\42124')- , ('\42192','\42231')- , ('\42240','\42507')- , ('\42512','\42527')- , ('\42538','\42539')- , ('\42606','\42606')- , ('\42656','\42725')- , ('\43003','\43009')- , ('\43011','\43013')- , ('\43015','\43018')- , ('\43020','\43042')- , ('\43072','\43123')- , ('\43138','\43187')- , ('\43250','\43255')- , ('\43259','\43259')- , ('\43274','\43301')- , ('\43312','\43334')- , ('\43360','\43388')- , ('\43396','\43442')- , ('\43520','\43560')- , ('\43584','\43586')- , ('\43588','\43595')- , ('\43616','\43631')- , ('\43633','\43638')- , ('\43642','\43642')- , ('\43648','\43695')- , ('\43697','\43697')- , ('\43701','\43702')- , ('\43705','\43709')- , ('\43712','\43712')- , ('\43714','\43714')- , ('\43739','\43740')- , ('\43968','\44002')- , ('\44032','\44032')- , ('\55203','\55203')- , ('\55216','\55238')- , ('\55243','\55291')- , ('\63744','\64045')- , ('\64048','\64109')- , ('\64112','\64217')- , ('\64285','\64285')- , ('\64287','\64296')- , ('\64298','\64310')- , ('\64312','\64316')- , ('\64318','\64318')- , ('\64320','\64321')- , ('\64323','\64324')- , ('\64326','\64433')- , ('\64467','\64829')- , ('\64848','\64911')- , ('\64914','\64967')- , ('\65008','\65019')- , ('\65136','\65140')- , ('\65142','\65276')- , ('\65382','\65391')- , ('\65393','\65437')- , ('\65440','\65470')- , ('\65474','\65479')- , ('\65482','\65487')- , ('\65490','\65495')- , ('\65498','\65500')- , ('\65536','\65547')- , ('\65549','\65574')- , ('\65576','\65594')- , ('\65596','\65597')- , ('\65599','\65613')- , ('\65616','\65629')- , ('\65664','\65786')- , ('\66176','\66204')- , ('\66208','\66256')- , ('\66304','\66334')- , ('\66352','\66368')- , ('\66370','\66377')- , ('\66432','\66461')- , ('\66464','\66499')- , ('\66504','\66511')- , ('\66640','\66717')- , ('\67584','\67589')- , ('\67592','\67592')- , ('\67594','\67637')- , ('\67639','\67640')- , ('\67644','\67644')- , ('\67647','\67669')- , ('\67840','\67861')- , ('\67872','\67897')- , ('\68096','\68096')- , ('\68112','\68115')- , ('\68117','\68119')- , ('\68121','\68147')- , ('\68192','\68220')- , ('\68352','\68405')- , ('\68416','\68437')- , ('\68448','\68466')- , ('\68608','\68680')- , ('\69763','\69807')- , ('\73728','\74606')- , ('\77824','\78894')- , ('\131072','\131072')- , ('\173782','\173782')- , ('\173824','\173824')- , ('\177972','\177972')- , ('\194560','\195101')- ]---- --------------------------------------------------------------isUnicodeLt :: Char -> Bool-isUnicodeLt c- = isInList c- [ ('\453','\453')- , ('\456','\456')- , ('\459','\459')- , ('\498','\498')- , ('\8072','\8079')- , ('\8088','\8095')- , ('\8104','\8111')- , ('\8124','\8124')- , ('\8140','\8140')- , ('\8188','\8188')- ]---- --------------------------------------------------------------isUnicodeLu :: Char -> Bool-isUnicodeLu c- = isInList c- [ ('A','Z')- , ('\192','\214')- , ('\216','\222')- , ('\256','\256')- , ('\258','\258')- , ('\260','\260')- , ('\262','\262')- , ('\264','\264')- , ('\266','\266')- , ('\268','\268')- , ('\270','\270')- , ('\272','\272')- , ('\274','\274')- , ('\276','\276')- , ('\278','\278')- , ('\280','\280')- , ('\282','\282')- , ('\284','\284')- , ('\286','\286')- , ('\288','\288')- , ('\290','\290')- , ('\292','\292')- , ('\294','\294')- , ('\296','\296')- , ('\298','\298')- , ('\300','\300')- , ('\302','\302')- , ('\304','\304')- , ('\306','\306')- , ('\308','\308')- , ('\310','\310')- , ('\313','\313')- , ('\315','\315')- , ('\317','\317')- , ('\319','\319')- , ('\321','\321')- , ('\323','\323')- , ('\325','\325')- , ('\327','\327')- , ('\330','\330')- , ('\332','\332')- , ('\334','\334')- , ('\336','\336')- , ('\338','\338')- , ('\340','\340')- , ('\342','\342')- , ('\344','\344')- , ('\346','\346')- , ('\348','\348')- , ('\350','\350')- , ('\352','\352')- , ('\354','\354')- , ('\356','\356')- , ('\358','\358')- , ('\360','\360')- , ('\362','\362')- , ('\364','\364')- , ('\366','\366')- , ('\368','\368')- , ('\370','\370')- , ('\372','\372')- , ('\374','\374')- , ('\376','\377')- , ('\379','\379')- , ('\381','\381')- , ('\385','\386')- , ('\388','\388')- , ('\390','\391')- , ('\393','\395')- , ('\398','\401')- , ('\403','\404')- , ('\406','\408')- , ('\412','\413')- , ('\415','\416')- , ('\418','\418')- , ('\420','\420')- , ('\422','\423')- , ('\425','\425')- , ('\428','\428')- , ('\430','\431')- , ('\433','\435')- , ('\437','\437')- , ('\439','\440')- , ('\444','\444')- , ('\452','\452')- , ('\455','\455')- , ('\458','\458')- , ('\461','\461')- , ('\463','\463')- , ('\465','\465')- , ('\467','\467')- , ('\469','\469')- , ('\471','\471')- , ('\473','\473')- , ('\475','\475')- , ('\478','\478')- , ('\480','\480')- , ('\482','\482')- , ('\484','\484')- , ('\486','\486')- , ('\488','\488')- , ('\490','\490')- , ('\492','\492')- , ('\494','\494')- , ('\497','\497')- , ('\500','\500')- , ('\502','\504')- , ('\506','\506')- , ('\508','\508')- , ('\510','\510')- , ('\512','\512')- , ('\514','\514')- , ('\516','\516')- , ('\518','\518')- , ('\520','\520')- , ('\522','\522')- , ('\524','\524')- , ('\526','\526')- , ('\528','\528')- , ('\530','\530')- , ('\532','\532')- , ('\534','\534')- , ('\536','\536')- , ('\538','\538')- , ('\540','\540')- , ('\542','\542')- , ('\544','\544')- , ('\546','\546')- , ('\548','\548')- , ('\550','\550')- , ('\552','\552')- , ('\554','\554')- , ('\556','\556')- , ('\558','\558')- , ('\560','\560')- , ('\562','\562')- , ('\570','\571')- , ('\573','\574')- , ('\577','\577')- , ('\579','\582')- , ('\584','\584')- , ('\586','\586')- , ('\588','\588')- , ('\590','\590')- , ('\880','\880')- , ('\882','\882')- , ('\886','\886')- , ('\902','\902')- , ('\904','\906')- , ('\908','\908')- , ('\910','\911')- , ('\913','\929')- , ('\931','\939')- , ('\975','\975')- , ('\978','\980')- , ('\984','\984')- , ('\986','\986')- , ('\988','\988')- , ('\990','\990')- , ('\992','\992')- , ('\994','\994')- , ('\996','\996')- , ('\998','\998')- , ('\1000','\1000')- , ('\1002','\1002')- , ('\1004','\1004')- , ('\1006','\1006')- , ('\1012','\1012')- , ('\1015','\1015')- , ('\1017','\1018')- , ('\1021','\1071')- , ('\1120','\1120')- , ('\1122','\1122')- , ('\1124','\1124')- , ('\1126','\1126')- , ('\1128','\1128')- , ('\1130','\1130')- , ('\1132','\1132')- , ('\1134','\1134')- , ('\1136','\1136')- , ('\1138','\1138')- , ('\1140','\1140')- , ('\1142','\1142')- , ('\1144','\1144')- , ('\1146','\1146')- , ('\1148','\1148')- , ('\1150','\1150')- , ('\1152','\1152')- , ('\1162','\1162')- , ('\1164','\1164')- , ('\1166','\1166')- , ('\1168','\1168')- , ('\1170','\1170')- , ('\1172','\1172')- , ('\1174','\1174')- , ('\1176','\1176')- , ('\1178','\1178')- , ('\1180','\1180')- , ('\1182','\1182')- , ('\1184','\1184')- , ('\1186','\1186')- , ('\1188','\1188')- , ('\1190','\1190')- , ('\1192','\1192')- , ('\1194','\1194')- , ('\1196','\1196')- , ('\1198','\1198')- , ('\1200','\1200')- , ('\1202','\1202')- , ('\1204','\1204')- , ('\1206','\1206')- , ('\1208','\1208')- , ('\1210','\1210')- , ('\1212','\1212')- , ('\1214','\1214')- , ('\1216','\1217')- , ('\1219','\1219')- , ('\1221','\1221')- , ('\1223','\1223')- , ('\1225','\1225')- , ('\1227','\1227')- , ('\1229','\1229')- , ('\1232','\1232')- , ('\1234','\1234')- , ('\1236','\1236')- , ('\1238','\1238')- , ('\1240','\1240')- , ('\1242','\1242')- , ('\1244','\1244')- , ('\1246','\1246')- , ('\1248','\1248')- , ('\1250','\1250')- , ('\1252','\1252')- , ('\1254','\1254')- , ('\1256','\1256')- , ('\1258','\1258')- , ('\1260','\1260')- , ('\1262','\1262')- , ('\1264','\1264')- , ('\1266','\1266')- , ('\1268','\1268')- , ('\1270','\1270')- , ('\1272','\1272')- , ('\1274','\1274')- , ('\1276','\1276')- , ('\1278','\1278')- , ('\1280','\1280')- , ('\1282','\1282')- , ('\1284','\1284')- , ('\1286','\1286')- , ('\1288','\1288')- , ('\1290','\1290')- , ('\1292','\1292')- , ('\1294','\1294')- , ('\1296','\1296')- , ('\1298','\1298')- , ('\1300','\1300')- , ('\1302','\1302')- , ('\1304','\1304')- , ('\1306','\1306')- , ('\1308','\1308')- , ('\1310','\1310')- , ('\1312','\1312')- , ('\1314','\1314')- , ('\1316','\1316')- , ('\1329','\1366')- , ('\4256','\4293')- , ('\7680','\7680')- , ('\7682','\7682')- , ('\7684','\7684')- , ('\7686','\7686')- , ('\7688','\7688')- , ('\7690','\7690')- , ('\7692','\7692')- , ('\7694','\7694')- , ('\7696','\7696')- , ('\7698','\7698')- , ('\7700','\7700')- , ('\7702','\7702')- , ('\7704','\7704')- , ('\7706','\7706')- , ('\7708','\7708')- , ('\7710','\7710')- , ('\7712','\7712')- , ('\7714','\7714')- , ('\7716','\7716')- , ('\7718','\7718')- , ('\7720','\7720')- , ('\7722','\7722')- , ('\7724','\7724')- , ('\7726','\7726')- , ('\7728','\7728')- , ('\7730','\7730')- , ('\7732','\7732')- , ('\7734','\7734')- , ('\7736','\7736')- , ('\7738','\7738')- , ('\7740','\7740')- , ('\7742','\7742')- , ('\7744','\7744')- , ('\7746','\7746')- , ('\7748','\7748')- , ('\7750','\7750')- , ('\7752','\7752')- , ('\7754','\7754')- , ('\7756','\7756')- , ('\7758','\7758')- , ('\7760','\7760')- , ('\7762','\7762')- , ('\7764','\7764')- , ('\7766','\7766')- , ('\7768','\7768')- , ('\7770','\7770')- , ('\7772','\7772')- , ('\7774','\7774')- , ('\7776','\7776')- , ('\7778','\7778')- , ('\7780','\7780')- , ('\7782','\7782')- , ('\7784','\7784')- , ('\7786','\7786')- , ('\7788','\7788')- , ('\7790','\7790')- , ('\7792','\7792')- , ('\7794','\7794')- , ('\7796','\7796')- , ('\7798','\7798')- , ('\7800','\7800')- , ('\7802','\7802')- , ('\7804','\7804')- , ('\7806','\7806')- , ('\7808','\7808')- , ('\7810','\7810')- , ('\7812','\7812')- , ('\7814','\7814')- , ('\7816','\7816')- , ('\7818','\7818')- , ('\7820','\7820')- , ('\7822','\7822')- , ('\7824','\7824')- , ('\7826','\7826')- , ('\7828','\7828')- , ('\7838','\7838')- , ('\7840','\7840')- , ('\7842','\7842')- , ('\7844','\7844')- , ('\7846','\7846')- , ('\7848','\7848')- , ('\7850','\7850')- , ('\7852','\7852')- , ('\7854','\7854')- , ('\7856','\7856')- , ('\7858','\7858')- , ('\7860','\7860')- , ('\7862','\7862')- , ('\7864','\7864')- , ('\7866','\7866')- , ('\7868','\7868')- , ('\7870','\7870')- , ('\7872','\7872')- , ('\7874','\7874')- , ('\7876','\7876')- , ('\7878','\7878')- , ('\7880','\7880')- , ('\7882','\7882')- , ('\7884','\7884')- , ('\7886','\7886')- , ('\7888','\7888')- , ('\7890','\7890')- , ('\7892','\7892')- , ('\7894','\7894')- , ('\7896','\7896')- , ('\7898','\7898')- , ('\7900','\7900')- , ('\7902','\7902')- , ('\7904','\7904')- , ('\7906','\7906')- , ('\7908','\7908')- , ('\7910','\7910')- , ('\7912','\7912')- , ('\7914','\7914')- , ('\7916','\7916')- , ('\7918','\7918')- , ('\7920','\7920')- , ('\7922','\7922')- , ('\7924','\7924')- , ('\7926','\7926')- , ('\7928','\7928')- , ('\7930','\7930')- , ('\7932','\7932')- , ('\7934','\7934')- , ('\7944','\7951')- , ('\7960','\7965')- , ('\7976','\7983')- , ('\7992','\7999')- , ('\8008','\8013')- , ('\8025','\8025')- , ('\8027','\8027')- , ('\8029','\8029')- , ('\8031','\8031')- , ('\8040','\8047')- , ('\8120','\8123')- , ('\8136','\8139')- , ('\8152','\8155')- , ('\8168','\8172')- , ('\8184','\8187')- , ('\8450','\8450')- , ('\8455','\8455')- , ('\8459','\8461')- , ('\8464','\8466')- , ('\8469','\8469')- , ('\8473','\8477')- , ('\8484','\8484')- , ('\8486','\8486')- , ('\8488','\8488')- , ('\8490','\8493')- , ('\8496','\8499')- , ('\8510','\8511')- , ('\8517','\8517')- , ('\8579','\8579')- , ('\11264','\11310')- , ('\11360','\11360')- , ('\11362','\11364')- , ('\11367','\11367')- , ('\11369','\11369')- , ('\11371','\11371')- , ('\11373','\11376')- , ('\11378','\11378')- , ('\11381','\11381')- , ('\11390','\11392')- , ('\11394','\11394')- , ('\11396','\11396')- , ('\11398','\11398')- , ('\11400','\11400')- , ('\11402','\11402')- , ('\11404','\11404')- , ('\11406','\11406')- , ('\11408','\11408')- , ('\11410','\11410')- , ('\11412','\11412')- , ('\11414','\11414')- , ('\11416','\11416')- , ('\11418','\11418')- , ('\11420','\11420')- , ('\11422','\11422')- , ('\11424','\11424')- , ('\11426','\11426')- , ('\11428','\11428')- , ('\11430','\11430')- , ('\11432','\11432')- , ('\11434','\11434')- , ('\11436','\11436')- , ('\11438','\11438')- , ('\11440','\11440')- , ('\11442','\11442')- , ('\11444','\11444')- , ('\11446','\11446')- , ('\11448','\11448')- , ('\11450','\11450')- , ('\11452','\11452')- , ('\11454','\11454')- , ('\11456','\11456')- , ('\11458','\11458')- , ('\11460','\11460')- , ('\11462','\11462')- , ('\11464','\11464')- , ('\11466','\11466')- , ('\11468','\11468')- , ('\11470','\11470')- , ('\11472','\11472')- , ('\11474','\11474')- , ('\11476','\11476')- , ('\11478','\11478')- , ('\11480','\11480')- , ('\11482','\11482')- , ('\11484','\11484')- , ('\11486','\11486')- , ('\11488','\11488')- , ('\11490','\11490')- , ('\11499','\11499')- , ('\11501','\11501')- , ('\42560','\42560')- , ('\42562','\42562')- , ('\42564','\42564')- , ('\42566','\42566')- , ('\42568','\42568')- , ('\42570','\42570')- , ('\42572','\42572')- , ('\42574','\42574')- , ('\42576','\42576')- , ('\42578','\42578')- , ('\42580','\42580')- , ('\42582','\42582')- , ('\42584','\42584')- , ('\42586','\42586')- , ('\42588','\42588')- , ('\42590','\42590')- , ('\42594','\42594')- , ('\42596','\42596')- , ('\42598','\42598')- , ('\42600','\42600')- , ('\42602','\42602')- , ('\42604','\42604')- , ('\42624','\42624')- , ('\42626','\42626')- , ('\42628','\42628')- , ('\42630','\42630')- , ('\42632','\42632')- , ('\42634','\42634')- , ('\42636','\42636')- , ('\42638','\42638')- , ('\42640','\42640')- , ('\42642','\42642')- , ('\42644','\42644')- , ('\42646','\42646')- , ('\42786','\42786')- , ('\42788','\42788')- , ('\42790','\42790')- , ('\42792','\42792')- , ('\42794','\42794')- , ('\42796','\42796')- , ('\42798','\42798')- , ('\42802','\42802')- , ('\42804','\42804')- , ('\42806','\42806')- , ('\42808','\42808')- , ('\42810','\42810')- , ('\42812','\42812')- , ('\42814','\42814')- , ('\42816','\42816')- , ('\42818','\42818')- , ('\42820','\42820')- , ('\42822','\42822')- , ('\42824','\42824')- , ('\42826','\42826')- , ('\42828','\42828')- , ('\42830','\42830')- , ('\42832','\42832')- , ('\42834','\42834')- , ('\42836','\42836')- , ('\42838','\42838')- , ('\42840','\42840')- , ('\42842','\42842')- , ('\42844','\42844')- , ('\42846','\42846')- , ('\42848','\42848')- , ('\42850','\42850')- , ('\42852','\42852')- , ('\42854','\42854')- , ('\42856','\42856')- , ('\42858','\42858')- , ('\42860','\42860')- , ('\42862','\42862')- , ('\42873','\42873')- , ('\42875','\42875')- , ('\42877','\42878')- , ('\42880','\42880')- , ('\42882','\42882')- , ('\42884','\42884')- , ('\42886','\42886')- , ('\42891','\42891')- , ('\65313','\65338')- , ('\66560','\66599')- , ('\119808','\119833')- , ('\119860','\119885')- , ('\119912','\119937')- , ('\119964','\119964')- , ('\119966','\119967')- , ('\119970','\119970')- , ('\119973','\119974')- , ('\119977','\119980')- , ('\119982','\119989')- , ('\120016','\120041')- , ('\120068','\120069')- , ('\120071','\120074')- , ('\120077','\120084')- , ('\120086','\120092')- , ('\120120','\120121')- , ('\120123','\120126')- , ('\120128','\120132')- , ('\120134','\120134')- , ('\120138','\120144')- , ('\120172','\120197')- , ('\120224','\120249')- , ('\120276','\120301')- , ('\120328','\120353')- , ('\120380','\120405')- , ('\120432','\120457')- , ('\120488','\120512')- , ('\120546','\120570')- , ('\120604','\120628')- , ('\120662','\120686')- , ('\120720','\120744')- , ('\120778','\120778')- ]---- --------------------------------------------------------------isUnicodeM :: Char -> Bool-isUnicodeM c- = isInList c- [ ('\768','\879')- , ('\1155','\1161')- , ('\1425','\1469')- , ('\1471','\1471')- , ('\1473','\1474')- , ('\1476','\1477')- , ('\1479','\1479')- , ('\1552','\1562')- , ('\1611','\1630')- , ('\1648','\1648')- , ('\1750','\1756')- , ('\1758','\1764')- , ('\1767','\1768')- , ('\1770','\1773')- , ('\1809','\1809')- , ('\1840','\1866')- , ('\1958','\1968')- , ('\2027','\2035')- , ('\2070','\2073')- , ('\2075','\2083')- , ('\2085','\2087')- , ('\2089','\2093')- , ('\2304','\2307')- , ('\2364','\2364')- , ('\2366','\2382')- , ('\2385','\2389')- , ('\2402','\2403')- , ('\2433','\2435')- , ('\2492','\2492')- , ('\2494','\2500')- , ('\2503','\2504')- , ('\2507','\2509')- , ('\2519','\2519')- , ('\2530','\2531')- , ('\2561','\2563')- , ('\2620','\2620')- , ('\2622','\2626')- , ('\2631','\2632')- , ('\2635','\2637')- , ('\2641','\2641')- , ('\2672','\2673')- , ('\2677','\2677')- , ('\2689','\2691')- , ('\2748','\2748')- , ('\2750','\2757')- , ('\2759','\2761')- , ('\2763','\2765')- , ('\2786','\2787')- , ('\2817','\2819')- , ('\2876','\2876')- , ('\2878','\2884')- , ('\2887','\2888')- , ('\2891','\2893')- , ('\2902','\2903')- , ('\2914','\2915')- , ('\2946','\2946')- , ('\3006','\3010')- , ('\3014','\3016')- , ('\3018','\3021')- , ('\3031','\3031')- , ('\3073','\3075')- , ('\3134','\3140')- , ('\3142','\3144')- , ('\3146','\3149')- , ('\3157','\3158')- , ('\3170','\3171')- , ('\3202','\3203')- , ('\3260','\3260')- , ('\3262','\3268')- , ('\3270','\3272')- , ('\3274','\3277')- , ('\3285','\3286')- , ('\3298','\3299')- , ('\3330','\3331')- , ('\3390','\3396')- , ('\3398','\3400')- , ('\3402','\3405')- , ('\3415','\3415')- , ('\3426','\3427')- , ('\3458','\3459')- , ('\3530','\3530')- , ('\3535','\3540')- , ('\3542','\3542')- , ('\3544','\3551')- , ('\3570','\3571')- , ('\3633','\3633')- , ('\3636','\3642')- , ('\3655','\3662')- , ('\3761','\3761')- , ('\3764','\3769')- , ('\3771','\3772')- , ('\3784','\3789')- , ('\3864','\3865')- , ('\3893','\3893')- , ('\3895','\3895')- , ('\3897','\3897')- , ('\3902','\3903')- , ('\3953','\3972')- , ('\3974','\3975')- , ('\3984','\3991')- , ('\3993','\4028')- , ('\4038','\4038')- , ('\4139','\4158')- , ('\4182','\4185')- , ('\4190','\4192')- , ('\4194','\4196')- , ('\4199','\4205')- , ('\4209','\4212')- , ('\4226','\4237')- , ('\4239','\4239')- , ('\4250','\4253')- , ('\4959','\4959')- , ('\5906','\5908')- , ('\5938','\5940')- , ('\5970','\5971')- , ('\6002','\6003')- , ('\6070','\6099')- , ('\6109','\6109')- , ('\6155','\6157')- , ('\6313','\6313')- , ('\6432','\6443')- , ('\6448','\6459')- , ('\6576','\6592')- , ('\6600','\6601')- , ('\6679','\6683')- , ('\6741','\6750')- , ('\6752','\6780')- , ('\6783','\6783')- , ('\6912','\6916')- , ('\6964','\6980')- , ('\7019','\7027')- , ('\7040','\7042')- , ('\7073','\7082')- , ('\7204','\7223')- , ('\7376','\7378')- , ('\7380','\7400')- , ('\7405','\7405')- , ('\7410','\7410')- , ('\7616','\7654')- , ('\7677','\7679')- , ('\8400','\8432')- , ('\11503','\11505')- , ('\11744','\11775')- , ('\12330','\12335')- , ('\12441','\12442')- , ('\42607','\42610')- , ('\42620','\42621')- , ('\42736','\42737')- , ('\43010','\43010')- , ('\43014','\43014')- , ('\43019','\43019')- , ('\43043','\43047')- , ('\43136','\43137')- , ('\43188','\43204')- , ('\43232','\43249')- , ('\43302','\43309')- , ('\43335','\43347')- , ('\43392','\43395')- , ('\43443','\43456')- , ('\43561','\43574')- , ('\43587','\43587')- , ('\43596','\43597')- , ('\43643','\43643')- , ('\43696','\43696')- , ('\43698','\43700')- , ('\43703','\43704')- , ('\43710','\43711')- , ('\43713','\43713')- , ('\44003','\44010')- , ('\44012','\44013')- , ('\64286','\64286')- , ('\65024','\65039')- , ('\65056','\65062')- , ('\66045','\66045')- , ('\68097','\68099')- , ('\68101','\68102')- , ('\68108','\68111')- , ('\68152','\68154')- , ('\68159','\68159')- , ('\69760','\69762')- , ('\69808','\69818')- , ('\119141','\119145')- , ('\119149','\119154')- , ('\119163','\119170')- , ('\119173','\119179')- , ('\119210','\119213')- , ('\119362','\119364')- , ('\917760','\917999')- ]---- --------------------------------------------------------------isUnicodeMc :: Char -> Bool-isUnicodeMc c- = isInList c- [ ('\2307','\2307')- , ('\2366','\2368')- , ('\2377','\2380')- , ('\2382','\2382')- , ('\2434','\2435')- , ('\2494','\2496')- , ('\2503','\2504')- , ('\2507','\2508')- , ('\2519','\2519')- , ('\2563','\2563')- , ('\2622','\2624')- , ('\2691','\2691')- , ('\2750','\2752')- , ('\2761','\2761')- , ('\2763','\2764')- , ('\2818','\2819')- , ('\2878','\2878')- , ('\2880','\2880')- , ('\2887','\2888')- , ('\2891','\2892')- , ('\2903','\2903')- , ('\3006','\3007')- , ('\3009','\3010')- , ('\3014','\3016')- , ('\3018','\3020')- , ('\3031','\3031')- , ('\3073','\3075')- , ('\3137','\3140')- , ('\3202','\3203')- , ('\3262','\3262')- , ('\3264','\3268')- , ('\3271','\3272')- , ('\3274','\3275')- , ('\3285','\3286')- , ('\3330','\3331')- , ('\3390','\3392')- , ('\3398','\3400')- , ('\3402','\3404')- , ('\3415','\3415')- , ('\3458','\3459')- , ('\3535','\3537')- , ('\3544','\3551')- , ('\3570','\3571')- , ('\3902','\3903')- , ('\3967','\3967')- , ('\4139','\4140')- , ('\4145','\4145')- , ('\4152','\4152')- , ('\4155','\4156')- , ('\4182','\4183')- , ('\4194','\4196')- , ('\4199','\4205')- , ('\4227','\4228')- , ('\4231','\4236')- , ('\4239','\4239')- , ('\4250','\4252')- , ('\6070','\6070')- , ('\6078','\6085')- , ('\6087','\6088')- , ('\6435','\6438')- , ('\6441','\6443')- , ('\6448','\6449')- , ('\6451','\6456')- , ('\6576','\6592')- , ('\6600','\6601')- , ('\6681','\6683')- , ('\6741','\6741')- , ('\6743','\6743')- , ('\6753','\6753')- , ('\6755','\6756')- , ('\6765','\6770')- , ('\6916','\6916')- , ('\6965','\6965')- , ('\6971','\6971')- , ('\6973','\6977')- , ('\6979','\6980')- , ('\7042','\7042')- , ('\7073','\7073')- , ('\7078','\7079')- , ('\7082','\7082')- , ('\7204','\7211')- , ('\7220','\7221')- , ('\7393','\7393')- , ('\7410','\7410')- , ('\43043','\43044')- , ('\43047','\43047')- , ('\43136','\43137')- , ('\43188','\43203')- , ('\43346','\43347')- , ('\43395','\43395')- , ('\43444','\43445')- , ('\43450','\43451')- , ('\43453','\43456')- , ('\43567','\43568')- , ('\43571','\43572')- , ('\43597','\43597')- , ('\43643','\43643')- , ('\44003','\44004')- , ('\44006','\44007')- , ('\44009','\44010')- , ('\44012','\44012')- , ('\69762','\69762')- , ('\69808','\69810')- , ('\69815','\69816')- , ('\119141','\119142')- , ('\119149','\119154')- ]---- --------------------------------------------------------------isUnicodeMe :: Char -> Bool-isUnicodeMe c- = isInList c- [ ('\1160','\1161')- , ('\1758','\1758')- , ('\8413','\8416')- , ('\8418','\8420')- , ('\42608','\42610')- ]---- --------------------------------------------------------------isUnicodeMn :: Char -> Bool-isUnicodeMn c- = isInList c- [ ('\768','\879')- , ('\1155','\1159')- , ('\1425','\1469')- , ('\1471','\1471')- , ('\1473','\1474')- , ('\1476','\1477')- , ('\1479','\1479')- , ('\1552','\1562')- , ('\1611','\1630')- , ('\1648','\1648')- , ('\1750','\1756')- , ('\1759','\1764')- , ('\1767','\1768')- , ('\1770','\1773')- , ('\1809','\1809')- , ('\1840','\1866')- , ('\1958','\1968')- , ('\2027','\2035')- , ('\2070','\2073')- , ('\2075','\2083')- , ('\2085','\2087')- , ('\2089','\2093')- , ('\2304','\2306')- , ('\2364','\2364')- , ('\2369','\2376')- , ('\2381','\2381')- , ('\2385','\2389')- , ('\2402','\2403')- , ('\2433','\2433')- , ('\2492','\2492')- , ('\2497','\2500')- , ('\2509','\2509')- , ('\2530','\2531')- , ('\2561','\2562')- , ('\2620','\2620')- , ('\2625','\2626')- , ('\2631','\2632')- , ('\2635','\2637')- , ('\2641','\2641')- , ('\2672','\2673')- , ('\2677','\2677')- , ('\2689','\2690')- , ('\2748','\2748')- , ('\2753','\2757')- , ('\2759','\2760')- , ('\2765','\2765')- , ('\2786','\2787')- , ('\2817','\2817')- , ('\2876','\2876')- , ('\2879','\2879')- , ('\2881','\2884')- , ('\2893','\2893')- , ('\2902','\2902')- , ('\2914','\2915')- , ('\2946','\2946')- , ('\3008','\3008')- , ('\3021','\3021')- , ('\3134','\3136')- , ('\3142','\3144')- , ('\3146','\3149')- , ('\3157','\3158')- , ('\3170','\3171')- , ('\3260','\3260')- , ('\3263','\3263')- , ('\3270','\3270')- , ('\3276','\3277')- , ('\3298','\3299')- , ('\3393','\3396')- , ('\3405','\3405')- , ('\3426','\3427')- , ('\3530','\3530')- , ('\3538','\3540')- , ('\3542','\3542')- , ('\3633','\3633')- , ('\3636','\3642')- , ('\3655','\3662')- , ('\3761','\3761')- , ('\3764','\3769')- , ('\3771','\3772')- , ('\3784','\3789')- , ('\3864','\3865')- , ('\3893','\3893')- , ('\3895','\3895')- , ('\3897','\3897')- , ('\3953','\3966')- , ('\3968','\3972')- , ('\3974','\3975')- , ('\3984','\3991')- , ('\3993','\4028')- , ('\4038','\4038')- , ('\4141','\4144')- , ('\4146','\4151')- , ('\4153','\4154')- , ('\4157','\4158')- , ('\4184','\4185')- , ('\4190','\4192')- , ('\4209','\4212')- , ('\4226','\4226')- , ('\4229','\4230')- , ('\4237','\4237')- , ('\4253','\4253')- , ('\4959','\4959')- , ('\5906','\5908')- , ('\5938','\5940')- , ('\5970','\5971')- , ('\6002','\6003')- , ('\6071','\6077')- , ('\6086','\6086')- , ('\6089','\6099')- , ('\6109','\6109')- , ('\6155','\6157')- , ('\6313','\6313')- , ('\6432','\6434')- , ('\6439','\6440')- , ('\6450','\6450')- , ('\6457','\6459')- , ('\6679','\6680')- , ('\6742','\6742')- , ('\6744','\6750')- , ('\6752','\6752')- , ('\6754','\6754')- , ('\6757','\6764')- , ('\6771','\6780')- , ('\6783','\6783')- , ('\6912','\6915')- , ('\6964','\6964')- , ('\6966','\6970')- , ('\6972','\6972')- , ('\6978','\6978')- , ('\7019','\7027')- , ('\7040','\7041')- , ('\7074','\7077')- , ('\7080','\7081')- , ('\7212','\7219')- , ('\7222','\7223')- , ('\7376','\7378')- , ('\7380','\7392')- , ('\7394','\7400')- , ('\7405','\7405')- , ('\7616','\7654')- , ('\7677','\7679')- , ('\8400','\8412')- , ('\8417','\8417')- , ('\8421','\8432')- , ('\11503','\11505')- , ('\11744','\11775')- , ('\12330','\12335')- , ('\12441','\12442')- , ('\42607','\42607')- , ('\42620','\42621')- , ('\42736','\42737')- , ('\43010','\43010')- , ('\43014','\43014')- , ('\43019','\43019')- , ('\43045','\43046')- , ('\43204','\43204')- , ('\43232','\43249')- , ('\43302','\43309')- , ('\43335','\43345')- , ('\43392','\43394')- , ('\43443','\43443')- , ('\43446','\43449')- , ('\43452','\43452')- , ('\43561','\43566')- , ('\43569','\43570')- , ('\43573','\43574')- , ('\43587','\43587')- , ('\43596','\43596')- , ('\43696','\43696')- , ('\43698','\43700')- , ('\43703','\43704')- , ('\43710','\43711')- , ('\43713','\43713')- , ('\44005','\44005')- , ('\44008','\44008')- , ('\44013','\44013')- , ('\64286','\64286')- , ('\65024','\65039')- , ('\65056','\65062')- , ('\66045','\66045')- , ('\68097','\68099')- , ('\68101','\68102')- , ('\68108','\68111')- , ('\68152','\68154')- , ('\68159','\68159')- , ('\69760','\69761')- , ('\69811','\69814')- , ('\69817','\69818')- , ('\119143','\119145')- , ('\119163','\119170')- , ('\119173','\119179')- , ('\119210','\119213')- , ('\119362','\119364')- , ('\917760','\917999')- ]---- --------------------------------------------------------------isUnicodeN :: Char -> Bool-isUnicodeN c- = isInList c- [ ('0','9')- , ('\178','\179')- , ('\185','\185')- , ('\188','\190')- , ('\1632','\1641')- , ('\1776','\1785')- , ('\1984','\1993')- , ('\2406','\2415')- , ('\2534','\2543')- , ('\2548','\2553')- , ('\2662','\2671')- , ('\2790','\2799')- , ('\2918','\2927')- , ('\3046','\3058')- , ('\3174','\3183')- , ('\3192','\3198')- , ('\3302','\3311')- , ('\3430','\3445')- , ('\3664','\3673')- , ('\3792','\3801')- , ('\3872','\3891')- , ('\4160','\4169')- , ('\4240','\4249')- , ('\4969','\4988')- , ('\5870','\5872')- , ('\6112','\6121')- , ('\6128','\6137')- , ('\6160','\6169')- , ('\6470','\6479')- , ('\6608','\6618')- , ('\6784','\6793')- , ('\6800','\6809')- , ('\6992','\7001')- , ('\7088','\7097')- , ('\7232','\7241')- , ('\7248','\7257')- , ('\8304','\8304')- , ('\8308','\8313')- , ('\8320','\8329')- , ('\8528','\8578')- , ('\8581','\8585')- , ('\9312','\9371')- , ('\9450','\9471')- , ('\10102','\10131')- , ('\11517','\11517')- , ('\12295','\12295')- , ('\12321','\12329')- , ('\12344','\12346')- , ('\12690','\12693')- , ('\12832','\12841')- , ('\12881','\12895')- , ('\12928','\12937')- , ('\12977','\12991')- , ('\42528','\42537')- , ('\42726','\42735')- , ('\43056','\43061')- , ('\43216','\43225')- , ('\43264','\43273')- , ('\43472','\43481')- , ('\43600','\43609')- , ('\44016','\44025')- , ('\65296','\65305')- , ('\65799','\65843')- , ('\65856','\65912')- , ('\65930','\65930')- , ('\66336','\66339')- , ('\66369','\66369')- , ('\66378','\66378')- , ('\66513','\66517')- , ('\66720','\66729')- , ('\67672','\67679')- , ('\67862','\67867')- , ('\68160','\68167')- , ('\68221','\68222')- , ('\68440','\68447')- , ('\68472','\68479')- , ('\69216','\69246')- , ('\74752','\74850')- , ('\119648','\119665')- , ('\120782','\120831')- , ('\127232','\127242')- ]---- --------------------------------------------------------------isUnicodeNd :: Char -> Bool-isUnicodeNd c- = isInList c- [ ('0','9')- , ('\1632','\1641')- , ('\1776','\1785')- , ('\1984','\1993')- , ('\2406','\2415')- , ('\2534','\2543')- , ('\2662','\2671')- , ('\2790','\2799')- , ('\2918','\2927')- , ('\3046','\3055')- , ('\3174','\3183')- , ('\3302','\3311')- , ('\3430','\3439')- , ('\3664','\3673')- , ('\3792','\3801')- , ('\3872','\3881')- , ('\4160','\4169')- , ('\4240','\4249')- , ('\6112','\6121')- , ('\6160','\6169')- , ('\6470','\6479')- , ('\6608','\6618')- , ('\6784','\6793')- , ('\6800','\6809')- , ('\6992','\7001')- , ('\7088','\7097')- , ('\7232','\7241')- , ('\7248','\7257')- , ('\42528','\42537')- , ('\43216','\43225')- , ('\43264','\43273')- , ('\43472','\43481')- , ('\43600','\43609')- , ('\44016','\44025')- , ('\65296','\65305')- , ('\66720','\66729')- , ('\120782','\120831')- ]---- --------------------------------------------------------------isUnicodeNl :: Char -> Bool-isUnicodeNl c- = isInList c- [ ('\5870','\5872')- , ('\8544','\8578')- , ('\8581','\8584')- , ('\12295','\12295')- , ('\12321','\12329')- , ('\12344','\12346')- , ('\42726','\42735')- , ('\65856','\65908')- , ('\66369','\66369')- , ('\66378','\66378')- , ('\66513','\66517')- , ('\74752','\74850')- ]---- --------------------------------------------------------------isUnicodeNo :: Char -> Bool-isUnicodeNo c- = isInList c- [ ('\178','\179')- , ('\185','\185')- , ('\188','\190')- , ('\2548','\2553')- , ('\3056','\3058')- , ('\3192','\3198')- , ('\3440','\3445')- , ('\3882','\3891')- , ('\4969','\4988')- , ('\6128','\6137')- , ('\8304','\8304')- , ('\8308','\8313')- , ('\8320','\8329')- , ('\8528','\8543')- , ('\8585','\8585')- , ('\9312','\9371')- , ('\9450','\9471')- , ('\10102','\10131')- , ('\11517','\11517')- , ('\12690','\12693')- , ('\12832','\12841')- , ('\12881','\12895')- , ('\12928','\12937')- , ('\12977','\12991')- , ('\43056','\43061')- , ('\65799','\65843')- , ('\65909','\65912')- , ('\65930','\65930')- , ('\66336','\66339')- , ('\67672','\67679')- , ('\67862','\67867')- , ('\68160','\68167')- , ('\68221','\68222')- , ('\68440','\68447')- , ('\68472','\68479')- , ('\69216','\69246')- , ('\119648','\119665')- , ('\127232','\127242')- ]---- --------------------------------------------------------------isUnicodeP :: Char -> Bool-isUnicodeP c- = isInList c- [ ('!','#')- , ('%','*')- , (',','/')- , (':',';')- , ('?','@')- , ('[',']')- , ('_','_')- , ('{','{')- , ('}','}')- , ('\161','\161')- , ('\171','\171')- , ('\183','\183')- , ('\187','\187')- , ('\191','\191')- , ('\894','\894')- , ('\903','\903')- , ('\1370','\1375')- , ('\1417','\1418')- , ('\1470','\1470')- , ('\1472','\1472')- , ('\1475','\1475')- , ('\1478','\1478')- , ('\1523','\1524')- , ('\1545','\1546')- , ('\1548','\1549')- , ('\1563','\1563')- , ('\1566','\1567')- , ('\1642','\1645')- , ('\1748','\1748')- , ('\1792','\1805')- , ('\2039','\2041')- , ('\2096','\2110')- , ('\2404','\2405')- , ('\2416','\2416')- , ('\3572','\3572')- , ('\3663','\3663')- , ('\3674','\3675')- , ('\3844','\3858')- , ('\3898','\3901')- , ('\3973','\3973')- , ('\4048','\4052')- , ('\4170','\4175')- , ('\4347','\4347')- , ('\4961','\4968')- , ('\5120','\5120')- , ('\5741','\5742')- , ('\5787','\5788')- , ('\5867','\5869')- , ('\5941','\5942')- , ('\6100','\6102')- , ('\6104','\6106')- , ('\6144','\6154')- , ('\6468','\6469')- , ('\6622','\6623')- , ('\6686','\6687')- , ('\6816','\6822')- , ('\6824','\6829')- , ('\7002','\7008')- , ('\7227','\7231')- , ('\7294','\7295')- , ('\7379','\7379')- , ('\8208','\8231')- , ('\8240','\8259')- , ('\8261','\8273')- , ('\8275','\8286')- , ('\8317','\8318')- , ('\8333','\8334')- , ('\9001','\9002')- , ('\10088','\10101')- , ('\10181','\10182')- , ('\10214','\10223')- , ('\10627','\10648')- , ('\10712','\10715')- , ('\10748','\10749')- , ('\11513','\11516')- , ('\11518','\11519')- , ('\11776','\11822')- , ('\11824','\11825')- , ('\12289','\12291')- , ('\12296','\12305')- , ('\12308','\12319')- , ('\12336','\12336')- , ('\12349','\12349')- , ('\12448','\12448')- , ('\12539','\12539')- , ('\42238','\42239')- , ('\42509','\42511')- , ('\42611','\42611')- , ('\42622','\42622')- , ('\42738','\42743')- , ('\43124','\43127')- , ('\43214','\43215')- , ('\43256','\43258')- , ('\43310','\43311')- , ('\43359','\43359')- , ('\43457','\43469')- , ('\43486','\43487')- , ('\43612','\43615')- , ('\43742','\43743')- , ('\44011','\44011')- , ('\64830','\64831')- , ('\65040','\65049')- , ('\65072','\65106')- , ('\65108','\65121')- , ('\65123','\65123')- , ('\65128','\65128')- , ('\65130','\65131')- , ('\65281','\65283')- , ('\65285','\65290')- , ('\65292','\65295')- , ('\65306','\65307')- , ('\65311','\65312')- , ('\65339','\65341')- , ('\65343','\65343')- , ('\65371','\65371')- , ('\65373','\65373')- , ('\65375','\65381')- , ('\65792','\65793')- , ('\66463','\66463')- , ('\66512','\66512')- , ('\67671','\67671')- , ('\67871','\67871')- , ('\67903','\67903')- , ('\68176','\68184')- , ('\68223','\68223')- , ('\68409','\68415')- , ('\69819','\69820')- , ('\69822','\69825')- , ('\74864','\74867')- ]---- --------------------------------------------------------------isUnicodePc :: Char -> Bool-isUnicodePc c- = isInList c- [ ('_','_')- , ('\8255','\8256')- , ('\8276','\8276')- , ('\65075','\65076')- , ('\65101','\65103')- , ('\65343','\65343')- ]---- --------------------------------------------------------------isUnicodePd :: Char -> Bool-isUnicodePd c- = isInList c- [ ('-','-')- , ('\1418','\1418')- , ('\1470','\1470')- , ('\5120','\5120')- , ('\6150','\6150')- , ('\8208','\8213')- , ('\11799','\11799')- , ('\11802','\11802')- , ('\12316','\12316')- , ('\12336','\12336')- , ('\12448','\12448')- , ('\65073','\65074')- , ('\65112','\65112')- , ('\65123','\65123')- , ('\65293','\65293')- ]---- --------------------------------------------------------------isUnicodePe :: Char -> Bool-isUnicodePe c- = isInList c- [ (')',')')- , (']',']')- , ('}','}')- , ('\3899','\3899')- , ('\3901','\3901')- , ('\5788','\5788')- , ('\8262','\8262')- , ('\8318','\8318')- , ('\8334','\8334')- , ('\9002','\9002')- , ('\10089','\10089')- , ('\10091','\10091')- , ('\10093','\10093')- , ('\10095','\10095')- , ('\10097','\10097')- , ('\10099','\10099')- , ('\10101','\10101')- , ('\10182','\10182')- , ('\10215','\10215')- , ('\10217','\10217')- , ('\10219','\10219')- , ('\10221','\10221')- , ('\10223','\10223')- , ('\10628','\10628')- , ('\10630','\10630')- , ('\10632','\10632')- , ('\10634','\10634')- , ('\10636','\10636')- , ('\10638','\10638')- , ('\10640','\10640')- , ('\10642','\10642')- , ('\10644','\10644')- , ('\10646','\10646')- , ('\10648','\10648')- , ('\10713','\10713')- , ('\10715','\10715')- , ('\10749','\10749')- , ('\11811','\11811')- , ('\11813','\11813')- , ('\11815','\11815')- , ('\11817','\11817')- , ('\12297','\12297')- , ('\12299','\12299')- , ('\12301','\12301')- , ('\12303','\12303')- , ('\12305','\12305')- , ('\12309','\12309')- , ('\12311','\12311')- , ('\12313','\12313')- , ('\12315','\12315')- , ('\12318','\12319')- , ('\64831','\64831')- , ('\65048','\65048')- , ('\65078','\65078')- , ('\65080','\65080')- , ('\65082','\65082')- , ('\65084','\65084')- , ('\65086','\65086')- , ('\65088','\65088')- , ('\65090','\65090')- , ('\65092','\65092')- , ('\65096','\65096')- , ('\65114','\65114')- , ('\65116','\65116')- , ('\65118','\65118')- , ('\65289','\65289')- , ('\65341','\65341')- , ('\65373','\65373')- , ('\65376','\65376')- , ('\65379','\65379')- ]---- --------------------------------------------------------------isUnicodePf :: Char -> Bool-isUnicodePf c- = isInList c- [ ('\187','\187')- , ('\8217','\8217')- , ('\8221','\8221')- , ('\8250','\8250')- , ('\11779','\11779')- , ('\11781','\11781')- , ('\11786','\11786')- , ('\11789','\11789')- , ('\11805','\11805')- , ('\11809','\11809')- ]---- --------------------------------------------------------------isUnicodePi :: Char -> Bool-isUnicodePi c- = isInList c- [ ('\171','\171')- , ('\8216','\8216')- , ('\8219','\8220')- , ('\8223','\8223')- , ('\8249','\8249')- , ('\11778','\11778')- , ('\11780','\11780')- , ('\11785','\11785')- , ('\11788','\11788')- , ('\11804','\11804')- , ('\11808','\11808')- ]---- --------------------------------------------------------------isUnicodePo :: Char -> Bool-isUnicodePo c- = isInList c- [ ('!','#')- , ('%','\'')- , ('*','*')- , (',',',')- , ('.','/')- , (':',';')- , ('?','@')- , ('\\','\\')- , ('\161','\161')- , ('\183','\183')- , ('\191','\191')- , ('\894','\894')- , ('\903','\903')- , ('\1370','\1375')- , ('\1417','\1417')- , ('\1472','\1472')- , ('\1475','\1475')- , ('\1478','\1478')- , ('\1523','\1524')- , ('\1545','\1546')- , ('\1548','\1549')- , ('\1563','\1563')- , ('\1566','\1567')- , ('\1642','\1645')- , ('\1748','\1748')- , ('\1792','\1805')- , ('\2039','\2041')- , ('\2096','\2110')- , ('\2404','\2405')- , ('\2416','\2416')- , ('\3572','\3572')- , ('\3663','\3663')- , ('\3674','\3675')- , ('\3844','\3858')- , ('\3973','\3973')- , ('\4048','\4052')- , ('\4170','\4175')- , ('\4347','\4347')- , ('\4961','\4968')- , ('\5741','\5742')- , ('\5867','\5869')- , ('\5941','\5942')- , ('\6100','\6102')- , ('\6104','\6106')- , ('\6144','\6149')- , ('\6151','\6154')- , ('\6468','\6469')- , ('\6622','\6623')- , ('\6686','\6687')- , ('\6816','\6822')- , ('\6824','\6829')- , ('\7002','\7008')- , ('\7227','\7231')- , ('\7294','\7295')- , ('\7379','\7379')- , ('\8214','\8215')- , ('\8224','\8231')- , ('\8240','\8248')- , ('\8251','\8254')- , ('\8257','\8259')- , ('\8263','\8273')- , ('\8275','\8275')- , ('\8277','\8286')- , ('\11513','\11516')- , ('\11518','\11519')- , ('\11776','\11777')- , ('\11782','\11784')- , ('\11787','\11787')- , ('\11790','\11798')- , ('\11800','\11801')- , ('\11803','\11803')- , ('\11806','\11807')- , ('\11818','\11822')- , ('\11824','\11825')- , ('\12289','\12291')- , ('\12349','\12349')- , ('\12539','\12539')- , ('\42238','\42239')- , ('\42509','\42511')- , ('\42611','\42611')- , ('\42622','\42622')- , ('\42738','\42743')- , ('\43124','\43127')- , ('\43214','\43215')- , ('\43256','\43258')- , ('\43310','\43311')- , ('\43359','\43359')- , ('\43457','\43469')- , ('\43486','\43487')- , ('\43612','\43615')- , ('\43742','\43743')- , ('\44011','\44011')- , ('\65040','\65046')- , ('\65049','\65049')- , ('\65072','\65072')- , ('\65093','\65094')- , ('\65097','\65100')- , ('\65104','\65106')- , ('\65108','\65111')- , ('\65119','\65121')- , ('\65128','\65128')- , ('\65130','\65131')- , ('\65281','\65283')- , ('\65285','\65287')- , ('\65290','\65290')- , ('\65292','\65292')- , ('\65294','\65295')- , ('\65306','\65307')- , ('\65311','\65312')- , ('\65340','\65340')- , ('\65377','\65377')- , ('\65380','\65381')- , ('\65792','\65793')- , ('\66463','\66463')- , ('\66512','\66512')- , ('\67671','\67671')- , ('\67871','\67871')- , ('\67903','\67903')- , ('\68176','\68184')- , ('\68223','\68223')- , ('\68409','\68415')- , ('\69819','\69820')- , ('\69822','\69825')- , ('\74864','\74867')- ]---- --------------------------------------------------------------isUnicodePs :: Char -> Bool-isUnicodePs c- = isInList c- [ ('(','(')- , ('[','[')- , ('{','{')- , ('\3898','\3898')- , ('\3900','\3900')- , ('\5787','\5787')- , ('\8218','\8218')- , ('\8222','\8222')- , ('\8261','\8261')- , ('\8317','\8317')- , ('\8333','\8333')- , ('\9001','\9001')- , ('\10088','\10088')- , ('\10090','\10090')- , ('\10092','\10092')- , ('\10094','\10094')- , ('\10096','\10096')- , ('\10098','\10098')- , ('\10100','\10100')- , ('\10181','\10181')- , ('\10214','\10214')- , ('\10216','\10216')- , ('\10218','\10218')- , ('\10220','\10220')- , ('\10222','\10222')- , ('\10627','\10627')- , ('\10629','\10629')- , ('\10631','\10631')- , ('\10633','\10633')- , ('\10635','\10635')- , ('\10637','\10637')- , ('\10639','\10639')- , ('\10641','\10641')- , ('\10643','\10643')- , ('\10645','\10645')- , ('\10647','\10647')- , ('\10712','\10712')- , ('\10714','\10714')- , ('\10748','\10748')- , ('\11810','\11810')- , ('\11812','\11812')- , ('\11814','\11814')- , ('\11816','\11816')- , ('\12296','\12296')- , ('\12298','\12298')- , ('\12300','\12300')- , ('\12302','\12302')- , ('\12304','\12304')- , ('\12308','\12308')- , ('\12310','\12310')- , ('\12312','\12312')- , ('\12314','\12314')- , ('\12317','\12317')- , ('\64830','\64830')- , ('\65047','\65047')- , ('\65077','\65077')- , ('\65079','\65079')- , ('\65081','\65081')- , ('\65083','\65083')- , ('\65085','\65085')- , ('\65087','\65087')- , ('\65089','\65089')- , ('\65091','\65091')- , ('\65095','\65095')- , ('\65113','\65113')- , ('\65115','\65115')- , ('\65117','\65117')- , ('\65288','\65288')- , ('\65339','\65339')- , ('\65371','\65371')- , ('\65375','\65375')- , ('\65378','\65378')- ]---- --------------------------------------------------------------isUnicodeS :: Char -> Bool-isUnicodeS c- = isInList c- [ ('$','$')- , ('+','+')- , ('<','>')- , ('^','^')- , ('`','`')- , ('|','|')- , ('~','~')- , ('\162','\169')- , ('\172','\172')- , ('\174','\177')- , ('\180','\180')- , ('\182','\182')- , ('\184','\184')- , ('\215','\215')- , ('\247','\247')- , ('\706','\709')- , ('\722','\735')- , ('\741','\747')- , ('\749','\749')- , ('\751','\767')- , ('\885','\885')- , ('\900','\901')- , ('\1014','\1014')- , ('\1154','\1154')- , ('\1542','\1544')- , ('\1547','\1547')- , ('\1550','\1551')- , ('\1769','\1769')- , ('\1789','\1790')- , ('\2038','\2038')- , ('\2546','\2547')- , ('\2554','\2555')- , ('\2801','\2801')- , ('\2928','\2928')- , ('\3059','\3066')- , ('\3199','\3199')- , ('\3313','\3314')- , ('\3449','\3449')- , ('\3647','\3647')- , ('\3841','\3843')- , ('\3859','\3863')- , ('\3866','\3871')- , ('\3892','\3892')- , ('\3894','\3894')- , ('\3896','\3896')- , ('\4030','\4037')- , ('\4039','\4044')- , ('\4046','\4047')- , ('\4053','\4056')- , ('\4254','\4255')- , ('\4960','\4960')- , ('\5008','\5017')- , ('\6107','\6107')- , ('\6464','\6464')- , ('\6624','\6655')- , ('\7009','\7018')- , ('\7028','\7036')- , ('\8125','\8125')- , ('\8127','\8129')- , ('\8141','\8143')- , ('\8157','\8159')- , ('\8173','\8175')- , ('\8189','\8190')- , ('\8260','\8260')- , ('\8274','\8274')- , ('\8314','\8316')- , ('\8330','\8332')- , ('\8352','\8376')- , ('\8448','\8449')- , ('\8451','\8454')- , ('\8456','\8457')- , ('\8468','\8468')- , ('\8470','\8472')- , ('\8478','\8483')- , ('\8485','\8485')- , ('\8487','\8487')- , ('\8489','\8489')- , ('\8494','\8494')- , ('\8506','\8507')- , ('\8512','\8516')- , ('\8522','\8525')- , ('\8527','\8527')- , ('\8592','\9000')- , ('\9003','\9192')- , ('\9216','\9254')- , ('\9280','\9290')- , ('\9372','\9449')- , ('\9472','\9933')- , ('\9935','\9953')- , ('\9955','\9955')- , ('\9960','\9983')- , ('\9985','\9988')- , ('\9990','\9993')- , ('\9996','\10023')- , ('\10025','\10059')- , ('\10061','\10061')- , ('\10063','\10066')- , ('\10070','\10078')- , ('\10081','\10087')- , ('\10132','\10132')- , ('\10136','\10159')- , ('\10161','\10174')- , ('\10176','\10180')- , ('\10183','\10186')- , ('\10188','\10188')- , ('\10192','\10213')- , ('\10224','\10626')- , ('\10649','\10711')- , ('\10716','\10747')- , ('\10750','\11084')- , ('\11088','\11097')- , ('\11493','\11498')- , ('\11904','\11929')- , ('\11931','\12019')- , ('\12032','\12245')- , ('\12272','\12283')- , ('\12292','\12292')- , ('\12306','\12307')- , ('\12320','\12320')- , ('\12342','\12343')- , ('\12350','\12351')- , ('\12443','\12444')- , ('\12688','\12689')- , ('\12694','\12703')- , ('\12736','\12771')- , ('\12800','\12830')- , ('\12842','\12880')- , ('\12896','\12927')- , ('\12938','\12976')- , ('\12992','\13054')- , ('\13056','\13311')- , ('\19904','\19967')- , ('\42128','\42182')- , ('\42752','\42774')- , ('\42784','\42785')- , ('\42889','\42890')- , ('\43048','\43051')- , ('\43062','\43065')- , ('\43639','\43641')- , ('\64297','\64297')- , ('\65020','\65021')- , ('\65122','\65122')- , ('\65124','\65126')- , ('\65129','\65129')- , ('\65284','\65284')- , ('\65291','\65291')- , ('\65308','\65310')- , ('\65342','\65342')- , ('\65344','\65344')- , ('\65372','\65372')- , ('\65374','\65374')- , ('\65504','\65510')- , ('\65512','\65518')- , ('\65532','\65533')- , ('\65794','\65794')- , ('\65847','\65855')- , ('\65913','\65929')- , ('\65936','\65947')- , ('\66000','\66044')- , ('\118784','\119029')- , ('\119040','\119078')- , ('\119081','\119140')- , ('\119146','\119148')- , ('\119171','\119172')- , ('\119180','\119209')- , ('\119214','\119261')- , ('\119296','\119361')- , ('\119365','\119365')- , ('\119552','\119638')- , ('\120513','\120513')- , ('\120539','\120539')- , ('\120571','\120571')- , ('\120597','\120597')- , ('\120629','\120629')- , ('\120655','\120655')- , ('\120687','\120687')- , ('\120713','\120713')- , ('\120745','\120745')- , ('\120771','\120771')- , ('\126976','\127019')- , ('\127024','\127123')- , ('\127248','\127278')- , ('\127281','\127281')- , ('\127293','\127293')- , ('\127295','\127295')- , ('\127298','\127298')- , ('\127302','\127302')- , ('\127306','\127310')- , ('\127319','\127319')- , ('\127327','\127327')- , ('\127353','\127353')- , ('\127355','\127356')- , ('\127359','\127359')- , ('\127370','\127373')- , ('\127376','\127376')- , ('\127488','\127488')- , ('\127504','\127537')- , ('\127552','\127560')- ]---- --------------------------------------------------------------isUnicodeSc :: Char -> Bool-isUnicodeSc c- = isInList c- [ ('$','$')- , ('\162','\165')- , ('\1547','\1547')- , ('\2546','\2547')- , ('\2555','\2555')- , ('\2801','\2801')- , ('\3065','\3065')- , ('\3647','\3647')- , ('\6107','\6107')- , ('\8352','\8376')- , ('\43064','\43064')- , ('\65020','\65020')- , ('\65129','\65129')- , ('\65284','\65284')- , ('\65504','\65505')- , ('\65509','\65510')- ]---- --------------------------------------------------------------isUnicodeSk :: Char -> Bool-isUnicodeSk c- = isInList c- [ ('^','^')- , ('`','`')- , ('\168','\168')- , ('\175','\175')- , ('\180','\180')- , ('\184','\184')- , ('\706','\709')- , ('\722','\735')- , ('\741','\747')- , ('\749','\749')- , ('\751','\767')- , ('\885','\885')- , ('\900','\901')- , ('\8125','\8125')- , ('\8127','\8129')- , ('\8141','\8143')- , ('\8157','\8159')- , ('\8173','\8175')- , ('\8189','\8190')- , ('\12443','\12444')- , ('\42752','\42774')- , ('\42784','\42785')- , ('\42889','\42890')- , ('\65342','\65342')- , ('\65344','\65344')- , ('\65507','\65507')- ]---- --------------------------------------------------------------isUnicodeSm :: Char -> Bool-isUnicodeSm c- = isInList c- [ ('+','+')- , ('<','>')- , ('|','|')- , ('~','~')- , ('\172','\172')- , ('\177','\177')- , ('\215','\215')- , ('\247','\247')- , ('\1014','\1014')- , ('\1542','\1544')- , ('\8260','\8260')- , ('\8274','\8274')- , ('\8314','\8316')- , ('\8330','\8332')- , ('\8512','\8516')- , ('\8523','\8523')- , ('\8592','\8596')- , ('\8602','\8603')- , ('\8608','\8608')- , ('\8611','\8611')- , ('\8614','\8614')- , ('\8622','\8622')- , ('\8654','\8655')- , ('\8658','\8658')- , ('\8660','\8660')- , ('\8692','\8959')- , ('\8968','\8971')- , ('\8992','\8993')- , ('\9084','\9084')- , ('\9115','\9139')- , ('\9180','\9185')- , ('\9655','\9655')- , ('\9665','\9665')- , ('\9720','\9727')- , ('\9839','\9839')- , ('\10176','\10180')- , ('\10183','\10186')- , ('\10188','\10188')- , ('\10192','\10213')- , ('\10224','\10239')- , ('\10496','\10626')- , ('\10649','\10711')- , ('\10716','\10747')- , ('\10750','\11007')- , ('\11056','\11076')- , ('\11079','\11084')- , ('\64297','\64297')- , ('\65122','\65122')- , ('\65124','\65126')- , ('\65291','\65291')- , ('\65308','\65310')- , ('\65372','\65372')- , ('\65374','\65374')- , ('\65506','\65506')- , ('\65513','\65516')- , ('\120513','\120513')- , ('\120539','\120539')- , ('\120571','\120571')- , ('\120597','\120597')- , ('\120629','\120629')- , ('\120655','\120655')- , ('\120687','\120687')- , ('\120713','\120713')- , ('\120745','\120745')- , ('\120771','\120771')- ]---- --------------------------------------------------------------isUnicodeSo :: Char -> Bool-isUnicodeSo c- = isInList c- [ ('\166','\167')- , ('\169','\169')- , ('\174','\174')- , ('\176','\176')- , ('\182','\182')- , ('\1154','\1154')- , ('\1550','\1551')- , ('\1769','\1769')- , ('\1789','\1790')- , ('\2038','\2038')- , ('\2554','\2554')- , ('\2928','\2928')- , ('\3059','\3064')- , ('\3066','\3066')- , ('\3199','\3199')- , ('\3313','\3314')- , ('\3449','\3449')- , ('\3841','\3843')- , ('\3859','\3863')- , ('\3866','\3871')- , ('\3892','\3892')- , ('\3894','\3894')- , ('\3896','\3896')- , ('\4030','\4037')- , ('\4039','\4044')- , ('\4046','\4047')- , ('\4053','\4056')- , ('\4254','\4255')- , ('\4960','\4960')- , ('\5008','\5017')- , ('\6464','\6464')- , ('\6624','\6655')- , ('\7009','\7018')- , ('\7028','\7036')- , ('\8448','\8449')- , ('\8451','\8454')- , ('\8456','\8457')- , ('\8468','\8468')- , ('\8470','\8472')- , ('\8478','\8483')- , ('\8485','\8485')- , ('\8487','\8487')- , ('\8489','\8489')- , ('\8494','\8494')- , ('\8506','\8507')- , ('\8522','\8522')- , ('\8524','\8525')- , ('\8527','\8527')- , ('\8597','\8601')- , ('\8604','\8607')- , ('\8609','\8610')- , ('\8612','\8613')- , ('\8615','\8621')- , ('\8623','\8653')- , ('\8656','\8657')- , ('\8659','\8659')- , ('\8661','\8691')- , ('\8960','\8967')- , ('\8972','\8991')- , ('\8994','\9000')- , ('\9003','\9083')- , ('\9085','\9114')- , ('\9140','\9179')- , ('\9186','\9192')- , ('\9216','\9254')- , ('\9280','\9290')- , ('\9372','\9449')- , ('\9472','\9654')- , ('\9656','\9664')- , ('\9666','\9719')- , ('\9728','\9838')- , ('\9840','\9933')- , ('\9935','\9953')- , ('\9955','\9955')- , ('\9960','\9983')- , ('\9985','\9988')- , ('\9990','\9993')- , ('\9996','\10023')- , ('\10025','\10059')- , ('\10061','\10061')- , ('\10063','\10066')- , ('\10070','\10078')- , ('\10081','\10087')- , ('\10132','\10132')- , ('\10136','\10159')- , ('\10161','\10174')- , ('\10240','\10495')- , ('\11008','\11055')- , ('\11077','\11078')- , ('\11088','\11097')- , ('\11493','\11498')- , ('\11904','\11929')- , ('\11931','\12019')- , ('\12032','\12245')- , ('\12272','\12283')- , ('\12292','\12292')- , ('\12306','\12307')- , ('\12320','\12320')- , ('\12342','\12343')- , ('\12350','\12351')- , ('\12688','\12689')- , ('\12694','\12703')- , ('\12736','\12771')- , ('\12800','\12830')- , ('\12842','\12880')- , ('\12896','\12927')- , ('\12938','\12976')- , ('\12992','\13054')- , ('\13056','\13311')- , ('\19904','\19967')- , ('\42128','\42182')- , ('\43048','\43051')- , ('\43062','\43063')- , ('\43065','\43065')- , ('\43639','\43641')- , ('\65021','\65021')- , ('\65508','\65508')- , ('\65512','\65512')- , ('\65517','\65518')- , ('\65532','\65533')- , ('\65794','\65794')- , ('\65847','\65855')- , ('\65913','\65929')- , ('\65936','\65947')- , ('\66000','\66044')- , ('\118784','\119029')- , ('\119040','\119078')- , ('\119081','\119140')- , ('\119146','\119148')- , ('\119171','\119172')- , ('\119180','\119209')- , ('\119214','\119261')- , ('\119296','\119361')- , ('\119365','\119365')- , ('\119552','\119638')- , ('\126976','\127019')- , ('\127024','\127123')- , ('\127248','\127278')- , ('\127281','\127281')- , ('\127293','\127293')- , ('\127295','\127295')- , ('\127298','\127298')- , ('\127302','\127302')- , ('\127306','\127310')- , ('\127319','\127319')- , ('\127327','\127327')- , ('\127353','\127353')- , ('\127355','\127356')- , ('\127359','\127359')- , ('\127370','\127373')- , ('\127376','\127376')- , ('\127488','\127488')- , ('\127504','\127537')- , ('\127552','\127560')- ]---- --------------------------------------------------------------isUnicodeZ :: Char -> Bool-isUnicodeZ c- = isInList c- [ (' ',' ')- , ('\160','\160')- , ('\5760','\5760')- , ('\6158','\6158')- , ('\8192','\8202')- , ('\8232','\8233')- , ('\8239','\8239')- , ('\8287','\8287')- , ('\12288','\12288')- ]---- --------------------------------------------------------------isUnicodeZl :: Char -> Bool-isUnicodeZl c- = isInList c- [ ('\8232','\8232')- ]---- --------------------------------------------------------------isUnicodeZp :: Char -> Bool-isUnicodeZp c- = isInList c- [ ('\8233','\8233')- ]---- --------------------------------------------------------------isUnicodeZs :: Char -> Bool-isUnicodeZs c- = isInList c- [ (' ',' ')- , ('\160','\160')- , ('\5760','\5760')- , ('\6158','\6158')- , ('\8192','\8202')- , ('\8239','\8239')- , ('\8287','\8287')- , ('\12288','\12288')- ]---- -------------------------------------------------------------
− src/Text/XML/HXT/RelaxNG/Utils.hs
@@ -1,161 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.RelaxNG.Utils- Copyright : Copyright (C) 2008 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : stable- Portability: portable-- Helper functions for RelaxNG validation---}---- --------------------------------------------------------------module Text.XML.HXT.RelaxNG.Utils- ( isRelaxAnyURI- , compareURI- , normalizeURI- , isNumber- , isNmtoken- , isName- , formatStringList- , formatStringListPatt- , formatStringListId- , formatStringListQuot- , formatStringListPairs- , formatStringListArr- )-where--import Text.ParserCombinators.Parsec--import Text.XML.HXT.Parser.XmlTokenParser- ( skipS0- , nmtoken- , name- )--import Network.URI- ( isURI- , isRelativeReference- , parseURI- , URI(..)- )--import Data.Maybe- ( fromMaybe- )--import Data.Char- ( toLower- )----- ----------------------------------------------------------------- | Tests whether a URI matches the Relax NG anyURI symbol--isRelaxAnyURI :: String -> Bool-isRelaxAnyURI s- = s == "" ||- ( isURI s && not (isRelativeReference s) &&- ( let (URI _ _ path _ frag) = fromMaybe (URI "" Nothing "" "" "") $ parseURI s- in (frag == "" && path /= "")- )- )----- | Tests whether two URIs are equal after 'normalizeURI' is performed--compareURI :: String -> String -> Bool-compareURI uri1 uri2- = normalizeURI uri1 == normalizeURI uri2----- | Converts all letters to the corresponding lower-case letter--- and removes a trailing \"\/\"--normalizeURI :: String -> String-normalizeURI ""- = ""-normalizeURI uri- = map toLower ( if last uri == '/'- then init uri- else uri- )--checkByParsing :: Parser String -> String -> Bool-checkByParsing p s- = either (const False) (const True) (parse p' "" s)- where- p' = do- r <- p- eof- return r---- | Tests whether a string matches a number [-](0-9)*-isNumber :: String -> Bool-isNumber- = checkByParsing parseNumber'- where- parseNumber' :: Parser String- parseNumber'- = do- skipS0- m <- option "" (string "-")- n <- many1 digit- skipS0- return $ m ++ n--isNmtoken :: String -> Bool-isNmtoken = checkByParsing nmtoken--isName :: String -> Bool-isName = checkByParsing name--{- |--Formats a list of strings into a single string.-The first parameter formats the elements, the 2. is inserted-between two elements.--example:--> formatStringList show ", " ["foo", "bar", "baz"] -> "foo", "bar", "baz"---}--formatStringListPatt :: [String] -> String-formatStringListPatt- = formatStringList (++ "-") ", "--formatStringListPairs :: [(String,String)] -> String-formatStringListPairs- = formatStringList id ", "- . map (\ (a, b) -> a ++ " = " ++ show b)--formatStringListQuot :: [String] -> String-formatStringListQuot- = formatStringList show ", "--formatStringListId :: [String] -> String-formatStringListId- = formatStringList id ", "--formatStringListArr :: [String] -> String-formatStringListArr- = formatStringList show " -> "--formatStringList :: (String -> String) -> String -> [String] -> String-formatStringList _sf _sp []- = ""-formatStringList sf spacer l- = reverse $ drop (length spacer) $ reverse $- foldr (\e -> ((if e /= "" then sf e ++ spacer else "") ++)) "" l---- ----------------------------------------
− src/Text/XML/HXT/RelaxNG/Validation.hs
@@ -1,617 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.RelaxNG.Validation- Copyright : Copyright (C) 2008 Torben Kuseler, Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : stable- Portability: portable-- Validation of a XML document with respect to a valid Relax NG schema in simple form.- Copied and modified from \"An algorithm for RELAX NG validation\" by James Clark- (<http://www.thaiopensource.com/relaxng/derivative.html>).---}---- --------------------------------------------------------------module Text.XML.HXT.RelaxNG.Validation- ( validateWithRelaxAndHandleErrors- , validateDocWithRelax- , validateRelax- , validateXMLDoc- , readForRelax- , normalizeForRelaxValidation- , contains- )-where--import Control.Arrow.ListArrows--import Text.XML.HXT.DOM.Interface-import qualified Text.XML.HXT.DOM.XmlNode as XN-import Text.XML.HXT.DOM.Unicode- ( isXmlSpaceChar- )---import Text.XML.HXT.Arrow.XmlArrow-import Text.XML.HXT.Arrow.XmlIOStateArrow--import Text.XML.HXT.Arrow.Edit- ( canonicalizeAllNodes- , collapseAllXText- )--import Text.XML.HXT.Arrow.ProcessDocument- ( propagateAndValidateNamespaces- , getDocumentContents- , parseXmlDocument- )--import Text.XML.HXT.RelaxNG.DataTypes-import Text.XML.HXT.RelaxNG.CreatePattern-import Text.XML.HXT.RelaxNG.PatternToString-import Text.XML.HXT.RelaxNG.DataTypeLibraries-import Text.XML.HXT.RelaxNG.Utils- ( formatStringListQuot- , compareURI- )--import Data.Maybe- ( fromJust- )--{--import qualified Debug.Trace as T--}---- --------------------------------------------------------------validateWithRelaxAndHandleErrors :: IOSArrow XmlTree XmlTree -> IOSArrow XmlTree XmlTree-validateWithRelaxAndHandleErrors theSchema- = validateWithRelax theSchema- >>>- handleErrors--validateWithRelax :: IOSArrow XmlTree XmlTree -> IOSArrow XmlTree XmlTree-validateWithRelax theSchema- = traceMsg 2 "validate with Relax NG schema"- >>>- ( ( normalizeForRelaxValidation -- prepare the document for validation- >>>- getChildren- >>>- isElem -- and select the root element- )- &&&- theSchema- )- >>>- arr2A validateRelax -- compute vaidation errors as a document--handleErrors :: IOSArrow XmlTree XmlTree-handleErrors- = traceDoc "error found when validating with Relax NG schema"- >>>- ( getChildren -- prepare error format- >>>- getText- >>>- arr ("Relax NG validation: " ++)- >>>- mkError c_err- )- >>>- filterErrorMsg -- issue errors and set system status---{- |- normalize a document for validation with Relax NG: remove all namespace declaration attributes,- remove all processing instructions and merge all sequences of text nodes into a single text node--}--normalizeForRelaxValidation :: ArrowXml a => a XmlTree XmlTree-normalizeForRelaxValidation- = processTopDownWithAttrl- (- ( none `when` -- remove all namespace attributes- ( isAttr- >>>- getNamespaceUri- >>>- isA (compareURI xmlnsNamespace)- )- )- >>>- (none `when` isPi) -- processing instructions- )- >>>- collapseAllXText -- all text node sequences are merged into a single text node---- --------------------------------------------------------------{- | Validates a xml document with respect to a Relax NG schema-- * 1.parameter : the arrow for computing the Relax NG schema-- - 2.parameter : list of options for reading and validating-- - 3.parameter : XML document URI-- - arrow-input : ignored-- - arrow-output : list of errors or 'none'--}--validateDocWithRelax :: IOSArrow XmlTree XmlTree -> Attributes -> String -> IOSArrow XmlTree XmlTree-validateDocWithRelax theSchema al doc- = ( if null doc- then root [] []- else readForRelax al doc- )- >>>- validateWithRelax theSchema- >>>- perform handleErrors---{- | Validates a xml document with respect to a Relax NG schema-- * 1.parameter : XML document-- - arrow-input : Relax NG schema-- - arrow-output : list of errors or 'none'--}--validateRelax :: XmlTree -> IOSArrow XmlTree XmlTree-validateRelax xmlDoc- = fromLA- ( createPatternFromXmlTree- >>>- arr (\p -> childDeriv ("",[]) p xmlDoc)- >>>- ( (not . nullable)- `guardsP`- root [] [ (take 1024 . show) ^>> mkText ] -- pattern may be recursive, so the string representation- -- is truncated to 1024 chars to assure termination- )- )---- --------------------------------------------------------------readForRelax :: Attributes -> String -> IOSArrow b XmlTree-readForRelax options schema- = getDocumentContents options schema- >>>- parseXmlDocument False- >>>- canonicalizeAllNodes- >>>- propagateAndValidateNamespaces---- --------------------------------------------------------------{- old stuff -}--validateXMLDoc :: Attributes -> String -> IOSArrow XmlTree XmlTree-validateXMLDoc al xmlDoc- = validateRelax- $<- ( readForRelax al xmlDoc- >>>- normalizeForRelaxValidation- >>>- getChildren- )----- ------------------------------------------------------------------ | tests whether a 'NameClass' contains a particular 'QName'--contains :: NameClass -> QName -> Bool-contains AnyName _ = True-contains (AnyNameExcept nc) n = not (contains nc n)-contains (NsName ns1) qn = ns1 == namespaceUri qn-contains (NsNameExcept ns1 nc) qn = ns1 == namespaceUri qn && not (contains nc qn)-contains (Name ns1 ln1) qn = (ns1 == namespaceUri qn) && (ln1 == localPart qn)-contains (NameClassChoice nc1 nc2) n = (contains nc1 n) || (contains nc2 n)-contains (NCError _) _ = False----- ------------------------------------------------------------------ | tests whether a pattern matches the empty sequence-nullable:: Pattern -> Bool-nullable (Group p1 p2) = nullable p1 && nullable p2-nullable (Interleave p1 p2) = nullable p1 && nullable p2-nullable (Choice p1 p2) = nullable p1 || nullable p2-nullable (OneOrMore p) = nullable p-nullable (Element _ _) = False-nullable (Attribute _ _) = False-nullable (List _) = False-nullable (Value _ _ _) = False-nullable (Data _ _) = False-nullable (DataExcept _ _ _) = False-nullable (NotAllowed _) = False-nullable Empty = True-nullable Text = True-nullable (After _ _) = False----- ------------------------------------------------------------------ | computes the derivative of a pattern with respect to a XML-Child and a 'Context'--childDeriv :: Context -> Pattern -> XmlTree -> Pattern--childDeriv cx p t- | XN.isText t = textDeriv cx p . fromJust . XN.getText $ t- | XN.isElem t = endTagDeriv p4- | otherwise = notAllowed "Call to childDeriv with wrong arguments"- where- children = XN.getChildren $ t- qn = fromJust . XN.getElemName $ t- atts = fromJust . XN.getAttrl $ t- cx1 = ("",[])- p1 = startTagOpenDeriv p qn- p2 = attsDeriv cx1 p1 atts- p3 = startTagCloseDeriv p2- p4 = childrenDeriv cx1 p3 children---- ------------------------------------------------------------------ | computes the derivative of a pattern with respect to a text node--textDeriv :: Context -> Pattern -> String -> Pattern--textDeriv cx (Choice p1 p2) s- = choice (textDeriv cx p1 s) (textDeriv cx p2 s)--textDeriv cx (Interleave p1 p2) s- = choice- (interleave (textDeriv cx p1 s) p2)- (interleave p1 (textDeriv cx p2 s))--textDeriv cx (Group p1 p2) s- = let- p = group (textDeriv cx p1 s) p2- in- if nullable p1- then choice p (textDeriv cx p2 s)- else p--textDeriv cx (After p1 p2) s- = after (textDeriv cx p1 s) p2--textDeriv cx (OneOrMore p) s- = group (textDeriv cx p s) (choice (OneOrMore p) Empty)--textDeriv _ Text _- = Text--textDeriv cx1 (Value (uri, s) value cx2) s1- = case datatypeEqual uri s value cx2 s1 cx1- of- Nothing -> Empty- Just errStr -> notAllowed errStr--textDeriv cx (Data (uri, s) params) s1- = case datatypeAllows uri s params s1 cx- of- Nothing -> Empty- Just errStr -> notAllowed2 errStr--textDeriv cx (DataExcept (uri, s) params p) s1- = case (datatypeAllows uri s params s1 cx)- of- Nothing -> if not $ nullable $ textDeriv cx p s1- then Empty- else notAllowed- ( "Any value except " ++- show (show p) ++- " expected, but value " ++- show (show s1) ++- " found"- )- Just errStr -> notAllowed errStr--textDeriv cx (List p) s- = if nullable (listDeriv cx p (words s))- then Empty- else notAllowed- ( "List with value(s) " ++- show p ++- " expected, but value(s) " ++- formatStringListQuot (words s) ++- " found"- )--textDeriv _ n@(NotAllowed _) _- = n--textDeriv _ p s- = notAllowed- ( "Pattern " ++ show (getPatternName p) ++- " expected, but text " ++ show s ++ " found"- )----- ------------------------------------------------------------------ | To compute the derivative of a pattern with respect to a list of strings,--- simply compute the derivative with respect to each member of the list in turn.--listDeriv :: Context -> Pattern -> [String] -> Pattern--listDeriv _ p []- = p--listDeriv cx p (x:xs)- = listDeriv cx (textDeriv cx p x) xs----- ------------------------------------------------------------------ | computes the derivative of a pattern with respect to a start tag open--startTagOpenDeriv :: Pattern -> QName -> Pattern--startTagOpenDeriv (Choice p1 p2) qn- = choice (startTagOpenDeriv p1 qn) (startTagOpenDeriv p2 qn)--startTagOpenDeriv (Element nc p) qn- | contains nc qn- = after p Empty- | otherwise- = notAllowed $- "Element with name " ++ nameClassToString nc ++- " expected, but " ++ universalName qn ++ " found"--startTagOpenDeriv (Interleave p1 p2) qn- = choice- (applyAfter (flip interleave p2) (startTagOpenDeriv p1 qn))- (applyAfter (interleave p1) (startTagOpenDeriv p2 qn))--startTagOpenDeriv (OneOrMore p) qn- = applyAfter- (flip group (choice (OneOrMore p) Empty))- (startTagOpenDeriv p qn)--startTagOpenDeriv (Group p1 p2) qn- = let- x = applyAfter (flip group p2) (startTagOpenDeriv p1 qn)- in- if nullable p1- then choice x (startTagOpenDeriv p2 qn)- else x--startTagOpenDeriv (After p1 p2) qn- = applyAfter (flip after p2) (startTagOpenDeriv p1 qn)--startTagOpenDeriv n@(NotAllowed _) _- = n--startTagOpenDeriv p qn- = notAllowed ( show p ++ " expected, but Element " ++ universalName qn ++ " found" )---- ---------------------------------------------------------------- auxiliary functions for tracing-{--attsDeriv' cx p ts- = T.trace ("attsDeriv: p=" ++ (take 1000 . show) p ++ ", t=" ++ showXts ts) $- T.trace ("res= " ++ (take 1000 . show) res) res- where- res = attsDeriv cx p ts--attDeriv' cx p t- = T.trace ("attDeriv: p=" ++ (take 1000 . show) p ++ ", t=" ++ showXts [t]) $- T.trace ("res= " ++ (take 1000 . show) res) res- where- res = attDeriv cx p t--}---- | To compute the derivative of a pattern with respect to a sequence of attributes,--- simply compute the derivative with respect to each attribute in turn.--attsDeriv :: Context -> Pattern -> XmlTrees -> Pattern--attsDeriv _ p []- = p-attsDeriv cx p (t : ts)- | XN.isAttr t- = attsDeriv cx (attDeriv cx p t) ts- | otherwise- = notAllowed "Call to attsDeriv with wrong arguments"--attDeriv :: Context -> Pattern -> XmlTree -> Pattern--attDeriv cx (After p1 p2) att- = after (attDeriv cx p1 att) p2--attDeriv cx (Choice p1 p2) att- = choice (attDeriv cx p1 att) (attDeriv cx p2 att)--attDeriv cx (Group p1 p2) att- = choice- (group (attDeriv cx p1 att) p2)- (group p1 (attDeriv cx p2 att))--attDeriv cx (Interleave p1 p2) att- = choice- (interleave (attDeriv cx p1 att) p2)- (interleave p1 (attDeriv cx p2 att))--attDeriv cx (OneOrMore p) att- = group- (attDeriv cx p att)- (choice (OneOrMore p) Empty)--attDeriv cx (Attribute nc p) att- | isa- &&- not (contains nc qn)- = notAllowed1 $- "Attribute with name " ++ nameClassToString nc- ++ " expected, but " ++ universalName qn ++ " found"- | isa- &&- ( ( nullable p- &&- whitespace val- )- || nullable p'- )- = Empty- | isa- = err' p'- where- isa = XN.isAttr $ att- qn = fromJust . XN.getAttrName $ att- av = XN.getChildren $ att- val = showXts av- p' = textDeriv cx p val-- err' (NotAllowed (ErrMsg _l es))- = err'' (": " ++ head es)- err' _- = err'' ""- err'' e- = notAllowed2 $- "Attribute value \"" ++ val ++- "\" does not match datatype spec " ++ show p ++ e--attDeriv _ n@(NotAllowed _) _- = n--attDeriv _ _p att- = notAllowed $- "No matching pattern for attribute '" ++ showXts [att] ++ "' found"---- ------------------------------------------------------------------ | computes the derivative of a pattern with respect to a start tag close--startTagCloseDeriv :: Pattern -> Pattern--startTagCloseDeriv (After p1 p2)- = after (startTagCloseDeriv p1) p2--startTagCloseDeriv (Choice p1 p2)- = choice- (startTagCloseDeriv p1)- (startTagCloseDeriv p2)--startTagCloseDeriv (Group p1 p2)- = group- (startTagCloseDeriv p1)- (startTagCloseDeriv p2)--startTagCloseDeriv (Interleave p1 p2)- = interleave- (startTagCloseDeriv p1)- (startTagCloseDeriv p2)--startTagCloseDeriv (OneOrMore p)- = oneOrMore (startTagCloseDeriv p)--startTagCloseDeriv (Attribute nc _)- = notAllowed1 $- "Attribut with name, " ++ show nc ++- " expected, but no more attributes found"--startTagCloseDeriv p- = p----- ------------------------------------------------------------------ | Computing the derivative of a pattern with respect to a list of children involves--- computing the derivative with respect to each pattern in turn, except--- that whitespace requires special treatment.--childrenDeriv :: Context -> Pattern -> XmlTrees -> Pattern-childrenDeriv _cx p@(NotAllowed _) _- = p--childrenDeriv cx p []- = childrenDeriv cx p [XN.mkText ""]--childrenDeriv cx p [tt]- | ist- &&- whitespace s- = choice p p1- | ist- = p1- where- ist = XN.isText tt- s = fromJust . XN.getText $ tt- p1 = childDeriv cx p tt--childrenDeriv cx p children- = stripChildrenDeriv cx p children--stripChildrenDeriv :: Context -> Pattern -> XmlTrees -> Pattern-stripChildrenDeriv _ p []- = p--stripChildrenDeriv cx p (h:t)- = stripChildrenDeriv cx- ( if strip h- then p- else (childDeriv cx p h)- ) t----- ------------------------------------------------------------------ | computes the derivative of a pattern with respect to a end tag--endTagDeriv :: Pattern -> Pattern-endTagDeriv (Choice p1 p2)- = choice (endTagDeriv p1) (endTagDeriv p2)--endTagDeriv (After p1 p2)- | nullable p1- = p2- | otherwise- = notAllowed $- show p1 ++ " expected"--endTagDeriv n@(NotAllowed _)- = n--endTagDeriv _- = notAllowed "Call to endTagDeriv with wrong arguments"---- ------------------------------------------------------------------ | applies a function (first parameter) to the second part of a after pattern--applyAfter :: (Pattern -> Pattern) -> Pattern -> Pattern--applyAfter f (After p1 p2) = after p1 (f p2)-applyAfter f (Choice p1 p2) = choice (applyAfter f p1) (applyAfter f p2)-applyAfter _ n@(NotAllowed _) = n-applyAfter _ _ = notAllowed "Call to applyAfter with wrong arguments"---- ------------------------ mothers little helpers--strip :: XmlTree -> Bool-strip = maybe False whitespace . XN.getText--whitespace :: String -> Bool-whitespace = all isXmlSpaceChar--showXts :: XmlTrees -> String-showXts = concat . runLA (xshow $ arrL id)---- ------------------------------------------------------------
− src/Text/XML/HXT/RelaxNG/Validator.hs
@@ -1,308 +0,0 @@--- |--- This module exports the core functions from the basic validation und simplification libraries.--- It also exports some helper functions for easier access to the validation functionality.--module Text.XML.HXT.RelaxNG.Validator- ( validateDocumentWithRelaxSchema- , validateDocumentWithRelax-- , validate- , validateSchema- , validateWithSpezification- , validateSchemaWithSpezification- , validateWithoutSpezification- , module Text.XML.HXT.RelaxNG.Validation- , module Text.XML.HXT.RelaxNG.Simplification- )-where--import Control.Arrow.ListArrows--import Text.XML.HXT.DOM.Interface-import Text.XML.HXT.Arrow.XmlArrow-import Text.XML.HXT.Arrow.XmlIOStateArrow--import Text.XML.HXT.RelaxNG.Validation-import Text.XML.HXT.RelaxNG.Simplification-import Text.XML.HXT.RelaxNG.Schema as S---- --------------------------------------------------------------{- |- validate a document with a Relax NG schema-- * 1.parameter : the option list for validation-- - 2.parameter : the URI of the Relax NG Schema-- - arrow-input : the document to be validated, namespaces must have been processed-- - arrow-output : the input document, or in case of validation errors, an empty document with status information in the root--options evaluated by validateDocumentWithRelaxSchema:-- * 'a_check_restrictions' : check Relax NG schema restrictions when simplifying the schema (default: on)-- - 'a_validate_externalRef' : validate a Relax NG schema referenced by a externalRef-Pattern (default: on)-- - 'a_validate_include' : validate a Relax NG schema referenced by a include-Pattern (default: on)--all other options are propagated to the read functions for schema input--example:--> validateDocumentWithRelaxSchema [(a_check_restrictions, "0")] "testSchema.rng"----}--validateDocumentWithRelaxSchema :: Attributes -> String -> IOStateArrow s XmlTree XmlTree-validateDocumentWithRelaxSchema userOptions relaxSchema- = withOtherUserState ()- $- ( ( validate' $< validSchema ) -- try to validate, only possible if schema is o.k.- `orElse`- this- )- `when`- documentStatusOk -- only do something when document status is ok- where- validate' schema- = setDocumentStatusFromSystemState "read and build Relax NG schema"- >>>- validateDocumentWithRelax schema-- validSchema- = traceMsg 2 ( "read Relax NG schema document: " ++ show relaxSchema )- >>>- readForRelax remainingOptions relaxSchema- >>>- perform ( let checkSchema = True in -- test option in al- if checkSchema- then validateWithRelaxAndHandleErrors S.relaxSchemaArrow- else none- )- >>>- traceMsg 2 "create simplified schema"- >>>- createSimpleForm remainingOptions- ( hasOption a_check_restrictions )- ( hasOption a_validate_externalRef )- ( hasOption a_validate_include )- >>>- traceDoc "simplified schema"- >>>- perform ( getErrors- >>>- handleSimplificationErrors- )- hasOption n- = optionIsSet n options-- options = addEntries userOptions defaultOptions-- defaultOptions- = [ ( a_check_restrictions, v_1 )- , ( a_validate_externalRef, v_1 )- , ( a_validate_include, v_1 )- ]-- remainingOptions- = filter (not . flip hasEntry defaultOptions . fst) options----handleSimplificationErrors :: IOSArrow XmlTree XmlTree-handleSimplificationErrors- = traceDoc "simplification errors"- >>>- getChildren >>> getAttrValue "desc"- >>>- arr ("Relax NG validation: " ++)- >>>- mkError c_err- >>>- filterErrorMsg---{- | validate an XML document with respect to a Relax NG schema-- * 1.parameter : the valid and simplified schema as XML tree-- - arrow-input : the document to be validated-- - arrow-output : the validated and unchanged document or the empty document with status information set in the root node--}--validateDocumentWithRelax :: XmlTree -> IOSArrow XmlTree XmlTree-validateDocumentWithRelax schema- = ( traceMsg 1 "validate document with Relax NG schema"- >>>- perform ( validateWithRelaxAndHandleErrors (constA schema) )- >>>- setDocumentStatusFromSystemState "validate document with Relax NG schema"- )- `when` documentStatusOk -- only do something when document status is ok---{- |- normalize a document for Relax NG validation,- call the 'Text.XML.HXT.RelaxNG.Validation.validateRelax' function for doing the hard work,- and issue errors-- * 1.parameter : the arrow for computing the schema-- - arrow-input : the document to be validated-- - arrow-output : nothing--}---- --------------------------------------------------------------{- | Document validation--Validates a xml document with respect to a Relax NG schema.--First, the schema is validated with respect to the Relax NG Spezification. If no error is found, the xml document is validated with respect to the schema.-- * 1.parameter : list of options; namespace progagation is always done-- - 2.parameter : XML document-- - 3.parameter : Relax NG schema file--available options:-- * 'a_do_not_check_restrictions' : do not check Relax NG schema restrictions (includes do-not-validate-externalRef, do-not-validate-include)-- - 'a_do_not_validate_externalRef' : do not validate a Relax NG schema referenced by a externalRef-Pattern-- - 'a_validate_externalRef' : validate a Relax NG schema referenced by a externalRef-Pattern (default)-- - 'a_do_not_validate_include' : do not validate a Relax NG schema referenced by a include-Pattern-- - 'a_validate_include' : validate a Relax NG schema referenced by a include-Pattern (default)-- - 'a_output_changes' : output Pattern transformations in case of an error-- - 'a_do_not_collect_errors' : stop Relax NG simplification after the first error has occurred-- - all 'Text.XML.HXT.Arrow.ReadDocument.readDocument' options--example:--> validate [(a_do_not_check_restrictions, "1")] "test.xml" "testSchema.rng"---}-validate :: Attributes -> String -> String -> IOSArrow n XmlTree-validate al xmlDocument relaxSchema- = S.relaxSchemaArrow- >>>- validateWithSpezification al xmlDocument relaxSchema-----{- | Relax NG schema validation--Validates a Relax NG schema with respect to the Relax NG Spezification.-- * 1.parameter : list of available options (see also: 'validate')-- - 2.parameter : Relax NG schema file---}-validateSchema :: Attributes -> String -> IOSArrow n XmlTree-validateSchema al relaxSchema- = validate al "" relaxSchema----{- | Document validation--Validates a xml document with respect to a Relax NG schema. Similar to 'validate', but the Relax NG Specification is not created. Can be used, to check a list of documents more efficiently.-- * 1.parameter : list of available options (see also: 'validate')-- - 2.parameter : XML document-- - 3.parameter : Relax NG schema file-- - arrow-input : Relax NG Specification in simple form--example:--> Text.XML.HXT.RelaxNG.Schema.relaxSchemaArrow-> >>>-> ( validateWithSpezification [] "foo.xml" "foo.rng"-> &&&-> validateWithSpezification [] "bar.xml" "bar.rng"-> )----}-validateWithSpezification :: Attributes -> String -> String -> IOSArrow XmlTree XmlTree-validateWithSpezification al xmlDocument relaxSchema- = -- validation of the schema with respect to the specification- -- returns a list of errors or none if the schema is correct-- ( validateRelax $< ( readForRelax al relaxSchema- >>>- getChildren- )- )- `orElse`-- -- validation of the xml document with respect to the schema- -- returns a list of errors or none if the xml document is correct-- validateWithoutSpezification al xmlDocument relaxSchema--{- | Relax NG schema validation-- see 'validateSchema' and 'validateWithSpezification'-- * 1.parameter : list of available options (see also: 'validate')-- - 2.parameter : Relax NG schema file-- - arrow-input : Relax NG Specification in simple form--}--validateSchemaWithSpezification :: Attributes -> String -> IOSArrow XmlTree XmlTree-validateSchemaWithSpezification al relaxSchema- = validateWithSpezification al "" relaxSchema----{- | Document validation--Validates a xml document with respect to a Relax NG schema, but the schema is @not@ validated with respect to a specification first. Should be used only for valid Relax NG schemes.-- * 1.parameter : list of available options (see also: 'validate')-- - 2.parameter : XML document-- - 3.parameter : Relax NG schema file---}---validateWithoutSpezification :: Attributes -> String -> String -> IOSArrow n XmlTree-validateWithoutSpezification al xmlDocument relaxSchema- = readForRelax al relaxSchema- >>>- createSimpleForm al True True True- >>>- ( ( getErrors >>> perform handleSimplificationErrors ) -- issue errors in schema simplification- `orElse`- ( if null xmlDocument -- no errors: validate document- then none- else validateRelax $< ( readForRelax al xmlDocument- >>>- normalizeForRelaxValidation- >>>- getChildren- )- )- )
− src/Text/XML/HXT/RelaxNG/XmlSchema/DataTypeLibW3C.hs
@@ -1,610 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C- Copyright : Copyright (C) 2005 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : experimental- Portability: portable- Version : $Id$-- Datatype library for the W3C XML schema datatypes---}---- --------------------------------------------------------------module Text.XML.HXT.RelaxNG.XmlSchema.DataTypeLibW3C- ( w3cNS- , w3cDatatypeLib-- , xsd_string -- data type names- , xsd_normalizedString- , xsd_token- , xsd_language- , xsd_NMTOKEN- , xsd_NMTOKENS- , xsd_Name- , xsd_NCName- , xsd_ID- , xsd_IDREF- , xsd_IDREFS- , xsd_ENTITY- , xsd_ENTITIES- , xsd_anyURI- , xsd_QName- , xsd_NOTATION- , xsd_hexBinary- , xsd_base64Binary- , xsd_decimal-- , xsd_length -- facet names- , xsd_maxLength- , xsd_minLength- , xsd_maxExclusive- , xsd_minExclusive- , xsd_maxInclusive- , xsd_minInclusive- , xsd_totalDigits- , xsd_fractionDigits- , xsd_pattern- , xsd_enumeration- )-where--import Data.Maybe-import Data.Ratio--import Network.URI ( isURIReference )--import Text.XML.HXT.DOM.QualifiedName ( isWellformedQualifiedName- , isNCName- )-import Text.XML.HXT.RelaxNG.DataTypeLibUtils-import Text.XML.HXT.RelaxNG.XmlSchema.Regex ( Regex- , matchWithRE- )-import Text.XML.HXT.RelaxNG.XmlSchema.RegexParser- ( parseRegex- )---- ---------------------------------------------------------------- | Namespace of the W3C XML schema datatype library--w3cNS :: String-w3cNS = "http://www.w3.org/2001/XMLSchema-datatypes"---xsd_string- , xsd_normalizedString- , xsd_token- , xsd_language- , xsd_NMTOKEN- , xsd_NMTOKENS- , xsd_Name- , xsd_NCName- , xsd_ID- , xsd_IDREF- , xsd_IDREFS- , xsd_ENTITY- , xsd_ENTITIES- , xsd_anyURI- , xsd_QName- , xsd_NOTATION- , xsd_hexBinary- , xsd_base64Binary- , xsd_decimal- , xsd_integer- , xsd_nonPositiveInteger- , xsd_negativeInteger- , xsd_nonNegativeInteger- , xsd_positiveInteger- , xsd_long- , xsd_int- , xsd_short- , xsd_byte- , xsd_unsignedLong- , xsd_unsignedInt- , xsd_unsignedShort- , xsd_unsignedByte :: String--xsd_string = "string"-xsd_normalizedString = "normalizedString"-xsd_token = "token"-xsd_language = "language"-xsd_NMTOKEN = "NMTOKEN"-xsd_NMTOKENS = "NMTOKENS"-xsd_Name = "Name"-xsd_NCName = "NCName"-xsd_ID = "ID"-xsd_IDREF = "IDREF"-xsd_IDREFS = "IDREFS"-xsd_ENTITY = "ENTITY"-xsd_ENTITIES = "ENTITIES"-xsd_anyURI = "anyURI"-xsd_QName = "QName"-xsd_NOTATION = "NOTATION"-xsd_hexBinary = "hexBinary"-xsd_base64Binary = "base64Binary"-xsd_decimal = "decimal"-xsd_integer = "integer"-xsd_nonPositiveInteger = "nonPositiveInteger"-xsd_negativeInteger = "negativeInteger"-xsd_nonNegativeInteger = "nonNegativeInteger"-xsd_positiveInteger = "positiveInteger"-xsd_long = "long"-xsd_int = "int"-xsd_short = "short"-xsd_byte = "byte"-xsd_unsignedLong = "unsignedLong"-xsd_unsignedInt = "unsignedInt"-xsd_unsignedShort = "unsignedShort"-xsd_unsignedByte = "unsignedByte"---xsd_length- , xsd_maxLength- , xsd_minLength- , xsd_maxExclusive- , xsd_minExclusive- , xsd_maxInclusive- , xsd_minInclusive- , xsd_totalDigits- , xsd_fractionDigits- , xsd_pattern- , xsd_enumeration :: String--xsd_length = rng_length-xsd_maxLength = rng_maxLength-xsd_minLength = rng_minLength--xsd_maxExclusive = rng_maxExclusive-xsd_minExclusive = rng_minExclusive-xsd_maxInclusive = rng_maxInclusive-xsd_minInclusive = rng_minInclusive--xsd_totalDigits = "totalDigits"-xsd_fractionDigits = "fractionDigits"--xsd_pattern = "pattern"-xsd_enumeration = "enumeration"---- -------------------------------------------- | The main entry point to the W3C XML schema datatype library.------ The 'DTC' constructor exports the list of supported datatypes and params.--- It also exports the specialized functions to validate a XML instance value with--- respect to a datatype.-w3cDatatypeLib :: DatatypeLibrary-w3cDatatypeLib = (w3cNS, DTC datatypeAllowsW3C datatypeEqualW3C w3cDatatypes)----- | All supported datatypes of the library-w3cDatatypes :: AllowedDatatypes-w3cDatatypes = [ (xsd_string, stringParams)- , (xsd_normalizedString, stringParams)- , (xsd_token, stringParams)- , (xsd_language, stringParams)- , (xsd_NMTOKEN, stringParams)- , (xsd_NMTOKENS, listParams )- , (xsd_Name, stringParams)- , (xsd_NCName, stringParams)- , (xsd_ID, stringParams)- , (xsd_IDREF, stringParams)- , (xsd_IDREFS, listParams )- , (xsd_ENTITY, stringParams)- , (xsd_ENTITIES, listParams )- , (xsd_anyURI, stringParams)- , (xsd_QName, stringParams)- , (xsd_NOTATION, stringParams)- , (xsd_hexBinary, stringParams)- , (xsd_base64Binary, stringParams)- , (xsd_decimal, decimalParams)- , (xsd_integer, integerParams)- , (xsd_nonPositiveInteger, integerParams)- , (xsd_negativeInteger, integerParams)- , (xsd_nonNegativeInteger, integerParams)- , (xsd_positiveInteger, integerParams)- , (xsd_long, integerParams)- , (xsd_int, integerParams)- , (xsd_short, integerParams)- , (xsd_byte, integerParams)- , (xsd_unsignedLong, integerParams)- , (xsd_unsignedInt, integerParams)- , (xsd_unsignedShort, integerParams)- , (xsd_unsignedByte, integerParams)- ]---- -------------------------------------------- | List of allowed params for the string datatypes-stringParams :: AllowedParams-stringParams = xsd_pattern : map fst fctTableString---- ------------------------------------------patternValid :: ParamList -> CheckString-patternValid params- = foldr (>>>) ok . map paramPatternValid $ params- where- paramPatternValid (pn, pv)- | pn == xsd_pattern = assert (patParamValid pv) (errorMsgParam pn pv)- | otherwise = ok--patParamValid :: String -> String -> Bool-patParamValid regex a- = case parseRegex regex of- (Left _ ) -> False- (Right ex) -> isNothing . matchWithRE ex $ a---- -------------------------------------------- | List of allowed params for the decimal datatypes--decimalParams :: AllowedParams-decimalParams = xsd_pattern : map fst fctTableDecimal--fctTableDecimal :: [(String, String -> Rational -> Bool)]-fctTableDecimal- = [ (xsd_maxExclusive, cvd (>))- , (xsd_minExclusive, cvd (<))- , (xsd_maxInclusive, cvd (>=))- , (xsd_minInclusive, cvd (<=))- , (xsd_totalDigits, cvi (\ l v -> totalDigits v == l))- , (xsd_fractionDigits, cvi (\ l v -> fractionDigits v == l))- ]- where- cvd :: (Rational -> Rational -> Bool) -> (String -> Rational -> Bool)- cvd op = \ x y -> isDecimal x && readDecimal x `op` y-- cvi :: (Int -> Rational -> Bool) -> (String -> Rational -> Bool)- cvi op = \ x y -> isNumber x && read x `op` y--decimalValid :: ParamList -> CheckA Rational Rational-decimalValid params- = foldr (>>>) ok . map paramDecimalValid $ params- where- paramDecimalValid (pn, pv)- = assert- ((fromMaybe (const . const $ True) . lookup pn $ fctTableDecimal) pv)- (errorMsgParam pn pv . showDecimal)---- -------------------------------------------- | List of allowed params for the decimal and integer datatypes--integerParams :: AllowedParams-integerParams = xsd_pattern : map fst fctTableInteger--fctTableInteger :: [(String, String -> Integer -> Bool)]-fctTableInteger- = [ (xsd_maxExclusive, cvi (>))- , (xsd_minExclusive, cvi (<))- , (xsd_maxInclusive, cvi (>=))- , (xsd_minInclusive, cvi (<=))- , (xsd_totalDigits, cvi (\ l v -> totalD v == toInteger l))- ]- where- cvi :: (Integer -> Integer -> Bool) -> (String -> Integer -> Bool)- cvi op = \ x y -> isNumber x && read x `op` y-- totalD i- | i < 0 = totalD (0-i)- | otherwise = toInteger . length . show $ i--integerValid :: DatatypeName -> ParamList -> CheckA Integer Integer-integerValid datatype params- = assertInRange- >>>- (foldr (>>>) ok . map paramIntegerValid $ params)- where- assertInRange :: CheckA Integer Integer- assertInRange- = assert- (fromMaybe (const True) . lookup datatype $ integerRangeTable)- (\ v -> ( "Datatype " ++ show datatype ++- " with value = " ++ show v ++- " not in integer value range"- )- )- paramIntegerValid (pn, pv)- = assert- ((fromMaybe (const . const $ True) . lookup pn $ fctTableInteger) pv)- (errorMsgParam pn pv . show)--integerRangeTable :: [(String, Integer -> Bool)]-integerRangeTable = [ (xsd_integer, const True)- , (xsd_nonPositiveInteger, (<=0) )- , (xsd_negativeInteger, ( <0) )- , (xsd_nonNegativeInteger, (>=0) )- , (xsd_positiveInteger, ( >0) )- , (xsd_long, inR 9223372036854775808)- , (xsd_int, inR 2147483648)- , (xsd_short, inR 32768)- , (xsd_byte, inR 128)- , (xsd_unsignedLong, inP 18446744073709551616)- , (xsd_unsignedInt, inP 4294967296)- , (xsd_unsignedShort, inP 65536)- , (xsd_unsignedByte, inP 256)- ]- where- inR b i = (0 - b) <= i && i < b- inP b i = 0 <= i && i < b---- -------------------------------------------- | List of allowed params for the list datatypes--listParams :: AllowedParams-listParams = xsd_pattern : map fst fctTableList--listValid :: DatatypeName -> ParamList -> CheckString-listValid d = stringValidFT fctTableList d 0 (-1)---- ------------------------------------------isNameList :: (String -> Bool) -> String -> Bool-isNameList p w- = not (null ts) && all p ts- where- ts = words w---- ------------------------------------------rex :: String -> Regex-rex = either undefined id . parseRegex--isRex :: Regex -> String -> Bool-isRex ex = isNothing . matchWithRE ex---- ------------------------------------------rexLanguage- , rexHexBinary- , rexBase64Binary- , rexDecimal- , rexInteger :: Regex--rexLanguage = rex "[A-Za-z]{1,8}(-[A-Za-z]{1,8})*"-rexHexBinary = rex "([A-Fa-f0-9]{2})*"-rexBase64Binary = rex $- "(" ++ b64 ++ "{4})*((" ++ b64 ++ "{2}==)|(" ++ b64 ++ "{3}=)|)"- where- b64 = "[A-Za-z0-9+/]"-rexDecimal = rex "(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))"-rexInteger = rex "(\\+|-)?[0-9]+"--isLanguage- , isHexBinary- , isBase64Binary- , isDecimal- , isInteger :: String -> Bool--isLanguage = isRex rexLanguage-isHexBinary = isRex rexHexBinary-isBase64Binary = isRex rexBase64Binary-isDecimal = isRex rexDecimal-isInteger = isRex rexInteger---- ------------------------------------------normBase64 :: String -> String-normBase64 = filter isB64- where- isB64 c = ( 'A' <= c && c <= 'Z')- ||- ( 'a' <= c && c <= 'z')- ||- ( '0' <= c && c <= '9')- ||- c == '+'- ||- c == '/'- ||- c == '='---- ------------------------------------------readDecimal- , readDecimal' :: String -> Rational--readDecimal ('+':s) = readDecimal' s-readDecimal ('-':s) = negate (readDecimal' s)-readDecimal s = readDecimal' s--readDecimal' s- | f == 0 = (n % 1)- | otherwise = (n % 1) + (f % (10 ^ (toInteger (length fs))))- where- (ns, fs') = span (/= '.') s- fs = drop 1 fs'-- f :: Integer- f | null fs = 0- | otherwise = read fs- n :: Integer- n | null ns = 0- | otherwise = read ns--totalDigits- , totalDigits'- , fractionDigits :: Rational -> Int--totalDigits r- | r == 0 = 0- | r < 0 = totalDigits' . negate $ r- | otherwise = totalDigits' $ r--totalDigits' r- | denominator r == 1 = length . show . numerator $ r- | r < (1%1) = (\ x -> x-1) . totalDigits' . (+ (1%1)) $ r- | otherwise = totalDigits' . (* (10 % 1)) $ r--fractionDigits r- | denominator r == 1 = 0- | otherwise = (+1) . fractionDigits . (* (10 % 1)) $ r--showDecimal- , showDecimal' :: Rational -> String--showDecimal d- | d < 0 = ('-':) . showDecimal' . negate $ d- | d < 1 = drop 1 . showDecimal' . (+ (1%1)) $ d- | otherwise = showDecimal' $ d--showDecimal' d- | denominator d == 1 = show . numerator $ d- | otherwise = times10 0 $ d- where- times10 i' d'- | denominator d' == 1 = let- (x, y) = splitAt i' . reverse . show . numerator $ d'- in- reverse y ++ "." ++ reverse x- | otherwise = times10 (i' + 1) (d' * (10 % 1))---- -------------------------------------------- | Tests whether a XML instance value matches a data-pattern.--- (see also: 'stringValid')--datatypeAllowsW3C :: DatatypeAllows-datatypeAllowsW3C d params value _- = performCheck check value- where- validString normFct- = validPattern- >>>- arr normFct- >>>- validLength-- validNormString- = validString normalizeWhitespace-- validPattern- = patternValid params-- validLength- = stringValid d 0 (-1) params-- validList- = validPattern- >>>- arr normalizeWhitespace- >>>- validListLength-- validListLength- = listValid d params-- validName isN- = assertW3C isN-- validNCName- = validNormString >>> validName isNCName-- validQName- = validNormString >>> validName isWellformedQualifiedName-- validDecimal- = arr normalizeWhitespace- >>>- assertW3C isDecimal- >>>- checkWith readDecimal (decimalValid params)-- validInteger inRange- = validPattern- >>>- arr normalizeWhitespace- >>>- assertW3C isInteger- >>>- checkWith read (integerValid inRange params)-- check :: CheckString- check = fromMaybe notFound . lookup d $ checks-- notFound = failure $ errorMsgDataTypeNotAllowed w3cNS d params-- checks :: [(String, CheckA String String)]- checks = [ (xsd_string, validString id)- , (xsd_normalizedString, validString normalizeBlanks)- , (xsd_token, validNormString)- , (xsd_language, validNormString >>> assertW3C isLanguage)- , (xsd_NMTOKEN, validNormString >>> validName isNmtoken)- , (xsd_NMTOKENS, validList >>> validName (isNameList isNmtoken))- , (xsd_Name, validNormString >>> validName isName)- , (xsd_NCName, validNCName)- , (xsd_ID, validNCName)- , (xsd_IDREF, validNCName)- , (xsd_IDREFS, validList >>> validName (isNameList isNCName))- , (xsd_ENTITY, validNCName)- , (xsd_ENTITIES, validList >>> validName (isNameList isNCName))- , (xsd_anyURI, validName isURIReference >>> validString escapeURI)- , (xsd_QName, validQName)- , (xsd_NOTATION, validQName)- , (xsd_hexBinary, validString id >>> assertW3C isHexBinary)- , (xsd_base64Binary, validString normBase64 >>> assertW3C isBase64Binary)- , (xsd_decimal, validPattern >>> validDecimal)- , (xsd_integer, validInteger xsd_integer)- , (xsd_nonPositiveInteger, validInteger xsd_nonPositiveInteger)- , (xsd_negativeInteger, validInteger xsd_negativeInteger)- , (xsd_nonNegativeInteger, validInteger xsd_nonNegativeInteger)- , (xsd_positiveInteger, validInteger xsd_positiveInteger)- , (xsd_long, validInteger xsd_long)- , (xsd_int, validInteger xsd_int)- , (xsd_short, validInteger xsd_short)- , (xsd_byte, validInteger xsd_byte)- , (xsd_unsignedLong, validInteger xsd_unsignedLong)- , (xsd_unsignedInt, validInteger xsd_unsignedInt)- , (xsd_unsignedShort, validInteger xsd_unsignedShort)- , (xsd_unsignedByte, validInteger xsd_unsignedByte)- ]- assertW3C p = assert p errW3C- errW3C = errorMsgDataLibQName w3cNS d---- -------------------------------------------- | Tests whether a XML instance value matches a value-pattern.--datatypeEqualW3C :: DatatypeEqual-datatypeEqualW3C d s1 _ s2 _- = performCheck check (s1, s2)- where- check :: CheckA (String, String) (String, String)- check = maybe notFound found . lookup d $ norm-- notFound = failure $ const (errorMsgDataTypeNotAllowed0 w3cNS d)-- found nf = arr (\ (x1, x2) -> (nf x1, nf x2)) -- normalize both values- >>>- assert (uncurry (==)) (uncurry $ errorMsgEqual d) -- and check on (==)-- norm = [ (xsd_string, id )- , (xsd_normalizedString, normalizeBlanks )- , (xsd_token, normalizeWhitespace )- , (xsd_language, normalizeWhitespace )- , (xsd_NMTOKEN, normalizeWhitespace )- , (xsd_NMTOKENS, normalizeWhitespace )- , (xsd_Name, normalizeWhitespace )- , (xsd_NCName, normalizeWhitespace )- , (xsd_ID, normalizeWhitespace )- , (xsd_IDREF, normalizeWhitespace )- , (xsd_IDREFS, normalizeWhitespace )- , (xsd_ENTITY, normalizeWhitespace )- , (xsd_ENTITIES, normalizeWhitespace )- , (xsd_anyURI, escapeURI . normalizeWhitespace )- , (xsd_QName, normalizeWhitespace )- , (xsd_NOTATION, normalizeWhitespace )- , (xsd_hexBinary, id )- , (xsd_base64Binary, normBase64 )- , (xsd_decimal, show . readDecimal . normalizeWhitespace )- ]---- ----------------------------------------
− src/Text/XML/HXT/RelaxNG/XmlSchema/Regex.hs
@@ -1,317 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.RelaxNG.XmlSchema.Regex- Copyright : Copyright (C) 2005 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : experimental- Portability: portable-- W3C XML Schema Regular Expression Matcher-- Grammar can be found under <http://www.w3.org/TR/xmlschema11-2/#regexs>---}---- --------------------------------------------------------------module Text.XML.HXT.RelaxNG.XmlSchema.Regex- ( Regex- , chars- , charRngs- , mkZero- , mkUnit- , mkSym- , mkSym1- , mkSymRng- , mkDot- , mkStar- , mkAlt- , mkSeq- , mkRep- , mkRng- , mkOpt- , mkDif- , mkCompl- , isZero- , nullable- , delta- , matchWithRE- , (<&&>)- , (<||>)- )-where--import Data.List ( foldl' )---- --------------------------------------------------------------data Regex = Zero String- | Unit- | Sym (Char -> Bool)- | Dot- | Star Regex- | Alt Regex Regex- | Seq Regex Regex- | Rep Int Regex -- 1 or more repetitions- | Rng Int Int Regex -- n..m repetitions- | Dif Regex Regex -- r1 - r2---- --------------------------------------------------------------{- just for documentation--class Inv a where- inv :: a -> Bool--instance Inv Regex where- inv (Zero _) = True- inv Unit = True- inv (Sym p) = not . null . chars $ p- inv Dot = True- inv (Star e) = inv e- inv (Alt e1 e2) = inv e1 &&- inv e2- inv (Seq e1 e2) = inv e1 &&- inv e2- inv (Rep i e) = i > 0 && inv e- inv (Rng i j e) = (i < j || (i == j && i > 1)) &&- inv e- inv (Dif e1 e2) = inv e1 &&- inv e2--}---- --------------------------------------------------------------- | enumerate all chars specified by a predicate------ this function is expensive, it should only be used for testing--chars :: (Char -> Bool) -> [Char]-chars p = filter p $ [minBound .. maxBound]--charRngs :: [Char] -> [(Char, Char)]-charRngs [] = []-charRngs (x:xs) = charRng x xs- where- charRng y [] = (x,y) : []- charRng y xs'@(x1:xs1)- | x1 == succ y = charRng x1 xs1- | otherwise = (x,y) : charRngs xs'---- ------------------------------------------------------------------ smart constructors--mkZero :: String -> Regex-mkZero = Zero-{-# INLINE mkZero #-}--mkUnit :: Regex-mkUnit = Unit-{-# INLINE mkUnit #-}--mkSym :: (Char -> Bool) -> Regex-mkSym = Sym-{-# INLINE mkSym #-}--mkSym1 :: Char -> Regex-mkSym1 c = mkSym (==c)--mkSymRng :: Char -> Char -> Regex-mkSymRng c1 c2- | c1 == minBound &&- c2 == maxBound = mkDot- | c1 <= c2 = mkSym $ (>= c1) <&&> (<= c2)- | otherwise = mkZero $ "empty char range"--mkDot :: Regex-mkDot = Dot-{-# INLINE mkDot #-}--mkStar :: Regex -> Regex-mkStar (Zero _) = mkUnit -- {}* == ()-mkStar e@Unit = e -- ()* == ()-mkStar e@(Star _e1) = e -- (r*)* == r*-mkStar (Rep 1 e1) = mkStar e1 -- (r+)* == r*-mkStar e@(Alt _ _) = Star (rmStar e) -- (a*|b)* == (a|b)*-mkStar e = Star e--rmStar :: Regex -> Regex-rmStar (Alt e1 e2) = mkAlt (rmStar e1) (rmStar e2)-rmStar (Star e1) = rmStar e1-rmStar (Rep 1 e1) = rmStar e1-rmStar e1 = e1--mkAlt :: Regex -> Regex -> Regex-mkAlt e1 (Zero _) = e1 -- e1 u {} = e1-mkAlt (Zero _) e2 = e2 -- {} u e2 = e2-mkAlt e1@(Star Dot) _e2 = e1 -- A* u e1 = A*-mkAlt _e1 e2@(Star Dot) = e2 -- e1 u A* = A*-mkAlt (Sym p1) (Sym p2) = mkSym $ p1 <||> p2 -- melting of predicates-mkAlt e1 e2@(Sym _) = mkAlt e2 e1 -- symmetry: predicates always first-mkAlt e1@(Sym _) (Alt e2@(Sym _) e3) = mkAlt (mkAlt e1 e2) e3 -- prepare melting of predicates-mkAlt (Alt e1 e2) e3 = mkAlt e1 (mkAlt e2 e3) -- associativity-mkAlt e1 e2 = Alt e1 e2--mkSeq :: Regex -> Regex -> Regex-mkSeq e1@(Zero _) _e2 = e1-mkSeq _e1 e2@(Zero _) = e2-mkSeq Unit e2 = e2-mkSeq e1 Unit = e1-mkSeq (Seq e1 e2) e3 = mkSeq e1 (mkSeq e2 e3)-mkSeq e1 e2 = Seq e1 e2--mkRep :: Int -> Regex -> Regex-mkRep 0 e = mkStar e-mkRep _ e@(Zero _) = e-mkRep _ e@Unit = e-mkRep i e = Rep i e--mkRng :: Int -> Int -> Regex -> Regex-mkRng 0 0 _e = mkUnit-mkRng 1 1 e = e-mkRng lb ub _e- | lb > ub = Zero $- "illegal range " ++- show lb ++ ".." ++ show ub-mkRng _l _u e@(Zero _) = e-mkRng _l _u e@Unit = e-mkRng lb ub e = Rng lb ub e--mkOpt :: Regex -> Regex-mkOpt = mkRng 0 1--mkDif :: Regex -> Regex -> Regex-mkDif e1@(Zero _) _e2 = e1-mkDif e1 (Zero _) = e1-mkDif _e1 (Star Dot) = mkZero "empty set in difference expr"-mkDif Dot (Sym p) = mkSym (not . p)-mkDif (Sym _) Dot = mkZero "empty set of chars in difference expr"-mkDif (Sym p1) (Sym p2)- | null . chars $ (\ x -> p1 x && not (p2 x))- = mkZero "empty set of chars in difference expr"-mkDif e1 e2 = Dif e1 e2--mkCompl :: Regex -> Regex-mkCompl = mkDif mkDot---- --------------------------------------------------------------instance Show Regex where- show (Zero s) = "{err:" ++ s ++ "}"- show Unit = "()"- show (Sym p)- | null (tail cs) &&- rng1 (head cs)- = escRng . head $ cs- | otherwise = "[" ++ concat cs' ++ "]"- where- rng1 (x,y) = x == y- cs = charRngs . chars $ p- cs' = map escRng cs- escRng (x, y)- | x == y = esc x- | succ x == y- = esc x ++ esc y- | otherwise- = esc x ++ "-" ++ esc y- esc x- | x `elem` "\\-[]{}()*+?.^"- = '\\':x:""- | x >= ' ' && x <= '~'- = x:""- | otherwise- = "&#" ++ show (fromEnum x) ++ ";"- show Dot = "."- show (Star e) = "(" ++ show e ++ ")*"- show (Alt e1 e2) = "(" ++ show e1 ++ "|" ++ show e2 ++ ")"- show (Seq e1 e2) = show e1 ++ show e2- show (Rep 1 e) = "(" ++ show e ++ ")+"- show (Rep i e) = "(" ++ show e ++ "){" ++ show i ++ ",}"- show (Rng 0 1 e) = "(" ++ show e ++ ")?"- show (Rng i j e) = "(" ++ show e ++ "){" ++ show i ++ "," ++ show j ++ "}"- show (Dif e1 e2) = "(" ++ show e1 ++ "-" ++ show e2 ++ ")"---- --------------------------------------------------------------isZero :: Regex -> Bool-isZero (Zero _) = True-isZero _ = False-{-# INLINE isZero #-}--nullable :: Regex -> Bool-nullable (Zero _) = False-nullable Unit = True-nullable (Sym _p) = False -- assumption: p holds for at least one char-nullable Dot = False-nullable (Star _) = True-nullable (Alt e1 e2) = nullable e1 ||- nullable e2-nullable (Seq e1 e2) = nullable e1 &&- nullable e2-nullable (Rep _i e) = nullable e-nullable (Rng i _ e) = i == 0 ||- nullable e-nullable (Dif e1 e2) = nullable e1 &&- not (nullable e2)---- --------------------------------------------------------------delta :: Regex -> Char -> Regex-delta e@(Zero _) _ = e-delta Unit c = mkZero $- "unexpected char " ++ show c-delta (Sym p) c- | p c = mkUnit- | otherwise = mkZero $- "unexpected char " ++ show c ++ ", expected: " ++ oneof ++ chars'- where- (cs, ds) = splitAt 40 (chars p)- oneof- | null (tail cs) = ""- | otherwise = "one of "- chars'- | null (tail cs) = "'" ++ cs ++ "'"- | null ds = "[" ++ cs ++ "]"- | otherwise = "[" ++ cs ++ "...]"--delta Dot _ = mkUnit-delta e@(Star e1) c = mkSeq (delta e1 c) e-delta (Alt e1 e2) c = mkAlt (delta e1 c) (delta e2 c)-delta (Seq e1 e2) c- | nullable e1 = mkAlt (mkSeq (delta e1 c) e2) (delta e2 c)- | otherwise = mkSeq (delta e1 c) e2-delta (Rep i e) c = mkSeq (delta e c) (mkRep (i-1) e)-delta (Rng i j e) c = mkSeq (delta e c) (mkRng ((i-1) `max` 0) (j-1) e)-delta (Dif e1 e2) c = mkDif (delta e1 c) (delta e2 c)---- --------------------------------------------------------------delta' :: Regex -> String -> Regex-delta' = foldl' delta--matchWithRE :: Regex -> String -> Maybe String-matchWithRE e- = res . delta' e- where- res (Zero err) = Just err- res re- | nullable re = Nothing -- o.k.- | otherwise = Just $ "input does not match " ++ show e---- --------------------------------------------------------------(<&&>) :: (Char -> Bool) -> (Char -> Bool) -> (Char -> Bool)-f <&&> g = \ x -> f x && g x -- liftA2 (&&)--{-# INLINE (<&&>) #-}---(<||>) :: (Char -> Bool) -> (Char -> Bool) -> (Char -> Bool)-f <||> g = \ x -> f x || g x -- liftA2 (||)--{-# INLINE (<||>) #-}---- ------------------------------------------------------------
− src/Text/XML/HXT/RelaxNG/XmlSchema/RegexMatch.hs
@@ -1,241 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch- Copyright : Copyright (C) 2005 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : experimental- Portability: portable-- Convenient functions for W3C XML Schema Regular Expression Matcher.- For internals see 'Text.XML.HXT.RelaxNG.XmlSchema.Regex'-- Grammar can be found under <http://www.w3.org/TR/xmlschema11-2/#regexs>---}---- --------------------------------------------------------------module Text.XML.HXT.RelaxNG.XmlSchema.RegexMatch- ( matchRE- , splitRE- , sedRE- , tokenizeRE- , tokenizeRE'-- , match- , tokenize- , tokenize'- , sed- , split-- , splitRegex- )-where--import Data.Maybe--import Text.XML.HXT.RelaxNG.XmlSchema.Regex-import Text.XML.HXT.RelaxNG.XmlSchema.RegexParser--{--import qualified Debug.Trace as T--}---- --------------------------------------------------------------splitRegex :: Regex -> String -> Maybe (String, String)-splitRegex re ""- | nullable re = Just ("", "")- | otherwise = Nothing--splitRegex re inp@(c : inp')- | isZero re = Nothing- | otherwise = evalRes . splitRegex {- (T.trace (show re') re') -} re' $ inp'- where- re' = delta re c- evalRes Nothing- | nullable re = Just ("", inp)- | otherwise = Nothing-- evalRes (Just (tok, rest))- = Just (c : tok, rest)---- ---------------------------------------------------------------- | split a string by taking the longest prefix matching a regular expression------ @Nothing@ is returned in case of a syntactically wrong regex string--- or in case there is no matching prefix, else the pair of prefix and rest is returned------ examples:------ > splitRE "a*b" "abc" = Just ("ab","c")--- > splitRE "a*" "bc" = Just ("", "bc")--- > splitRE "a+" "bc" = Nothing--- > splitRE "[" "abc" = Nothing--splitRE :: String -> String -> Maybe (String, String)-splitRE re input- = either (const Nothing) (flip splitRegex input) . parseRegex $ re---- | convenient function for splitRE------ syntax errors in R.E. are interpreted as no matching prefix found--split :: String -> String -> (String, String)-split re input- = fromMaybe ("", input) . splitRE re $ input---- ---------------------------------------------------------------- | split a string into tokens (words) by giving a regular expression--- which all tokens must match------ This can be used for simple tokenizers.--- The words in the result list contain at least one char.--- All none matching chars are discarded. If the given regex contains syntax errors,--- @Nothing@ is returned------ examples:------ > tokenizeRE "a*b" "" = Just []--- > tokenizeRE "a*b" "abc" = Just ["ab"]--- > tokenizeRE "a*b" "abaab ab" = Just ["ab","aab","ab"]--- >--- > tokenizeRE "[a-z]{2,}|[0-9]{2,}|[0-9]+[.][0-9]+" "ab123 456.7abc"--- > = Just ["ab","123","456.7","abc"]--- >--- > tokenizeRE "[a-z]*|[0-9]{2,}|[0-9]+[.][0-9]+" "cab123 456.7abc"--- > = Just ["cab","123","456.7","abc"]--- >--- > tokenizeRE "[^ \t\n\r]*" "abc def\t\n\rxyz"--- > = Just ["abc","def","xyz"]--- >--- > tokenizeRE "[^ \t\n\r]*" = words--tokenizeRE :: String -> String -> Maybe [String]-tokenizeRE regex input- = either (const Nothing) (Just . flip token' input) $ parseRegex regex- where- token' :: Regex -> String -> [String]- token' re inp- | null inp = []- | otherwise = evalRes . splitRegex re $ inp- where- token'' = token' re- evalRes Nothing = token'' (tail inp) -- re does not match any prefix- evalRes (Just (tok, rest))- | null tok = token'' (tail rest) -- re is nullable and only the empty prefix matches- | otherwise = tok : token'' rest -- token found, tokenize the rest---- | convenient function for tokenizeRE a string------ syntax errors in R.E. result in an empty list--tokenize :: String -> String -> [String]-tokenize re- = fromMaybe [] . tokenizeRE re---- ---------------------------------------------------------------- | split a string into tokens and delimierter by giving a regular expression--- wich all tokens must match------ This is a generalisation of the above 'tokenizeRE' functions.--- The none matching char sequences are marked with @Left@, the matching ones are marked with @Right@------ If the regular expression contains syntax errors @Nothing@ is returned------ The following Law holds:------ > concat . map (either id id) . fromJust . tokenizeRE' re == id--tokenizeRE' :: String -> String -> Maybe [Either String String]-tokenizeRE' regex input- = either (const Nothing) (Just . flip token' input) $ parseRegex regex- where- token' :: Regex -> String -> [Either String String]- token' re- = tok2 ""- where- tok2 :: String -> String -> [Either String String]- tok2 noMatchPrefix inp- | null inp = addNoMatch []- | otherwise = evalRes . splitRegex re $ inp- where- addNoMatch res- | null noMatchPrefix = res- | otherwise = (Left . reverse $ noMatchPrefix) : res-- evalRes Nothing = tok2 (head inp : noMatchPrefix) (tail inp) -- re does not match any prefix- evalRes (Just (tok, rest))- | null tok = tok2 (head rest : noMatchPrefix) (tail rest) -- re is nullable and only the empty prefix matches- | otherwise = addNoMatch . (Right tok :) . tok2 "" $ rest -- token found, tokenize the rest---- | convenient function for tokenizeRE'------ When the regular expression contains errors @[Left input]@ is returned, that means tokens are found--tokenize' :: String -> String -> [Either String String]-tokenize' regex input- = fromMaybe [Left input] . tokenizeRE' regex $ input---- ---------------------------------------------------------------- | sed like editing function------ All matching tokens are edited by the 1. argument, the editing function,--- all other chars remain as they are------ examples:------ > sedRE (const "b") "a" "xaxax" = Just "xbxbx"--- > sedRE (\ x -> x ++ x) "a" "xax" = Just "xaax"--- > sedRE undefined "[" undefined = Nothing--sedRE :: (String -> String) -> String -> String -> Maybe String-sedRE edit regex input- = maybe Nothing (Just . concatMap (either id edit)) $ tokenizeRE' regex input---- | convenient function for sedRE------ When the regular expression contains errors, sed is the identity, else--- the funtionality is like 'sedRE'------ > sed undefined "[" == id--sed :: (String -> String) -> String -> String -> String-sed edit regex input- = fromMaybe input . sedRE edit regex $ input---- ---------------------------------------------------------------- | match a string with a regular expression------ First argument is the regex, second the input string,--- if the regex is not well formed, @Nothing@ is returned,--- else @Just@ the match result------ Examples:------ > matchRE "x*" "xxx" = Just True--- > matchRE "x" "xxx" = Just False--- > matchRE "[" "xxx" = Nothing--matchRE :: String -> String -> Maybe Bool-matchRE regex input- = either (const Nothing) (Just . isNothing . flip matchWithRE input) $ parseRegex regex----- | convenient function for matchRE------ syntax errors in R.E. are interpreted as no match found--match :: String -> String -> Bool-match re = fromMaybe False . matchRE re---- -------------------------------------------------------------
− src/Text/XML/HXT/RelaxNG/XmlSchema/RegexParser.hs
@@ -1,354 +0,0 @@--- --------------------------------------------------------------{- |- Module : Text.XML.HXT.RelaxNG.XmlSchema.RegexParser- Copyright : Copyright (C) 2005 Uwe Schmidt- License : MIT-- Maintainer : Uwe Schmidt (uwe@fh-wedel.de)- Stability : experimental- Portability: portable-- W3C XML Schema Regular Expression Parser-- This parser supports the full W3C standard, the- complete grammar can be found under <http://www.w3.org/TR/xmlschema11-2/#regexs>---}---- --------------------------------------------------------------module Text.XML.HXT.RelaxNG.XmlSchema.RegexParser- ( parseRegex )-where--import Data.Maybe--import Text.ParserCombinators.Parsec--import Text.XML.HXT.DOM.Unicode--import Text.XML.HXT.RelaxNG.Unicode.Blocks-import Text.XML.HXT.RelaxNG.Unicode.CharProps-import Text.XML.HXT.RelaxNG.XmlSchema.Regex---- --------------------------------------------------------------parseRegex :: String -> Either String Regex-parseRegex- = either (Left . show) Right- .- parse ( do- r <- regExp- eof- return r- ) ""---- --------------------------------------------------------------regExp :: Parser Regex-regExp- = do- r1 <- branch- rs <- many branch1- return (foldr1 mkAlt $ r1:rs)- where- branch1- = do- _ <- char '|'- branch--branch :: Parser Regex-branch- = do- rs <- many piece- return $ foldr mkSeq mkUnit rs--piece :: Parser Regex-piece- = do- r <- atom- quantifier r--quantifier :: Regex -> Parser Regex-quantifier r- = ( do- _ <- char '?'- return $ mkOpt r )- <|>- ( do- _ <- char '*'- return $ mkStar r )- <|>- ( do- _ <- char '+'- return $ mkRep 1 r )- <|>- ( do- _ <- char '{'- res <- quantity r- _ <- char '}'- return res- )- <|>- ( return r )--quantity :: Regex -> Parser Regex-quantity r- = do- lb <- many1 digit- quantityRest r (read lb)--quantityRest :: Regex -> Int -> Parser Regex-quantityRest r lb- = ( do- _ <- char ','- ub <- many digit- return ( if null ub- then mkRep lb r- else mkRng lb (read ub) r- )- )- <|>- ( return $ mkRng lb lb r)--atom :: Parser Regex-atom- = char1- <|>- charClass- <|>- between (char '(') (char ')') regExp--char1 :: Parser Regex-char1- = do- c <- satisfy $ (`notElem` ".\\?*+{}()|[]")- return $ mkSym1 c--charClass :: Parser Regex-charClass- = charClassEsc- <|>- charClassExpr- <|>- wildCardEsc--charClassEsc :: Parser Regex-charClassEsc- = do- _ <- char '\\'- ( singleCharEsc- <|>- multiCharEsc- <|>- catEsc- <|>- complEsc )--singleCharEsc :: Parser Regex-singleCharEsc- = do- c <- singleCharEsc'- return $ mkSym1 c--singleCharEsc' :: Parser Char-singleCharEsc'- = do- c <- satisfy (`elem` "nrt\\|.?*+(){}-[]^")- return $ maybe c id . lookup c . zip "ntr" $ "\n\r\t"--multiCharEsc :: Parser Regex-multiCharEsc- = do- c <- satisfy (`elem` es)- return $ mkSym . fromJust . lookup c $ pm- where- es = map fst pm- pm = [ ('s', isXmlSpaceChar )- , ('S', not . isXmlSpaceChar )- , ('i', isXmlNameStartChar )- , ('I', not . isXmlNameStartChar )- , ('c', isXmlNameChar )- , ('C', not . isXmlNameChar )- , ('d', isDigit )- , ('D', not . isDigit )- , ('w', not . isNotWord )- , ('W', isNotWord )- ]- isDigit = ('0' <=) <&&> (<= '9')- isNotWord = isUnicodeP <||>- isUnicodeZ <||>- isUnicodeC--catEsc :: Parser Regex-catEsc- = do- _ <- char 'p'- s <- between (char '{') (char '}') charProp- return $ mkSym s--charProp :: Parser (Char -> Bool)-charProp- = isCategory- <|>- isBlock--isBlock :: Parser (Char -> Bool)-isBlock- = do- _ <- string "Is"- name <- many1 (satisfy legalChar)- let b = lookup name codeBlocks- if isJust b- then return $ let- (lb, ub) = fromJust b- in- (lb <=) <&&> (<= ub)- else fail $ "unknown Unicode code block " ++ show name- where- legalChar c = 'A' <= c && c <= 'Z' ||- 'a' <= c && c <= 'z' ||- '0' <= c && c <= '9' ||- '-' == c--isCategory :: Parser (Char -> Bool)-isCategory- = do- pr <- isCategory'- return $ fromJust (lookup pr categories)--categories :: [(String, Char -> Bool)]-categories- = [ ("C", isUnicodeC )- , ("Cc", isUnicodeCc)- , ("Cf", isUnicodeCf)- , ("Co", isUnicodeCo)- , ("Cs", isUnicodeCs)- , ("L", isUnicodeL )- , ("Ll", isUnicodeLl)- , ("Lm", isUnicodeLm)- , ("Lo", isUnicodeLo)- , ("Lt", isUnicodeLt)- , ("Lu", isUnicodeLu)- , ("M", isUnicodeM )- , ("Mc", isUnicodeMc)- , ("Me", isUnicodeMe)- , ("Mn", isUnicodeMn)- , ("N", isUnicodeN )- , ("Nd", isUnicodeNd)- , ("Nl", isUnicodeNl)- , ("No", isUnicodeNo)- , ("P", isUnicodeP )- , ("Pc", isUnicodePc)- , ("Pd", isUnicodePd)- , ("Pe", isUnicodePe)- , ("Pf", isUnicodePf)- , ("Pi", isUnicodePi)- , ("Po", isUnicodePo)- , ("Ps", isUnicodePs)- , ("S", isUnicodeS )- , ("Sc", isUnicodeSc)- , ("Sk", isUnicodeSk)- , ("Sm", isUnicodeSm)- , ("So", isUnicodeSo)- , ("Z", isUnicodeZ )- , ("Zl", isUnicodeZl)- , ("Zp", isUnicodeZp)- , ("Zs", isUnicodeZs)- ]--isCategory' :: Parser String-isCategory'- = ( foldr1 (<|>) . map (uncurry prop) $- [ ('L', "ultmo")- , ('M', "nce")- , ('N', "dlo")- , ('P', "cdseifo")- , ('Z', "slp")- , ('S', "mcko")- , ('C', "cfon")- ]- ) <?> "illegal Unicode character property"- where- prop c1 cs2- = do- _ <- char c1- s2 <- option ""- ( do- c2 <- satisfy (`elem` cs2)- return [c2] )- return $ c1:s2--complEsc :: Parser Regex-complEsc- = do- _ <- char 'P'- s <- between (char '{') (char '}') charProp- return $ mkSym (not . s)--charClassExpr :: Parser Regex-charClassExpr- = between (char '[') (char ']') charGroup--charGroup :: Parser Regex-charGroup- = do- r <- ( negCharGroup -- a ^ at beginning denotes negation, not start of posCharGroup- <|>- posCharGroup- )- s <- option (mkZero "") -- charClassSub- ( do- _ <- char '-'- charClassExpr- )- return $ mkDif r s--posCharGroup :: Parser Regex-posCharGroup- = do- rs <- many1 (charRange <|> charClassEsc)- return $ foldr1 mkAlt rs--charRange :: Parser Regex-charRange- = try seRange- <|>- xmlCharIncDash--seRange :: Parser Regex-seRange- = do- c1 <- charOrEsc'- _ <- char '-'- c2 <- charOrEsc'- return $ mkSymRng c1 c2--charOrEsc' :: Parser Char-charOrEsc'- = satisfy (`notElem` "\\-[]")- <|>- singleCharEsc'--xmlCharIncDash :: Parser Regex-xmlCharIncDash- = do- c <- satisfy (`notElem` "\\[]")- return $ mkSym1 c--negCharGroup :: Parser Regex-negCharGroup- = do- _ <- char '^'- r <- posCharGroup- return $ mkCompl r--wildCardEsc :: Parser Regex-wildCardEsc- = do- _ <- char '.'- return $ mkSym (`notElem` "\n\r")----- ------------------------------------------------------------
+ src/Text/XML/HXT/XMLSchema/DataTypeLibW3CNames.hs view
@@ -0,0 +1,124 @@+-- ------------------------------------------------------------++{- |+ Module : Text.XML.HXT.XMLSchema.DataTypeLibW3C+ Copyright : Copyright (C) 2005-2010 Uwe Schmidt+ License : MIT++ Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+ Stability : experimental+ Portability: portable+ Version : $Id$++ Datatype library for the W3C XML schema datatypes++-}++-- ------------------------------------------------------------++module Text.XML.HXT.XMLSchema.DataTypeLibW3CNames+where++-- ------------------------------------------------------------++-- | Namespace of the W3C XML schema datatype library++w3cNS :: String+w3cNS = "http://www.w3.org/2001/XMLSchema-datatypes"+++xsd_string+ , xsd_normalizedString+ , xsd_token+ , xsd_language+ , xsd_NMTOKEN+ , xsd_NMTOKENS+ , xsd_Name+ , xsd_NCName+ , xsd_ID+ , xsd_IDREF+ , xsd_IDREFS+ , xsd_ENTITY+ , xsd_ENTITIES+ , xsd_anyURI+ , xsd_QName+ , xsd_NOTATION+ , xsd_hexBinary+ , xsd_base64Binary+ , xsd_decimal+ , xsd_integer+ , xsd_nonPositiveInteger+ , xsd_negativeInteger+ , xsd_nonNegativeInteger+ , xsd_positiveInteger+ , xsd_long+ , xsd_int+ , xsd_short+ , xsd_byte+ , xsd_unsignedLong+ , xsd_unsignedInt+ , xsd_unsignedShort+ , xsd_unsignedByte :: String++xsd_string = "string"+xsd_normalizedString = "normalizedString"+xsd_token = "token"+xsd_language = "language"+xsd_NMTOKEN = "NMTOKEN"+xsd_NMTOKENS = "NMTOKENS"+xsd_Name = "Name"+xsd_NCName = "NCName"+xsd_ID = "ID"+xsd_IDREF = "IDREF"+xsd_IDREFS = "IDREFS"+xsd_ENTITY = "ENTITY"+xsd_ENTITIES = "ENTITIES"+xsd_anyURI = "anyURI"+xsd_QName = "QName"+xsd_NOTATION = "NOTATION"+xsd_hexBinary = "hexBinary"+xsd_base64Binary = "base64Binary"+xsd_decimal = "decimal"+xsd_integer = "integer"+xsd_nonPositiveInteger = "nonPositiveInteger"+xsd_negativeInteger = "negativeInteger"+xsd_nonNegativeInteger = "nonNegativeInteger"+xsd_positiveInteger = "positiveInteger"+xsd_long = "long"+xsd_int = "int"+xsd_short = "short"+xsd_byte = "byte"+xsd_unsignedLong = "unsignedLong"+xsd_unsignedInt = "unsignedInt"+xsd_unsignedShort = "unsignedShort"+xsd_unsignedByte = "unsignedByte"+++xsd_length+ , xsd_maxLength+ , xsd_minLength+ , xsd_maxExclusive+ , xsd_minExclusive+ , xsd_maxInclusive+ , xsd_minInclusive+ , xsd_totalDigits+ , xsd_fractionDigits+ , xsd_pattern+ , xsd_enumeration :: String++xsd_length = "length"+xsd_maxLength = "maxLength"+xsd_minLength = "minLength"++xsd_maxExclusive = "maxExclusive"+xsd_minExclusive = "minExclusive"+xsd_maxInclusive = "maxInclusive"+xsd_minInclusive = "minInclusive"++xsd_totalDigits = "totalDigits"+xsd_fractionDigits = "fractionDigits"++xsd_pattern = "pattern"+xsd_enumeration = "enumeration"++-- ----------------------------------------