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 | package Torello.HTML; import Torello.Java.LV; import Torello.Java.Additional.Ret2; import java.util.Vector; import java.util.stream.IntStream; import java.util.stream.Stream; class Retrieve { static Ret2<int[], String[]> retrieve( final Vector<? super TagNode> html, final int sPos, final int ePos, final String attribute ) { InnerTagKeyException.check(attribute); // Use a Java Int-Stream. Save matches here (vector-position) IntStream.Builder posB = IntStream.builder(); // Use a Java Stream<String>. Save attribute-values here Stream.Builder<String> strB = Stream.builder(); // Temp Variables & Loop Variable LV l = new LV(sPos, ePos, html); TagNode tn; String attribValue; for (int i=l.start; i < l.end; i++) // Only Visit Open TagNode Elements with '.str' long enough to contain attributes if ((tn = ((HTMLNode) html.elementAt(i)).openTagPWA()) != null) // If the Open-Tag does not have the attribute, skip the node. If it does, save it. if ((attribValue = tn.AV(attribute)) != null) { posB.accept(i); // Save the vector-index position of the TagNode strB.accept(attribValue); // Save the Attribute-Value inside that TagNode } // Java Stream's shall build the arrays. Put them into an instance of Ret2, and return return new Ret2<>(posB.build().toArray(), strB.build().toArray(String[]::new)); } static String[] retrieve( final Vector<? super TagNode> html, final int[] posArr, final String attribute ) { InnerTagKeyException.check(attribute); // Return Array, and its corresponding array-index pointer. String[] ret = new String[posArr.length]; int i = 0; // Minimum length of the TagNode.str to even have the specified attribute // '<', TOKEN, SPACE, INNERTAG, '=', '>' int MIN = 4 + attribute.length(); for (int pos: posArr) { HTMLNode n = (HTMLNode) html.elementAt(pos); if (! n.isTagNode()) throw new TagNodeExpectedException(pos); TagNode tn = (TagNode) n; if (tn.isClosing) throw new OpeningTagNodeExpectedException(pos); ret[i++] = (tn.str.length() < (tn.tok.length() + MIN)) ? null // CASE-1: TagNode.str is too short to even have the attribute : tn.AV(attribute); // CASE-2: Possibly has it: Save the result of TagNode.AV(...) } return ret; } } |