tagsoup 0.13.9 → 0.13.10
raw patch · 5 files changed
+245/−142 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- CHANGES.txt +3/−0
- Text/HTML/TagSoup.hs +2/−1
- Text/HTML/TagSoup/Entity.hs +133/−133
- Text/HTML/TagSoup/Match.hs +106/−7
- tagsoup.cabal +1/−1
CHANGES.txt view
@@ -1,5 +1,8 @@ Changelog for TagSoup +0.13.10+ #51, improve the Haddock documentation+ #52, fix some > 16bit HTML entities 0.13.9 #50, fix a space leak #36, fix the demo examples
Text/HTML/TagSoup.hs view
@@ -21,7 +21,8 @@ module Text.HTML.TagSoup.Render, canonicalizeTags, - -- * Tag identification+ -- Note: the "#tag-identification#" creates an anchor that's linked to from Match.hs+ -- * #tag-identification# Tag identification isTagOpen, isTagClose, isTagText, isTagWarning, isTagPosition, isTagOpenName, isTagCloseName, isTagComment,
Text/HTML/TagSoup/Entity.hs view
@@ -108,8 +108,8 @@ ,"AElig;" * "\x00C6" ,"aelig;" * "\x00E6" ,"af;" * "\x2061"- ,"Afr;" * "\xD835\xDD04"- ,"afr;" * "\xD835\xDD1E"+ ,"Afr;" * "\x1D504"+ ,"afr;" * "\x1D51E" ,"Agrave" * "\x00C0" ,"agrave" * "\x00E0" ,"Agrave;" * "\x00C0"@@ -151,8 +151,8 @@ ,"angzarr;" * "\x237C" ,"Aogon;" * "\x0104" ,"aogon;" * "\x0105"- ,"Aopf;" * "\xD835\xDD38"- ,"aopf;" * "\xD835\xDD52"+ ,"Aopf;" * "\x1D538"+ ,"aopf;" * "\x1D552" ,"ap;" * "\x2248" ,"apacir;" * "\x2A6F" ,"ape;" * "\x224A"@@ -166,8 +166,8 @@ ,"aring" * "\x00E5" ,"Aring;" * "\x00C5" ,"aring;" * "\x00E5"- ,"Ascr;" * "\xD835\xDC9C"- ,"ascr;" * "\xD835\xDCB6"+ ,"Ascr;" * "\x1D49C"+ ,"ascr;" * "\x1D4B6" ,"Assign;" * "\x2254" ,"ast;" * "\x002A" ,"asymp;" * "\x2248"@@ -210,8 +210,8 @@ ,"beta;" * "\x03B2" ,"beth;" * "\x2136" ,"between;" * "\x226C"- ,"Bfr;" * "\xD835\xDD05"- ,"bfr;" * "\xD835\xDD1F"+ ,"Bfr;" * "\x1D505"+ ,"bfr;" * "\x1D51F" ,"bigcap;" * "\x22C2" ,"bigcirc;" * "\x25EF" ,"bigcup;" * "\x22C3"@@ -241,8 +241,8 @@ ,"bnequiv;" * "\x2261\x20E5" ,"bnot;" * "\x2310" ,"bNot;" * "\x2AED"- ,"Bopf;" * "\xD835\xDD39"- ,"bopf;" * "\xD835\xDD53"+ ,"Bopf;" * "\x1D539"+ ,"bopf;" * "\x1D553" ,"bot;" * "\x22A5" ,"bottom;" * "\x22A5" ,"bowtie;" * "\x22C8"@@ -296,7 +296,7 @@ ,"brvbar" * "\x00A6" ,"brvbar;" * "\x00A6" ,"Bscr;" * "\x212C"- ,"bscr;" * "\xD835\xDCB7"+ ,"bscr;" * "\x1D4B7" ,"bsemi;" * "\x204F" ,"bsim;" * "\x223D" ,"bsime;" * "\x22CD"@@ -347,7 +347,7 @@ ,"CenterDot;" * "\x00B7" ,"centerdot;" * "\x00B7" ,"Cfr;" * "\x212D"- ,"cfr;" * "\xD835\xDD20"+ ,"cfr;" * "\x1D520" ,"CHcy;" * "\x0427" ,"chcy;" * "\x0447" ,"check;" * "\x2713"@@ -396,7 +396,7 @@ ,"Conint;" * "\x222F" ,"ContourIntegral;" * "\x222E" ,"Copf;" * "\x2102"- ,"copf;" * "\xD835\xDD54"+ ,"copf;" * "\x1D554" ,"coprod;" * "\x2210" ,"Coproduct;" * "\x2210" ,"COPY" * "\x00A9"@@ -408,8 +408,8 @@ ,"crarr;" * "\x21B5" ,"cross;" * "\x2717" ,"Cross;" * "\x2A2F"- ,"Cscr;" * "\xD835\xDC9E"- ,"cscr;" * "\xD835\xDCB8"+ ,"Cscr;" * "\x1D49E"+ ,"cscr;" * "\x1D4B8" ,"csub;" * "\x2ACF" ,"csube;" * "\x2AD1" ,"csup;" * "\x2AD0"@@ -473,8 +473,8 @@ ,"delta;" * "\x03B4" ,"demptyv;" * "\x29B1" ,"dfisht;" * "\x297F"- ,"Dfr;" * "\xD835\xDD07"- ,"dfr;" * "\xD835\xDD21"+ ,"Dfr;" * "\x1D507"+ ,"dfr;" * "\x1D521" ,"dHar;" * "\x2965" ,"dharl;" * "\x21C3" ,"dharr;" * "\x21C2"@@ -502,8 +502,8 @@ ,"dlcorn;" * "\x231E" ,"dlcrop;" * "\x230D" ,"dollar;" * "\x0024"- ,"Dopf;" * "\xD835\xDD3B"- ,"dopf;" * "\xD835\xDD55"+ ,"Dopf;" * "\x1D53B"+ ,"dopf;" * "\x1D555" ,"Dot;" * "\x00A8" ,"dot;" * "\x02D9" ,"DotDot;" * "\x20DC"@@ -549,8 +549,8 @@ ,"drbkarow;" * "\x2910" ,"drcorn;" * "\x231F" ,"drcrop;" * "\x230C"- ,"Dscr;" * "\xD835\xDC9F"- ,"dscr;" * "\xD835\xDCB9"+ ,"Dscr;" * "\x1D49F"+ ,"dscr;" * "\x1D4B9" ,"DScy;" * "\x0405" ,"dscy;" * "\x0455" ,"dsol;" * "\x29F6"@@ -586,8 +586,8 @@ ,"eDot;" * "\x2251" ,"ee;" * "\x2147" ,"efDot;" * "\x2252"- ,"Efr;" * "\xD835\xDD08"- ,"efr;" * "\xD835\xDD22"+ ,"Efr;" * "\x1D508"+ ,"efr;" * "\x1D522" ,"eg;" * "\x2A9A" ,"Egrave" * "\x00C8" ,"egrave" * "\x00E8"@@ -616,8 +616,8 @@ ,"ensp;" * "\x2002" ,"Eogon;" * "\x0118" ,"eogon;" * "\x0119"- ,"Eopf;" * "\xD835\xDD3C"- ,"eopf;" * "\xD835\xDD56"+ ,"Eopf;" * "\x1D53C"+ ,"eopf;" * "\x1D556" ,"epar;" * "\x22D5" ,"eparsl;" * "\x29E3" ,"eplus;" * "\x2A71"@@ -669,8 +669,8 @@ ,"ffilig;" * "\xFB03" ,"fflig;" * "\xFB00" ,"ffllig;" * "\xFB04"- ,"Ffr;" * "\xD835\xDD09"- ,"ffr;" * "\xD835\xDD23"+ ,"Ffr;" * "\x1D509"+ ,"ffr;" * "\x1D523" ,"filig;" * "\xFB01" ,"FilledSmallSquare;" * "\x25FC" ,"FilledVerySmallSquare;" * "\x25AA"@@ -679,8 +679,8 @@ ,"fllig;" * "\xFB02" ,"fltns;" * "\x25B1" ,"fnof;" * "\x0192"- ,"Fopf;" * "\xD835\xDD3D"- ,"fopf;" * "\xD835\xDD57"+ ,"Fopf;" * "\x1D53D"+ ,"fopf;" * "\x1D557" ,"ForAll;" * "\x2200" ,"forall;" * "\x2200" ,"fork;" * "\x22D4"@@ -708,7 +708,7 @@ ,"frasl;" * "\x2044" ,"frown;" * "\x2322" ,"Fscr;" * "\x2131"- ,"fscr;" * "\xD835\xDCBB"+ ,"fscr;" * "\x1D4BB" ,"gacute;" * "\x01F5" ,"Gamma;" * "\x0393" ,"gamma;" * "\x03B3"@@ -738,8 +738,8 @@ ,"gesdotol;" * "\x2A84" ,"gesl;" * "\x22DB\xFE00" ,"gesles;" * "\x2A94"- ,"Gfr;" * "\xD835\xDD0A"- ,"gfr;" * "\xD835\xDD24"+ ,"Gfr;" * "\x1D50A"+ ,"gfr;" * "\x1D524" ,"gg;" * "\x226B" ,"Gg;" * "\x22D9" ,"ggg;" * "\x22D9"@@ -757,8 +757,8 @@ ,"gneq;" * "\x2A88" ,"gneqq;" * "\x2269" ,"gnsim;" * "\x22E7"- ,"Gopf;" * "\xD835\xDD3E"- ,"gopf;" * "\xD835\xDD58"+ ,"Gopf;" * "\x1D53E"+ ,"gopf;" * "\x1D558" ,"grave;" * "\x0060" ,"GreaterEqual;" * "\x2265" ,"GreaterEqualLess;" * "\x22DB"@@ -768,7 +768,7 @@ ,"GreaterSlantEqual;" * "\x2A7E" ,"GreaterTilde;" * "\x2273" ,"gscr;" * "\x210A"- ,"Gscr;" * "\xD835\xDCA2"+ ,"Gscr;" * "\x1D4A2" ,"gsim;" * "\x2273" ,"gsime;" * "\x2A8E" ,"gsiml;" * "\x2A90"@@ -810,7 +810,7 @@ ,"hellip;" * "\x2026" ,"hercon;" * "\x22B9" ,"Hfr;" * "\x210C"- ,"hfr;" * "\xD835\xDD25"+ ,"hfr;" * "\x1D525" ,"HilbertSpace;" * "\x210B" ,"hksearow;" * "\x2925" ,"hkswarow;" * "\x2926"@@ -819,11 +819,11 @@ ,"hookleftarrow;" * "\x21A9" ,"hookrightarrow;" * "\x21AA" ,"Hopf;" * "\x210D"- ,"hopf;" * "\xD835\xDD59"+ ,"hopf;" * "\x1D559" ,"horbar;" * "\x2015" ,"HorizontalLine;" * "\x2500" ,"Hscr;" * "\x210B"- ,"hscr;" * "\xD835\xDCBD"+ ,"hscr;" * "\x1D4BD" ,"hslash;" * "\x210F" ,"Hstrok;" * "\x0126" ,"hstrok;" * "\x0127"@@ -849,7 +849,7 @@ ,"iexcl;" * "\x00A1" ,"iff;" * "\x21D4" ,"Ifr;" * "\x2111"- ,"ifr;" * "\xD835\xDD26"+ ,"ifr;" * "\x1D526" ,"Igrave" * "\x00CC" ,"igrave" * "\x00EC" ,"Igrave;" * "\x00CC"@@ -892,15 +892,15 @@ ,"iocy;" * "\x0451" ,"Iogon;" * "\x012E" ,"iogon;" * "\x012F"- ,"Iopf;" * "\xD835\xDD40"- ,"iopf;" * "\xD835\xDD5A"+ ,"Iopf;" * "\x1D540"+ ,"iopf;" * "\x1D55A" ,"Iota;" * "\x0399" ,"iota;" * "\x03B9" ,"iprod;" * "\x2A3C" ,"iquest" * "\x00BF" ,"iquest;" * "\x00BF" ,"Iscr;" * "\x2110"- ,"iscr;" * "\xD835\xDCBE"+ ,"iscr;" * "\x1D4BE" ,"isin;" * "\x2208" ,"isindot;" * "\x22F5" ,"isinE;" * "\x22F9"@@ -920,13 +920,13 @@ ,"jcirc;" * "\x0135" ,"Jcy;" * "\x0419" ,"jcy;" * "\x0439"- ,"Jfr;" * "\xD835\xDD0D"- ,"jfr;" * "\xD835\xDD27"+ ,"Jfr;" * "\x1D50D"+ ,"jfr;" * "\x1D527" ,"jmath;" * "\x0237"- ,"Jopf;" * "\xD835\xDD41"- ,"jopf;" * "\xD835\xDD5B"- ,"Jscr;" * "\xD835\xDCA5"- ,"jscr;" * "\xD835\xDCBF"+ ,"Jopf;" * "\x1D541"+ ,"jopf;" * "\x1D55B"+ ,"Jscr;" * "\x1D4A5"+ ,"jscr;" * "\x1D4BF" ,"Jsercy;" * "\x0408" ,"jsercy;" * "\x0458" ,"Jukcy;" * "\x0404"@@ -938,17 +938,17 @@ ,"kcedil;" * "\x0137" ,"Kcy;" * "\x041A" ,"kcy;" * "\x043A"- ,"Kfr;" * "\xD835\xDD0E"- ,"kfr;" * "\xD835\xDD28"+ ,"Kfr;" * "\x1D50E"+ ,"kfr;" * "\x1D528" ,"kgreen;" * "\x0138" ,"KHcy;" * "\x0425" ,"khcy;" * "\x0445" ,"KJcy;" * "\x040C" ,"kjcy;" * "\x045C"- ,"Kopf;" * "\xD835\xDD42"- ,"kopf;" * "\xD835\xDD5C"- ,"Kscr;" * "\xD835\xDCA6"- ,"kscr;" * "\xD835\xDCC0"+ ,"Kopf;" * "\x1D542"+ ,"kopf;" * "\x1D55C"+ ,"Kscr;" * "\x1D4A6"+ ,"kscr;" * "\x1D4C0" ,"lAarr;" * "\x21DA" ,"Lacute;" * "\x0139" ,"lacute;" * "\x013A"@@ -1066,8 +1066,8 @@ ,"LessTilde;" * "\x2272" ,"lfisht;" * "\x297C" ,"lfloor;" * "\x230A"- ,"Lfr;" * "\xD835\xDD0F"- ,"lfr;" * "\xD835\xDD29"+ ,"Lfr;" * "\x1D50F"+ ,"lfr;" * "\x1D529" ,"lg;" * "\x2276" ,"lgE;" * "\x2A91" ,"lHar;" * "\x2962"@@ -1111,8 +1111,8 @@ ,"looparrowleft;" * "\x21AB" ,"looparrowright;" * "\x21AC" ,"lopar;" * "\x2985"- ,"Lopf;" * "\xD835\xDD43"- ,"lopf;" * "\xD835\xDD5D"+ ,"Lopf;" * "\x1D543"+ ,"lopf;" * "\x1D55D" ,"loplus;" * "\x2A2D" ,"lotimes;" * "\x2A34" ,"lowast;" * "\x2217"@@ -1132,7 +1132,7 @@ ,"lrtri;" * "\x22BF" ,"lsaquo;" * "\x2039" ,"Lscr;" * "\x2112"- ,"lscr;" * "\xD835\xDCC1"+ ,"lscr;" * "\x1D4C1" ,"Lsh;" * "\x21B0" ,"lsh;" * "\x21B0" ,"lsim;" * "\x2272"@@ -1183,8 +1183,8 @@ ,"measuredangle;" * "\x2221" ,"MediumSpace;" * "\x205F" ,"Mellintrf;" * "\x2133"- ,"Mfr;" * "\xD835\xDD10"- ,"mfr;" * "\xD835\xDD2A"+ ,"Mfr;" * "\x1D510"+ ,"mfr;" * "\x1D52A" ,"mho;" * "\x2127" ,"micro" * "\x00B5" ,"micro;" * "\x00B5"@@ -1202,11 +1202,11 @@ ,"mldr;" * "\x2026" ,"mnplus;" * "\x2213" ,"models;" * "\x22A7"- ,"Mopf;" * "\xD835\xDD44"- ,"mopf;" * "\xD835\xDD5E"+ ,"Mopf;" * "\x1D544"+ ,"mopf;" * "\x1D55E" ,"mp;" * "\x2213" ,"Mscr;" * "\x2133"- ,"mscr;" * "\xD835\xDCC2"+ ,"mscr;" * "\x1D4C2" ,"mstpos;" * "\x223E" ,"Mu;" * "\x039C" ,"mu;" * "\x03BC"@@ -1257,8 +1257,8 @@ ,"NewLine;" * "\x000A" ,"nexist;" * "\x2204" ,"nexists;" * "\x2204"- ,"Nfr;" * "\xD835\xDD11"- ,"nfr;" * "\xD835\xDD2B"+ ,"Nfr;" * "\x1D511"+ ,"nfr;" * "\x1D52B" ,"ngE;" * "\x2267\x0338" ,"nge;" * "\x2271" ,"ngeq;" * "\x2271"@@ -1305,7 +1305,7 @@ ,"NoBreak;" * "\x2060" ,"NonBreakingSpace;" * "\x00A0" ,"Nopf;" * "\x2115"- ,"nopf;" * "\xD835\xDD5F"+ ,"nopf;" * "\x1D55F" ,"not" * "\x00AC" ,"not;" * "\x00AC" ,"Not;" * "\x2AEC"@@ -1391,8 +1391,8 @@ ,"nsc;" * "\x2281" ,"nsccue;" * "\x22E1" ,"nsce;" * "\x2AB0\x0338"- ,"Nscr;" * "\xD835\xDCA9"- ,"nscr;" * "\xD835\xDCC3"+ ,"Nscr;" * "\x1D4A9"+ ,"nscr;" * "\x1D4C3" ,"nshortmid;" * "\x2224" ,"nshortparallel;" * "\x2226" ,"nsim;" * "\x2241"@@ -1473,8 +1473,8 @@ ,"OElig;" * "\x0152" ,"oelig;" * "\x0153" ,"ofcir;" * "\x29BF"- ,"Ofr;" * "\xD835\xDD12"- ,"ofr;" * "\xD835\xDD2C"+ ,"Ofr;" * "\x1D512"+ ,"ofr;" * "\x1D52C" ,"ogon;" * "\x02DB" ,"Ograve" * "\x00D2" ,"ograve" * "\x00F2"@@ -1497,8 +1497,8 @@ ,"omicron;" * "\x03BF" ,"omid;" * "\x29B6" ,"ominus;" * "\x2296"- ,"Oopf;" * "\xD835\xDD46"- ,"oopf;" * "\xD835\xDD60"+ ,"Oopf;" * "\x1D546"+ ,"oopf;" * "\x1D560" ,"opar;" * "\x29B7" ,"OpenCurlyDoubleQuote;" * "\x201C" ,"OpenCurlyQuote;" * "\x2018"@@ -1520,7 +1520,7 @@ ,"orv;" * "\x2A5B" ,"oS;" * "\x24C8" ,"oscr;" * "\x2134"- ,"Oscr;" * "\xD835\xDCAA"+ ,"Oscr;" * "\x1D4AA" ,"Oslash" * "\x00D8" ,"oslash" * "\x00F8" ,"Oslash;" * "\x00D8"@@ -1557,8 +1557,8 @@ ,"permil;" * "\x2030" ,"perp;" * "\x22A5" ,"pertenk;" * "\x2031"- ,"Pfr;" * "\xD835\xDD13"- ,"pfr;" * "\xD835\xDD2D"+ ,"Pfr;" * "\x1D513"+ ,"pfr;" * "\x1D52D" ,"Phi;" * "\x03A6" ,"phi;" * "\x03C6" ,"phiv;" * "\x03D5"@@ -1587,7 +1587,7 @@ ,"Poincareplane;" * "\x210C" ,"pointint;" * "\x2A15" ,"Popf;" * "\x2119"- ,"popf;" * "\xD835\xDD61"+ ,"popf;" * "\x1D561" ,"pound" * "\x00A3" ,"pound;" * "\x00A3" ,"pr;" * "\x227A"@@ -1625,19 +1625,19 @@ ,"propto;" * "\x221D" ,"prsim;" * "\x227E" ,"prurel;" * "\x22B0"- ,"Pscr;" * "\xD835\xDCAB"- ,"pscr;" * "\xD835\xDCC5"+ ,"Pscr;" * "\x1D4AB"+ ,"pscr;" * "\x1D4C5" ,"Psi;" * "\x03A8" ,"psi;" * "\x03C8" ,"puncsp;" * "\x2008"- ,"Qfr;" * "\xD835\xDD14"- ,"qfr;" * "\xD835\xDD2E"+ ,"Qfr;" * "\x1D514"+ ,"qfr;" * "\x1D52E" ,"qint;" * "\x2A0C" ,"Qopf;" * "\x211A"- ,"qopf;" * "\xD835\xDD62"+ ,"qopf;" * "\x1D562" ,"qprime;" * "\x2057"- ,"Qscr;" * "\xD835\xDCAC"- ,"qscr;" * "\xD835\xDCC6"+ ,"Qscr;" * "\x1D4AC"+ ,"qscr;" * "\x1D4C6" ,"quaternions;" * "\x210D" ,"quatint;" * "\x2A16" ,"quest;" * "\x003F"@@ -1716,7 +1716,7 @@ ,"rfisht;" * "\x297D" ,"rfloor;" * "\x230B" ,"Rfr;" * "\x211C"- ,"rfr;" * "\xD835\xDD2F"+ ,"rfr;" * "\x1D52F" ,"rHar;" * "\x2964" ,"rhard;" * "\x21C1" ,"rharu;" * "\x21C0"@@ -1769,7 +1769,7 @@ ,"robrk;" * "\x27E7" ,"ropar;" * "\x2986" ,"Ropf;" * "\x211D"- ,"ropf;" * "\xD835\xDD63"+ ,"ropf;" * "\x1D563" ,"roplus;" * "\x2A2E" ,"rotimes;" * "\x2A35" ,"RoundImplies;" * "\x2970"@@ -1780,7 +1780,7 @@ ,"Rrightarrow;" * "\x21DB" ,"rsaquo;" * "\x203A" ,"Rscr;" * "\x211B"- ,"rscr;" * "\xD835\xDCC7"+ ,"rscr;" * "\x1D4C7" ,"Rsh;" * "\x21B1" ,"rsh;" * "\x21B1" ,"rsqb;" * "\x005D"@@ -1831,8 +1831,8 @@ ,"setminus;" * "\x2216" ,"setmn;" * "\x2216" ,"sext;" * "\x2736"- ,"Sfr;" * "\xD835\xDD16"- ,"sfr;" * "\xD835\xDD30"+ ,"Sfr;" * "\x1D516"+ ,"sfr;" * "\x1D530" ,"sfrown;" * "\x2322" ,"sharp;" * "\x266F" ,"SHCHcy;" * "\x0429"@@ -1877,8 +1877,8 @@ ,"sol;" * "\x002F" ,"solb;" * "\x29C4" ,"solbar;" * "\x233F"- ,"Sopf;" * "\xD835\xDD4A"- ,"sopf;" * "\xD835\xDD64"+ ,"Sopf;" * "\x1D54A"+ ,"sopf;" * "\x1D564" ,"spades;" * "\x2660" ,"spadesuit;" * "\x2660" ,"spar;" * "\x2225"@@ -1907,8 +1907,8 @@ ,"squarf;" * "\x25AA" ,"squf;" * "\x25AA" ,"srarr;" * "\x2192"- ,"Sscr;" * "\xD835\xDCAE"- ,"sscr;" * "\xD835\xDCC8"+ ,"Sscr;" * "\x1D4AE"+ ,"sscr;" * "\x1D4C8" ,"ssetmn;" * "\x2216" ,"ssmile;" * "\x2323" ,"sstarf;" * "\x22C6"@@ -2006,8 +2006,8 @@ ,"tcy;" * "\x0442" ,"tdot;" * "\x20DB" ,"telrec;" * "\x2315"- ,"Tfr;" * "\xD835\xDD17"- ,"tfr;" * "\xD835\xDD31"+ ,"Tfr;" * "\x1D517"+ ,"tfr;" * "\x1D531" ,"there4;" * "\x2234" ,"Therefore;" * "\x2234" ,"therefore;" * "\x2234"@@ -2041,8 +2041,8 @@ ,"top;" * "\x22A4" ,"topbot;" * "\x2336" ,"topcir;" * "\x2AF1"- ,"Topf;" * "\xD835\xDD4B"- ,"topf;" * "\xD835\xDD65"+ ,"Topf;" * "\x1D54B"+ ,"topf;" * "\x1D565" ,"topfork;" * "\x2ADA" ,"tosa;" * "\x2929" ,"tprime;" * "\x2034"@@ -2063,8 +2063,8 @@ ,"trisb;" * "\x29CD" ,"tritime;" * "\x2A3B" ,"trpezium;" * "\x23E2"- ,"Tscr;" * "\xD835\xDCAF"- ,"tscr;" * "\xD835\xDCC9"+ ,"Tscr;" * "\x1D4AF"+ ,"tscr;" * "\x1D4C9" ,"TScy;" * "\x0426" ,"tscy;" * "\x0446" ,"TSHcy;" * "\x040B"@@ -2097,8 +2097,8 @@ ,"udblac;" * "\x0171" ,"udhar;" * "\x296E" ,"ufisht;" * "\x297E"- ,"Ufr;" * "\xD835\xDD18"- ,"ufr;" * "\xD835\xDD32"+ ,"Ufr;" * "\x1D518"+ ,"ufr;" * "\x1D532" ,"Ugrave" * "\x00D9" ,"ugrave" * "\x00F9" ,"Ugrave;" * "\x00D9"@@ -2123,8 +2123,8 @@ ,"UnionPlus;" * "\x228E" ,"Uogon;" * "\x0172" ,"uogon;" * "\x0173"- ,"Uopf;" * "\xD835\xDD4C"- ,"uopf;" * "\xD835\xDD66"+ ,"Uopf;" * "\x1D54C"+ ,"uopf;" * "\x1D566" ,"UpArrow;" * "\x2191" ,"uparrow;" * "\x2191" ,"Uparrow;" * "\x21D1"@@ -2153,8 +2153,8 @@ ,"Uring;" * "\x016E" ,"uring;" * "\x016F" ,"urtri;" * "\x25F9"- ,"Uscr;" * "\xD835\xDCB0"- ,"uscr;" * "\xD835\xDCCA"+ ,"Uscr;" * "\x1D4B0"+ ,"uscr;" * "\x1D4CA" ,"utdot;" * "\x22F0" ,"Utilde;" * "\x0168" ,"utilde;" * "\x0169"@@ -2208,17 +2208,17 @@ ,"VerticalSeparator;" * "\x2758" ,"VerticalTilde;" * "\x2240" ,"VeryThinSpace;" * "\x200A"- ,"Vfr;" * "\xD835\xDD19"- ,"vfr;" * "\xD835\xDD33"+ ,"Vfr;" * "\x1D519"+ ,"vfr;" * "\x1D533" ,"vltri;" * "\x22B2" ,"vnsub;" * "\x2282\x20D2" ,"vnsup;" * "\x2283\x20D2"- ,"Vopf;" * "\xD835\xDD4D"- ,"vopf;" * "\xD835\xDD67"+ ,"Vopf;" * "\x1D54D"+ ,"vopf;" * "\x1D567" ,"vprop;" * "\x221D" ,"vrtri;" * "\x22B3"- ,"Vscr;" * "\xD835\xDCB1"- ,"vscr;" * "\xD835\xDCCB"+ ,"Vscr;" * "\x1D4B1"+ ,"vscr;" * "\x1D4CB" ,"vsubne;" * "\x228A\xFE00" ,"vsubnE;" * "\x2ACB\xFE00" ,"vsupne;" * "\x228B\xFE00"@@ -2232,21 +2232,21 @@ ,"Wedge;" * "\x22C0" ,"wedgeq;" * "\x2259" ,"weierp;" * "\x2118"- ,"Wfr;" * "\xD835\xDD1A"- ,"wfr;" * "\xD835\xDD34"- ,"Wopf;" * "\xD835\xDD4E"- ,"wopf;" * "\xD835\xDD68"+ ,"Wfr;" * "\x1D51A"+ ,"wfr;" * "\x1D534"+ ,"Wopf;" * "\x1D54E"+ ,"wopf;" * "\x1D568" ,"wp;" * "\x2118" ,"wr;" * "\x2240" ,"wreath;" * "\x2240"- ,"Wscr;" * "\xD835\xDCB2"- ,"wscr;" * "\xD835\xDCCC"+ ,"Wscr;" * "\x1D4B2"+ ,"wscr;" * "\x1D4CC" ,"xcap;" * "\x22C2" ,"xcirc;" * "\x25EF" ,"xcup;" * "\x22C3" ,"xdtri;" * "\x25BD"- ,"Xfr;" * "\xD835\xDD1B"- ,"xfr;" * "\xD835\xDD35"+ ,"Xfr;" * "\x1D51B"+ ,"xfr;" * "\x1D535" ,"xharr;" * "\x27F7" ,"xhArr;" * "\x27FA" ,"Xi;" * "\x039E"@@ -2256,14 +2256,14 @@ ,"xmap;" * "\x27FC" ,"xnis;" * "\x22FB" ,"xodot;" * "\x2A00"- ,"Xopf;" * "\xD835\xDD4F"- ,"xopf;" * "\xD835\xDD69"+ ,"Xopf;" * "\x1D54F"+ ,"xopf;" * "\x1D569" ,"xoplus;" * "\x2A01" ,"xotime;" * "\x2A02" ,"xrarr;" * "\x27F6" ,"xrArr;" * "\x27F9"- ,"Xscr;" * "\xD835\xDCB3"- ,"xscr;" * "\xD835\xDCCD"+ ,"Xscr;" * "\x1D4B3"+ ,"xscr;" * "\x1D4CD" ,"xsqcup;" * "\x2A06" ,"xuplus;" * "\x2A04" ,"xutri;" * "\x25B3"@@ -2281,14 +2281,14 @@ ,"ycy;" * "\x044B" ,"yen" * "\x00A5" ,"yen;" * "\x00A5"- ,"Yfr;" * "\xD835\xDD1C"- ,"yfr;" * "\xD835\xDD36"+ ,"Yfr;" * "\x1D51C"+ ,"yfr;" * "\x1D536" ,"YIcy;" * "\x0407" ,"yicy;" * "\x0457"- ,"Yopf;" * "\xD835\xDD50"- ,"yopf;" * "\xD835\xDD6A"- ,"Yscr;" * "\xD835\xDCB4"- ,"yscr;" * "\xD835\xDCCE"+ ,"Yopf;" * "\x1D550"+ ,"yopf;" * "\x1D56A"+ ,"Yscr;" * "\x1D4B4"+ ,"yscr;" * "\x1D4CE" ,"YUcy;" * "\x042E" ,"yucy;" * "\x044E" ,"yuml" * "\x00FF"@@ -2307,14 +2307,14 @@ ,"Zeta;" * "\x0396" ,"zeta;" * "\x03B6" ,"Zfr;" * "\x2128"- ,"zfr;" * "\xD835\xDD37"+ ,"zfr;" * "\x1D537" ,"ZHcy;" * "\x0416" ,"zhcy;" * "\x0436" ,"zigrarr;" * "\x21DD" ,"Zopf;" * "\x2124"- ,"zopf;" * "\xD835\xDD6B"- ,"Zscr;" * "\xD835\xDCB5"- ,"zscr;" * "\xD835\xDCCF"+ ,"zopf;" * "\x1D56B"+ ,"Zscr;" * "\x1D4B5"+ ,"zscr;" * "\x1D4CF" ,"zwj;" * "\x200D" ,"zwnj;" * "\x200C" ]
Text/HTML/TagSoup/Match.hs view
@@ -1,42 +1,113 @@ -- | Combinators to match tags. Some people prefer to use @(~==)@ from -- "Text.HTML.TagSoup", others prefer these more structured combinators. -- Which you use is personal preference.-+--+-- The functions below offer maximum flexibility for matching tags.+-- Using 'tagOpen', for example, you can match all links or buttons that have the "btn" class.+--+-- For simple uses cases—like matching all comment tags, or matching opening @\<a>@ tags,+-- use the tag identification functions in "Text.HTML.TagSoup#tag-identification". module Text.HTML.TagSoup.Match where import Text.HTML.TagSoup.Type (Tag(..), Attribute) import Data.List (tails) +-- * Matching Tags --- | match an opening tag+-- | Match an opening tag+--+-- ==== __Examples__+--+-- /Matching an opening @\<a>@ tag with a @"btn"@ class:/+--+-- >>> let tag = TagOpen "a" [("class", "btn")]+-- >>> tagOpen (== "a") (\attrs -> any (== ("class", "btn")) attrs) tag+-- True tagOpen :: (str -> Bool) -> ([Attribute str] -> Bool) -> Tag str -> Bool tagOpen pName pAttrs (TagOpen name attrs) = pName name && pAttrs attrs tagOpen _ _ _ = False --- | match an closing tag+-- | Match a closing tag+--+-- ==== __Examples__+--+-- /Matching a closing @\<\/a>@ tag:/+--+-- >>> tagClose (== "a") (TagClose "a")+-- True+--+-- >>> tagClose (== "a") (TagOpen "a" [])+-- False tagClose :: (str -> Bool) -> Tag str -> Bool tagClose pName (TagClose name) = pName name tagClose _ _ = False --- | match a text+-- | Match text tags+--+-- ==== __Examples__+--+-- /Match all text tags:/+--+-- >>> let tags = parseTags "<p>This is a paragraph</p>"+-- [TagOpen "p" [],TagText "This is a paragraph",TagClose "p"]+-- >>> filter (tagText (const True)) tags+-- [TagText "This is a paragraph"] tagText :: (str -> Bool) -> Tag str -> Bool tagText p (TagText text) = p text tagText _ _ = False +-- | Match comment tags+--+-- ==== __Examples__+--+-- /Matching comment tags that include an exclamation mark:/+--+-- >>> let tags = parseTags "<!--This is a comment-->"+-- [TagComment "This is a comment!"]+-- >>> all (tagComment (\s -> '!' `elem` s)) tags+-- True tagComment :: (str -> Bool) -> Tag str -> Bool tagComment p (TagComment text) = p text tagComment _ _ = False --- | match a opening tag's name literally+-- | Match an opening tag's name literally+--+-- ==== __Examples__+--+-- /Matching @\<a>@ tags with the @id@ "foo":/+--+-- >>> let tag = TagOpen "a" [("id", "foo")]+-- TagOpen "a" [("id","foo")]+-- >>> tagOpenLit "a" (\attrs -> any (== ("id", "foo")) attrs) tag+-- True+-- tagOpenLit :: Eq str => str -> ([Attribute str] -> Bool) -> Tag str -> Bool tagOpenLit name = tagOpen (name==) --- | match a closing tag's name literally+-- | Match a closing tag's name literally+--+-- ==== __Examples__+--+-- /Match a closing @\<a>@ tag:/+--+-- >>> tagCloseLit "a" (TagClose "a")+-- True+--+-- >>> tagCloseLit "a" (TagClose "em")+-- False tagCloseLit :: Eq str => str -> Tag str -> Bool tagCloseLit name = tagClose (name==) +-- | Match an opening tag's name literally, and at least one of its attributes+--+-- ==== __Examples__+--+-- /Matching a @\<div>@ tag with the @id@ "foo":/+--+-- >>> tagOpenAttrLit "div" ("id", "foo") (TagOpen "div" [("id", "foo")])+-- True tagOpenAttrLit :: Eq str => str -> Attribute str -> Tag str -> Bool tagOpenAttrLit name attr = tagOpenLit name (anyAttrLit attr)@@ -46,6 +117,14 @@ with given name, that satisfies a predicate. If an attribute occurs multiple times, all occurrences are checked.++==== __Examples__++/Matching an @\<a>@ tag with an ID that starts with "comment-":/++>>> let commentTag = TagOpen "a" [("id", "comment-45678")]+>>> tagOpenAttrNameLit "a" "id" (\idValue -> "comment-" `Data.List.isPrefixOf` idValue) commentTag+True -} tagOpenAttrNameLit :: Eq str => str -> str -> (str -> Bool) -> Tag str -> Bool tagOpenAttrNameLit tagName attrName pAttrValue =@@ -54,15 +133,35 @@ -- | Check if the 'Tag str' is 'TagOpen' and matches the given name+--+-- ==== __Examples__+--+-- /Matching an @\<a>@ tag:/+--+-- >>> tagOpenNameLit "a" (TagOpen "a" [])+-- True+--+-- >>> tagOpenNameLit "a" (TagOpen "div" [])+-- False tagOpenNameLit :: Eq str => str -> Tag str -> Bool tagOpenNameLit name = tagOpenLit name (const True) -- | Check if the 'Tag str' is 'TagClose' and matches the given name+--+-- ==== __Examples__+--+-- /Matching a closing @\<\/a>@ tag:/+--+-- >>> tagCloseNameLit "a" (TagClose "a")+-- True+--+-- >>> tagCloseNameLit "a" (TagClose "div")+-- False tagCloseNameLit :: Eq str => str -> Tag str -> Bool tagCloseNameLit name = tagCloseLit name -+-- * Matching attributes anyAttr :: ((str,str) -> Bool) -> [Attribute str] -> Bool anyAttr = any
tagsoup.cabal view
@@ -1,6 +1,6 @@ cabal-version: >= 1.6 name: tagsoup-version: 0.13.9+version: 0.13.10 copyright: Neil Mitchell 2006-2016 author: Neil Mitchell <ndmitchell@gmail.com> maintainer: Neil Mitchell <ndmitchell@gmail.com>