1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | package Torello.HTML; import Torello.HTML.helper.AttrRegEx; import Torello.Java.StringParse; import java.util.Properties; import java.util.regex.Matcher; import java.util.stream.Stream; class DataAttributes { static Properties getDataAV( final TagNode tn, final boolean preserveKeysCase ) { Properties ret = new Properties(); // NOTE: OPTIMIZED, "closing-versions" of the TagNode, and TagNode's whose 'str' // field is only longer than the token, itself, by 3 or less characters cannot have // attributes.v In that case, just return an empty 'Properties' instance. if (tn.isClosing || (tn.str.length() <= (tn.tok.length() + 3))) return ret; // This RegEx Matcher 'matches' against Attribute/InnerTag Key-Value Pairs // ONLY PAIRS WHOSE KEY BEGINS WITH "data-" WILL MATCH // // m.group(2): returns the 'key' portion of the key-value pair, before an '=' (equals-sign) // m.group(3): returns the 'value' portion of the key-value pair, after an '=' Matcher m = AttrRegEx.DATA_ATTRIBUTE_REGEX.matcher(tn.str); // NOTE: HTML mandates attributes must be 'case-insensitive' to the attribute 'key-part' // (but not necessarily the 'value-part') // // HOWEVER: Java does not require anything for the 'Properties' class. // ALSO: Case is PRESERVED for the 'value-part' of the key-value pair. if (preserveKeysCase) while (m.find()) ret.put(m.group(2), StringParse.ifQuotesStripQuotes(m.group(3))); else while (m.find()) ret.put(m.group(2).toLowerCase(), StringParse.ifQuotesStripQuotes(m.group(3))); return ret; } static Stream<String> getDataAN( final TagNode tn, final boolean preserveKeysCase ) { // NOTE: OPTIMIZED, "closing-versions" of the TagNode, and TagNode's whose 'str' // field is only longer than the token, itself, by 3 or less characters cannot have // attributes. In that case, just return an empty 'Properties' instance. if (tn.isClosing || (tn.str.length() <= (tn.tok.length() + 3))) return Stream.empty(); // Java Stream's can be quickly and easily converted to any data-structure the user needs. Stream.Builder<String> b = Stream.builder(); // This RegEx Matcher 'matches' against Attribute/InnerTag Key-Value Pairs // ONLY PAIRS WHOSE KEY BEGINS WITH "data-" WILL MATCH // m.group(2): returns the 'key' portion of the key-value pair, before an '=' (equals-sign). // m.group(3): returns the 'value' portion of the key-value pair, after an '=' Matcher m = AttrRegEx.DATA_ATTRIBUTE_REGEX.matcher(tn.str); // NOTE: HTML mandates attributes must be 'case-insensitive' to the attribute 'key-part' // (but not necessarily the 'value-part') // HOWEVER: Java does not require anything for the 'Properties' class. // ALSO: Case is PRESERVED for the 'value-part' of the key-value pair. if (preserveKeysCase) while (m.find()) b.accept(m.group(2)); else while (m.find()) b.accept(m.group(2).toLowerCase()); return b.build(); } } |