Index: third_party/WebKit/Source/build/scripts/make_element_lookup_trie.py |
diff --git a/third_party/WebKit/Source/build/scripts/make_element_lookup_trie.py b/third_party/WebKit/Source/build/scripts/make_element_lookup_trie.py |
index 90b696d0c22b83aa0eb1de8fc69b3b559431e477..5d86ffc26db1bd7d4bd2efe95f24303620cc70c9 100755 |
--- a/third_party/WebKit/Source/build/scripts/make_element_lookup_trie.py |
+++ b/third_party/WebKit/Source/build/scripts/make_element_lookup_trie.py |
@@ -27,64 +27,12 @@ |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
-from itertools import groupby, islice |
import sys |
import in_generator |
+import trie_builder |
import template_expander |
-PARAMETER_NAME = 'data' |
- |
- |
-def _trie(tags, index): |
- """Make a trie from list of tags, starting at index. |
- |
- Resulting trie is partly space-optimized (semi-radix tree): once have only |
- one string left, compact the entire branch to one leaf node. |
- However, does not compact branch nodes with a single child. (FIXME) |
- |
- Returns: |
- (char, subtrie, tag, conditions): (char, trie, str, list) |
- code generation differs between branch nodes and leaf nodes, |
- hence need different data for each. |
- |
- Arguments: |
- tags: sorted list |
- (sorted needed by groupby, list needed by len) |
- index: index at which to branch |
- (assumes prior to this index strings have a common prefix) |
- """ |
- def trie_node(char, subtags_iter): |
- # Pass in |char| so we can include in same tuple without unpacking |
- subtags = list(subtags_iter) # need list for len |
- if len(subtags) == 1: # terminal node, no subtrie |
- subtrie = None |
- tag = subtags[0] |
- conditions = _conditions(tag, index + 1) |
- else: |
- subtrie = _trie(subtags, index + 1) |
- tag = None |
- conditions = None |
- return char, subtrie, tag, conditions |
- |
- # Group by char at index |
- def char_at_index(tag): |
- return tag[index].lower() |
- |
- char_subtags = ((k, g) for k, g in groupby(tags, char_at_index)) |
- |
- # FIXME: if all subtags have a common prefix, merge with child |
- # and skip the switch in the generated code |
- |
- return (trie_node(char, subtags) for char, subtags in char_subtags) |
- |
- |
-def _conditions(tag, index): |
- # boolean conditions to check suffix; corresponds to compacting branch |
- # with a single leaf |
- return ["%s[%d] == '%c'" % (PARAMETER_NAME, i, c.lower()) |
- for i, c in islice(enumerate(tag), index, None)] |
- |
class ElementLookupTrieWriter(in_generator.Writer): |
# FIXME: Inherit all these from somewhere. |
@@ -108,7 +56,9 @@ class ElementLookupTrieWriter(in_generator.Writer): |
def __init__(self, in_file_paths): |
super(ElementLookupTrieWriter, self).__init__(in_file_paths) |
- self._tags = [entry['name'] for entry in self.in_file.name_dictionaries] |
+ self._tags = {} |
+ for entry in self.in_file.name_dictionaries: |
+ self._tags[entry['name']] = entry['name'] |
self._namespace = self.in_file.parameters['namespace'].strip('"') |
self._outputs = { |
(self._namespace + 'ElementLookupTrie.h'): self.generate_header, |
@@ -123,15 +73,9 @@ class ElementLookupTrieWriter(in_generator.Writer): |
@template_expander.use_jinja('ElementLookupTrie.cpp.tmpl') |
def generate_implementation(self): |
- # First sort, so groupby works |
- self._tags.sort(key=lambda tag: (len(tag), tag)) |
- # Group tags by length |
- length_tags = ((k, g) for k, g in groupby(self._tags, len)) |
- |
return { |
'namespace': self._namespace, |
- 'length_tries': ((length, _trie(tags, 0)) |
- for length, tags in length_tags), |
+ 'length_tries': trie_builder.trie_list_by_str_length(self._tags) |
} |