|
4 | 4 | import org.jsoup.nodes.Element; |
5 | 5 | import org.junit.jupiter.api.Test; |
6 | 6 |
|
| 7 | +import java.util.concurrent.atomic.AtomicInteger; |
| 8 | + |
7 | 9 | import static org.jsoup.parser.Parser.NamespaceHtml; |
8 | 10 | import static org.junit.jupiter.api.Assertions.*; |
9 | 11 |
|
@@ -105,4 +107,81 @@ public class TagSetTest { |
105 | 107 | c1.clear(Tag.Known); |
106 | 108 | assertFalse(c1.isKnownTag()); |
107 | 109 | } |
| 110 | + |
| 111 | + @Test void canCustomizeAll() { |
| 112 | + TagSet tags = TagSet.Html(); |
| 113 | + tags.onNewTag(tag -> tag.set(Tag.SelfClose)); |
| 114 | + assertTrue(tags.get("script", NamespaceHtml).is(Tag.SelfClose)); |
| 115 | + assertTrue(tags.valueOf("SCRIPT", NamespaceHtml).is(Tag.SelfClose)); |
| 116 | + assertTrue(tags.valueOf("custom", NamespaceHtml).is(Tag.SelfClose)); |
| 117 | + |
| 118 | + Tag foo = new Tag("foo", NamespaceHtml); |
| 119 | + assertFalse(foo.is(Tag.SelfClose)); |
| 120 | + tags.add(foo); |
| 121 | + assertTrue(foo.is(Tag.SelfClose)); |
| 122 | + } |
| 123 | + |
| 124 | + @Test void canCustomizeSome() { |
| 125 | + TagSet tags = TagSet.Html(); |
| 126 | + tags.onNewTag(tag -> { |
| 127 | + if (!tag.isKnownTag()) { |
| 128 | + tag.set(Tag.SelfClose); |
| 129 | + } |
| 130 | + }); |
| 131 | + assertFalse(tags.valueOf("script", NamespaceHtml).is(Tag.SelfClose)); |
| 132 | + assertFalse(tags.valueOf("SCRIPT", NamespaceHtml).is(Tag.SelfClose)); |
| 133 | + assertTrue(tags.valueOf("custom-tag", NamespaceHtml).is(Tag.SelfClose)); |
| 134 | + } |
| 135 | + |
| 136 | + @Test void canParseWithCustomization() { |
| 137 | + // really would use tag.valueOf("script"); just a test example here |
| 138 | + Parser parser = Parser.htmlParser(); |
| 139 | + parser.tagSet().onNewTag(tag -> { |
| 140 | + if (tag.normalName().equals("script")) |
| 141 | + tag.set(Tag.SelfClose); |
| 142 | + }); |
| 143 | + |
| 144 | + Document doc = Jsoup.parse("<script />Text", parser); |
| 145 | + assertEquals("<html>\n <head>\n <script></script>\n </head>\n <body>Text</body>\n</html>", doc.html()); |
| 146 | + // self closing bit still produces valid HTML |
| 147 | + } |
| 148 | + |
| 149 | + @Test void canParseWithGeneralCustomization() { |
| 150 | + Parser parser = Parser.htmlParser(); |
| 151 | + parser.tagSet().onNewTag(tag -> { |
| 152 | + if (!tag.isKnownTag()) |
| 153 | + tag.set(Tag.SelfClose); |
| 154 | + }); |
| 155 | + |
| 156 | + Document doc = Jsoup.parse("<custom-data />Bar <script />Text", parser); |
| 157 | + assertEquals("<custom-data></custom-data>Bar\n<script>Text</script>", doc.body().html()); |
| 158 | + } |
| 159 | + |
| 160 | + @Test void supportsMultipleCustomizers() { |
| 161 | + TagSet tags = TagSet.Html(); |
| 162 | + tags.onNewTag(tag -> { |
| 163 | + if (tag.normalName().equals("script")) |
| 164 | + tag.set(Tag.SelfClose); |
| 165 | + }); |
| 166 | + tags.onNewTag(tag -> { |
| 167 | + if (!tag.isKnownTag()) |
| 168 | + tag.set(Tag.RcData); |
| 169 | + }); |
| 170 | + |
| 171 | + assertTrue(tags.valueOf("script", NamespaceHtml).is(Tag.SelfClose)); |
| 172 | + assertFalse(tags.valueOf("script", NamespaceHtml).is(Tag.RcData)); |
| 173 | + assertTrue(tags.valueOf("custom-tag", NamespaceHtml).is(Tag.RcData)); |
| 174 | + } |
| 175 | + |
| 176 | + @Test void customizersArePreservedInSource() { |
| 177 | + TagSet source = TagSet.Html(); |
| 178 | + source.onNewTag(tag -> tag.set(Tag.RcData)); |
| 179 | + TagSet copy = new TagSet(source); |
| 180 | + assertTrue(copy.valueOf("script", NamespaceHtml).is(Tag.RcData)); |
| 181 | + assertTrue(source.valueOf("script", NamespaceHtml).is(Tag.RcData)); |
| 182 | + |
| 183 | + copy.onNewTag(tag -> tag.set(Tag.Void)); |
| 184 | + assertTrue(copy.valueOf("custom-tag", NamespaceHtml).is(Tag.Void)); |
| 185 | + assertFalse(source.valueOf("custom-tag", NamespaceHtml).is(Tag.Void)); |
| 186 | + } |
108 | 187 | } |
0 commit comments