2010-08-12 Adam Barth <abarth@webkit.org>
[WebKit-https.git] / WebKitTools / Scripts / create-html-entity-table
1 #!/usr/bin/env python
2 # Copyright (c) 2010 Google Inc. All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are
6 # met:
7
8 #     * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer.
10 #     * Redistributions in binary form must reproduce the above
11 # copyright notice, this list of conditions and the following disclaimer
12 # in the documentation and/or other materials provided with the
13 # distribution.
14 #     * Neither the name of Google Inc. nor the names of its
15 # contributors may be used to endorse or promote products derived from
16 # this software without specific prior written permission.
17
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 import os.path
31 import string
32 import sys
33
34 import webkitpy.thirdparty.simplejson as simplejson
35
36
37 def convert_entity_to_cpp_name(entity):
38     postfix = "EntityName"
39     if entity[-1] == ";":
40         return "%sSemicolon%s" % (entity[:-1], postfix)
41     return "%s%s" % (entity, postfix)
42
43
44 def convert_entity_to_uchar_array(entity):
45     return "{'%s'}" % "', '".join(entity)
46
47
48 def convert_value_to_int(value):
49     assert(value[0] == "U")
50     assert(value[1] == "+")
51     return "0x" + value[2:]
52
53
54 def offset_table_entry(offset):
55     return "    &staticEntityTable[%s]," % offset
56
57
58 program_name = os.path.basename(__file__)
59 if len(sys.argv) < 4 or sys.argv[1] != "-o":
60     print >> sys.stderr, "Usage: %s -o OUTPUT_FILE INPUT_FILE" % program_name
61     exit(1)
62
63 output_path = sys.argv[2]
64 input_path = sys.argv[3]
65
66 html_entity_names_file = open(input_path)
67 entries = simplejson.load(html_entity_names_file)
68 html_entity_names_file.close()
69
70 entries = sorted(entries, key=lambda entry: entry['entity'])
71 entity_count = len(entries)
72
73 output_file = open(output_path, "w")
74
75 print >> output_file, """/*
76  * Copyright (C) 2010 Google, Inc. All Rights Reserved.
77  *
78  * Redistribution and use in source and binary forms, with or without
79  * modification, are permitted provided that the following conditions
80  * are met:
81  * 1. Redistributions of source code must retain the above copyright
82  *    notice, this list of conditions and the following disclaimer.
83  * 2. Redistributions in binary form must reproduce the above copyright
84  *    notice, this list of conditions and the following disclaimer in the
85  *    documentation and/or other materials provided with the distribution.
86  *
87  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
88  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
89  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
90  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
91  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
92  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
93  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
94  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
95  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
96  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
97  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
98  */
99
100 // THIS FILE IS GENERATED BY WebKitTools/Scripts/create-html-entity-table
101 // DO NOT EDIT (unless you are a ninja)!
102
103 #include "config.h"
104 #include "HTMLEntityTable.h"
105
106 namespace WebCore {
107
108 namespace {
109 """
110
111 for entry in entries:
112     print >> output_file, "const UChar %sEntityName[] = %s;" % (
113         convert_entity_to_cpp_name(entry["entity"]),
114         convert_entity_to_uchar_array(entry["entity"]))
115
116 print >> output_file, """
117 HTMLEntityTableEntry staticEntityTable[%s] = {""" % entity_count
118
119 index = {}
120 offset = 0
121 for entry in entries:
122     letter = entry["entity"][0]
123     if not index.get(letter):
124         index[letter] = offset
125     print >> output_file, '    { %sEntityName, %s, %s },' % (
126         convert_entity_to_cpp_name(entry["entity"]),
127         len(entry["entity"]),
128         convert_value_to_int(entry["value"]))
129     offset += 1
130
131 print >> output_file, """};
132 """
133
134 print >> output_file, "const HTMLEntityTableEntry* uppercaseOffset[] = {"
135 for letter in string.uppercase:
136     print >> output_file, offset_table_entry(index[letter])
137 print >> output_file, offset_table_entry(index['a'])
138 print >> output_file, """};
139
140 const HTMLEntityTableEntry* lowercaseOffset[] = {"""
141 for letter in string.lowercase:
142     print >> output_file, offset_table_entry(index[letter])
143 print >> output_file, offset_table_entry(entity_count)
144 print >> output_file, """};
145
146 }
147
148 const HTMLEntityTableEntry* HTMLEntityTable::start(UChar c)
149 {
150     if (c >= 'A' && c <= 'Z')
151         return uppercaseOffset[c - 'A'];
152     if (c >= 'a' && c <= 'z')
153         return lowercaseOffset[c - 'a'];
154     return 0;
155 }
156
157 const HTMLEntityTableEntry* HTMLEntityTable::end(UChar c)
158 {
159     if (c >= 'A' && c <= 'Z')
160         return uppercaseOffset[c - 'A' + 1] - 1;
161     if (c >= 'a' && c <= 'z')
162         return lowercaseOffset[c - 'a' + 1] - 1;
163     return 0;
164 }
165
166 const HTMLEntityTableEntry* HTMLEntityTable::start()
167 {
168     return &staticEntityTable[0];
169 }
170
171 const HTMLEntityTableEntry* HTMLEntityTable::end()
172 {
173     return &staticEntityTable[%s - 1];
174 }
175
176 }
177 """ % entity_count