summaryrefslogtreecommitdiff
path: root/Source/WebCore/css/makeSelectorPseudoClassAndCompatibilityElementMap.py
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/css/makeSelectorPseudoClassAndCompatibilityElementMap.py')
-rw-r--r--Source/WebCore/css/makeSelectorPseudoClassAndCompatibilityElementMap.py217
1 files changed, 217 insertions, 0 deletions
diff --git a/Source/WebCore/css/makeSelectorPseudoClassAndCompatibilityElementMap.py b/Source/WebCore/css/makeSelectorPseudoClassAndCompatibilityElementMap.py
new file mode 100644
index 000000000..78332271a
--- /dev/null
+++ b/Source/WebCore/css/makeSelectorPseudoClassAndCompatibilityElementMap.py
@@ -0,0 +1,217 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2014 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGE.
+
+import os
+import sys
+
+
+def enumerablePseudoType(stringPseudoType):
+ output = ['CSSSelector::PseudoClass']
+
+ if stringPseudoType.endswith('('):
+ stringPseudoType = stringPseudoType[:-1]
+
+ webkitPrefix = '-webkit-'
+ if (stringPseudoType.startswith(webkitPrefix)):
+ stringPseudoType = stringPseudoType[len(webkitPrefix):]
+
+ khtmlPrefix = '-khtml-'
+ if (stringPseudoType.startswith(khtmlPrefix)):
+ stringPseudoType = stringPseudoType[len(khtmlPrefix):]
+
+ substring_start = 0
+ next_dash_position = stringPseudoType.find('-')
+ while (next_dash_position != -1):
+ output.append(stringPseudoType[substring_start].upper())
+ output.append(stringPseudoType[substring_start + 1:next_dash_position])
+ substring_start = next_dash_position + 1
+ next_dash_position = stringPseudoType.find('-', substring_start)
+
+ output.append(stringPseudoType[substring_start].upper())
+ output.append(stringPseudoType[substring_start + 1:])
+ return ''.join(output)
+
+
+def expand_ifdef_condition(condition):
+ return condition.replace('(', '_').replace(')', '')
+
+output_file = open('SelectorPseudoClassAndCompatibilityElementMap.gperf', 'w')
+
+output_file.write("""
+%{
+/*
+ * Copyright (C) 2014-2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// This file is automatically generated from SelectorPseudoTypeMap.in by makeprop, do not edit by hand.
+
+#include "config.h"
+#include "SelectorPseudoTypeMap.h"
+
+#include "CSSParserSelector.h"
+
+#if defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunknown-pragmas"
+#pragma clang diagnostic ignored "-Wdeprecated-register"
+#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
+#endif
+
+namespace WebCore {
+
+struct SelectorPseudoClassOrCompatibilityPseudoElementEntry {
+ const char* name;
+ PseudoClassOrCompatibilityPseudoElement pseudoTypes;
+};
+
+%}
+%struct-type
+%define initializer-suffix ,{CSSSelector::PseudoClassUnknown,CSSSelector::PseudoElementUnknown}
+%define class-name SelectorPseudoClassAndCompatibilityElementMapHash
+%omit-struct-type
+%language=C++
+%readonly-tables
+%global-table
+%ignore-case
+%compare-strncmp
+%enum
+
+struct SelectorPseudoClassOrCompatibilityPseudoElementEntry;
+
+%%
+""")
+
+webcore_defines = [i.strip() for i in sys.argv[-1].split(' ')]
+
+longest_keyword = 0
+
+ignore_until_endif = False
+input_file = open(sys.argv[1], 'r')
+for line in input_file:
+ line = line.strip()
+ if not line:
+ continue
+
+ if line.startswith('#if '):
+ condition = line[4:].strip()
+ if expand_ifdef_condition(condition) not in webcore_defines:
+ ignore_until_endif = True
+ continue
+
+ if line.startswith('#endif'):
+ ignore_until_endif = False
+ continue
+
+ if ignore_until_endif:
+ continue
+
+ keyword_definition = line.split(',')
+ if len(keyword_definition) == 1:
+ keyword = keyword_definition[0].strip()
+ output_file.write('"%s", {%s, CSSSelector::PseudoElementUnknown}\n' % (keyword, enumerablePseudoType(keyword)))
+ else:
+ output_file.write('"%s", {CSSSelector::%s, CSSSelector::%s}\n' % (keyword_definition[0].strip(), keyword_definition[1].strip(), keyword_definition[2].strip()))
+
+ longest_keyword = max(longest_keyword, len(keyword))
+
+output_file.write("""%%
+
+static inline const SelectorPseudoClassOrCompatibilityPseudoElementEntry* parsePseudoClassAndCompatibilityElementString(const LChar* characters, unsigned length)
+{
+ return SelectorPseudoClassAndCompatibilityElementMapHash::in_word_set(reinterpret_cast<const char*>(characters), length);
+}""")
+
+output_file.write("""
+
+static inline const SelectorPseudoClassOrCompatibilityPseudoElementEntry* parsePseudoClassAndCompatibilityElementString(const UChar* characters, unsigned length)
+{
+ const unsigned maxKeywordLength = %s;
+ LChar buffer[maxKeywordLength];
+ if (length > maxKeywordLength)
+ return nullptr;
+
+ for (unsigned i = 0; i < length; ++i) {
+ UChar character = characters[i];
+ if (character & ~0xff)
+ return nullptr;
+
+ buffer[i] = static_cast<LChar>(character);
+ }
+ return parsePseudoClassAndCompatibilityElementString(buffer, length);
+}
+""" % longest_keyword)
+
+output_file.write("""
+PseudoClassOrCompatibilityPseudoElement parsePseudoClassAndCompatibilityElementString(const StringView& pseudoTypeString)
+{
+ const SelectorPseudoClassOrCompatibilityPseudoElementEntry* entry;
+ if (pseudoTypeString.is8Bit())
+ entry = parsePseudoClassAndCompatibilityElementString(pseudoTypeString.characters8(), pseudoTypeString.length());
+ else
+ entry = parsePseudoClassAndCompatibilityElementString(pseudoTypeString.characters16(), pseudoTypeString.length());
+
+ if (entry)
+ return entry->pseudoTypes;
+ return { CSSSelector::PseudoClassUnknown, CSSSelector::PseudoElementUnknown };
+}
+
+} // namespace WebCore
+
+#if defined(__clang__)
+#pragma clang diagnostic pop
+#endif
+
+""")
+output_file.close()
+
+gperf_command = sys.argv[2]
+if 'GPERF' in os.environ:
+ gperf_command = os.environ['GPERF']
+
+gperf_return = os.system("%s --key-positions=\"*\" -m 10 -s 2 SelectorPseudoClassAndCompatibilityElementMap.gperf --output-file=SelectorPseudoClassAndCompatibilityElementMap.cpp" % gperf_command)
+if gperf_return != 0:
+ print("Error when generating SelectorPseudoClassAndCompatibilityElementMap.cpp from SelectorPseudoClassAndCompatibilityElementMap.gperf :(")
+ sys.exit(gperf_return)