PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/node_modules/pygmentize-bundled/vendor/pygments/build-3.3/pygments/lexers/_postgres_builtins.py

https://gitlab.com/TurnInternational/simon
Python | 233 lines | 208 code | 10 blank | 15 comment | 5 complexity | 80ba05821e8c395af43829d2276ef34e MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. """
  3. pygments.lexers._postgres_builtins
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. Self-updating data files for PostgreSQL lexer.
  6. :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
  7. :license: BSD, see LICENSE for details.
  8. """
  9. import re
  10. import urllib.request, urllib.parse, urllib.error
  11. # One man's constant is another man's variable.
  12. SOURCE_URL = 'https://github.com/postgres/postgres/raw/master'
  13. KEYWORDS_URL = SOURCE_URL + '/doc/src/sgml/keywords.sgml'
  14. DATATYPES_URL = SOURCE_URL + '/doc/src/sgml/datatype.sgml'
  15. def update_myself():
  16. data_file = list(fetch(DATATYPES_URL))
  17. datatypes = parse_datatypes(data_file)
  18. pseudos = parse_pseudos(data_file)
  19. keywords = parse_keywords(fetch(KEYWORDS_URL))
  20. update_consts(__file__, 'DATATYPES', datatypes)
  21. update_consts(__file__, 'PSEUDO_TYPES', pseudos)
  22. update_consts(__file__, 'KEYWORDS', keywords)
  23. def parse_keywords(f):
  24. kw = []
  25. for m in re.finditer(
  26. r'\s*<entry><token>([^<]+)</token></entry>\s*'
  27. r'<entry>([^<]+)</entry>', f.read()):
  28. kw.append(m.group(1))
  29. if not kw:
  30. raise ValueError('no keyword found')
  31. kw.sort()
  32. return kw
  33. def parse_datatypes(f):
  34. dt = set()
  35. for line in f:
  36. if '<sect1' in line:
  37. break
  38. if '<entry><type>' not in line:
  39. continue
  40. # Parse a string such as
  41. # time [ (<replaceable>p</replaceable>) ] [ without time zone ]
  42. # into types "time" and "without time zone"
  43. # remove all the tags
  44. line = re.sub("<replaceable>[^<]+</replaceable>", "", line)
  45. line = re.sub("<[^>]+>", "", line)
  46. # Drop the parts containing braces
  47. for tmp in [t for tmp in line.split('[')
  48. for t in tmp.split(']') if "(" not in t]:
  49. for t in tmp.split(','):
  50. t = t.strip()
  51. if not t: continue
  52. dt.add(" ".join(t.split()))
  53. dt = list(dt)
  54. dt.sort()
  55. return dt
  56. def parse_pseudos(f):
  57. dt = []
  58. re_start = re.compile(r'\s*<table id="datatype-pseudotypes-table">')
  59. re_entry = re.compile(r'\s*<entry><type>([^<]+)</></entry>')
  60. re_end = re.compile(r'\s*</table>')
  61. f = iter(f)
  62. for line in f:
  63. if re_start.match(line) is not None:
  64. break
  65. else:
  66. raise ValueError('pseudo datatypes table not found')
  67. for line in f:
  68. m = re_entry.match(line)
  69. if m is not None:
  70. dt.append(m.group(1))
  71. if re_end.match(line) is not None:
  72. break
  73. else:
  74. raise ValueError('end of pseudo datatypes table not found')
  75. if not dt:
  76. raise ValueError('pseudo datatypes not found')
  77. return dt
  78. def fetch(url):
  79. return urllib.request.urlopen(url)
  80. def update_consts(filename, constname, content):
  81. f = open(filename)
  82. lines = f.readlines()
  83. f.close()
  84. # Line to start/end inserting
  85. re_start = re.compile(r'^%s\s*=\s*\[\s*$' % constname)
  86. re_end = re.compile(r'^\s*\]\s*$')
  87. start = [ n for n, l in enumerate(lines) if re_start.match(l) ]
  88. if not start:
  89. raise ValueError("couldn't find line containing '%s = ['" % constname)
  90. if len(start) > 1:
  91. raise ValueError("too many lines containing '%s = ['" % constname)
  92. start = start[0] + 1
  93. end = [ n for n, l in enumerate(lines) if n >= start and re_end.match(l) ]
  94. if not end:
  95. raise ValueError("couldn't find line containing ']' after %s " % constname)
  96. end = end[0]
  97. # Pack the new content in lines not too long
  98. content = [repr(item) for item in content ]
  99. new_lines = [[]]
  100. for item in content:
  101. if sum(map(len, new_lines[-1])) + 2 * len(new_lines[-1]) + len(item) + 4 > 75:
  102. new_lines.append([])
  103. new_lines[-1].append(item)
  104. lines[start:end] = [ " %s,\n" % ", ".join(items) for items in new_lines ]
  105. f = open(filename, 'w')
  106. f.write(''.join(lines))
  107. f.close()
  108. # Autogenerated: please edit them if you like wasting your time.
  109. KEYWORDS = [
  110. 'ABORT', 'ABSOLUTE', 'ACCESS', 'ACTION', 'ADD', 'ADMIN', 'AFTER',
  111. 'AGGREGATE', 'ALL', 'ALSO', 'ALTER', 'ALWAYS', 'ANALYSE', 'ANALYZE',
  112. 'AND', 'ANY', 'ARRAY', 'AS', 'ASC', 'ASSERTION', 'ASSIGNMENT',
  113. 'ASYMMETRIC', 'AT', 'ATTRIBUTE', 'AUTHORIZATION', 'BACKWARD', 'BEFORE',
  114. 'BEGIN', 'BETWEEN', 'BIGINT', 'BINARY', 'BIT', 'BOOLEAN', 'BOTH', 'BY',
  115. 'CACHE', 'CALLED', 'CASCADE', 'CASCADED', 'CASE', 'CAST', 'CATALOG',
  116. 'CHAIN', 'CHAR', 'CHARACTER', 'CHARACTERISTICS', 'CHECK', 'CHECKPOINT',
  117. 'CLASS', 'CLOSE', 'CLUSTER', 'COALESCE', 'COLLATE', 'COLLATION',
  118. 'COLUMN', 'COMMENT', 'COMMENTS', 'COMMIT', 'COMMITTED', 'CONCURRENTLY',
  119. 'CONFIGURATION', 'CONNECTION', 'CONSTRAINT', 'CONSTRAINTS', 'CONTENT',
  120. 'CONTINUE', 'CONVERSION', 'COPY', 'COST', 'CREATE', 'CROSS', 'CSV',
  121. 'CURRENT', 'CURRENT_CATALOG', 'CURRENT_DATE', 'CURRENT_ROLE',
  122. 'CURRENT_SCHEMA', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER',
  123. 'CURSOR', 'CYCLE', 'DATA', 'DATABASE', 'DAY', 'DEALLOCATE', 'DEC',
  124. 'DECIMAL', 'DECLARE', 'DEFAULT', 'DEFAULTS', 'DEFERRABLE', 'DEFERRED',
  125. 'DEFINER', 'DELETE', 'DELIMITER', 'DELIMITERS', 'DESC', 'DICTIONARY',
  126. 'DISABLE', 'DISCARD', 'DISTINCT', 'DO', 'DOCUMENT', 'DOMAIN', 'DOUBLE',
  127. 'DROP', 'EACH', 'ELSE', 'ENABLE', 'ENCODING', 'ENCRYPTED', 'END',
  128. 'ENUM', 'ESCAPE', 'EXCEPT', 'EXCLUDE', 'EXCLUDING', 'EXCLUSIVE',
  129. 'EXECUTE', 'EXISTS', 'EXPLAIN', 'EXTENSION', 'EXTERNAL', 'EXTRACT',
  130. 'FALSE', 'FAMILY', 'FETCH', 'FIRST', 'FLOAT', 'FOLLOWING', 'FOR',
  131. 'FORCE', 'FOREIGN', 'FORWARD', 'FREEZE', 'FROM', 'FULL', 'FUNCTION',
  132. 'FUNCTIONS', 'GLOBAL', 'GRANT', 'GRANTED', 'GREATEST', 'GROUP',
  133. 'HANDLER', 'HAVING', 'HEADER', 'HOLD', 'HOUR', 'IDENTITY', 'IF',
  134. 'ILIKE', 'IMMEDIATE', 'IMMUTABLE', 'IMPLICIT', 'IN', 'INCLUDING',
  135. 'INCREMENT', 'INDEX', 'INDEXES', 'INHERIT', 'INHERITS', 'INITIALLY',
  136. 'INLINE', 'INNER', 'INOUT', 'INPUT', 'INSENSITIVE', 'INSERT', 'INSTEAD',
  137. 'INT', 'INTEGER', 'INTERSECT', 'INTERVAL', 'INTO', 'INVOKER', 'IS',
  138. 'ISNULL', 'ISOLATION', 'JOIN', 'KEY', 'LABEL', 'LANGUAGE', 'LARGE',
  139. 'LAST', 'LC_COLLATE', 'LC_CTYPE', 'LEADING', 'LEAST', 'LEFT', 'LEVEL',
  140. 'LIKE', 'LIMIT', 'LISTEN', 'LOAD', 'LOCAL', 'LOCALTIME',
  141. 'LOCALTIMESTAMP', 'LOCATION', 'LOCK', 'MAPPING', 'MATCH', 'MAXVALUE',
  142. 'MINUTE', 'MINVALUE', 'MODE', 'MONTH', 'MOVE', 'NAME', 'NAMES',
  143. 'NATIONAL', 'NATURAL', 'NCHAR', 'NEXT', 'NO', 'NONE', 'NOT', 'NOTHING',
  144. 'NOTIFY', 'NOTNULL', 'NOWAIT', 'NULL', 'NULLIF', 'NULLS', 'NUMERIC',
  145. 'OBJECT', 'OF', 'OFF', 'OFFSET', 'OIDS', 'ON', 'ONLY', 'OPERATOR',
  146. 'OPTION', 'OPTIONS', 'OR', 'ORDER', 'OUT', 'OUTER', 'OVER', 'OVERLAPS',
  147. 'OVERLAY', 'OWNED', 'OWNER', 'PARSER', 'PARTIAL', 'PARTITION',
  148. 'PASSING', 'PASSWORD', 'PLACING', 'PLANS', 'POSITION', 'PRECEDING',
  149. 'PRECISION', 'PREPARE', 'PREPARED', 'PRESERVE', 'PRIMARY', 'PRIOR',
  150. 'PRIVILEGES', 'PROCEDURAL', 'PROCEDURE', 'QUOTE', 'RANGE', 'READ',
  151. 'REAL', 'REASSIGN', 'RECHECK', 'RECURSIVE', 'REF', 'REFERENCES',
  152. 'REINDEX', 'RELATIVE', 'RELEASE', 'RENAME', 'REPEATABLE', 'REPLACE',
  153. 'REPLICA', 'RESET', 'RESTART', 'RESTRICT', 'RETURNING', 'RETURNS',
  154. 'REVOKE', 'RIGHT', 'ROLE', 'ROLLBACK', 'ROW', 'ROWS', 'RULE',
  155. 'SAVEPOINT', 'SCHEMA', 'SCROLL', 'SEARCH', 'SECOND', 'SECURITY',
  156. 'SELECT', 'SEQUENCE', 'SEQUENCES', 'SERIALIZABLE', 'SERVER', 'SESSION',
  157. 'SESSION_USER', 'SET', 'SETOF', 'SHARE', 'SHOW', 'SIMILAR', 'SIMPLE',
  158. 'SMALLINT', 'SOME', 'STABLE', 'STANDALONE', 'START', 'STATEMENT',
  159. 'STATISTICS', 'STDIN', 'STDOUT', 'STORAGE', 'STRICT', 'STRIP',
  160. 'SUBSTRING', 'SYMMETRIC', 'SYSID', 'SYSTEM', 'TABLE', 'TABLES',
  161. 'TABLESPACE', 'TEMP', 'TEMPLATE', 'TEMPORARY', 'TEXT', 'THEN', 'TIME',
  162. 'TIMESTAMP', 'TO', 'TRAILING', 'TRANSACTION', 'TREAT', 'TRIGGER',
  163. 'TRIM', 'TRUE', 'TRUNCATE', 'TRUSTED', 'TYPE', 'UNBOUNDED',
  164. 'UNCOMMITTED', 'UNENCRYPTED', 'UNION', 'UNIQUE', 'UNKNOWN', 'UNLISTEN',
  165. 'UNLOGGED', 'UNTIL', 'UPDATE', 'USER', 'USING', 'VACUUM', 'VALID',
  166. 'VALIDATE', 'VALIDATOR', 'VALUE', 'VALUES', 'VARCHAR', 'VARIADIC',
  167. 'VARYING', 'VERBOSE', 'VERSION', 'VIEW', 'VOLATILE', 'WHEN', 'WHERE',
  168. 'WHITESPACE', 'WINDOW', 'WITH', 'WITHOUT', 'WORK', 'WRAPPER', 'WRITE',
  169. 'XML', 'XMLATTRIBUTES', 'XMLCONCAT', 'XMLELEMENT', 'XMLEXISTS',
  170. 'XMLFOREST', 'XMLPARSE', 'XMLPI', 'XMLROOT', 'XMLSERIALIZE', 'YEAR',
  171. 'YES', 'ZONE',
  172. ]
  173. DATATYPES = [
  174. 'bigint', 'bigserial', 'bit', 'bit varying', 'bool', 'boolean', 'box',
  175. 'bytea', 'char', 'character', 'character varying', 'cidr', 'circle',
  176. 'date', 'decimal', 'double precision', 'float4', 'float8', 'inet',
  177. 'int', 'int2', 'int4', 'int8', 'integer', 'interval', 'json', 'line',
  178. 'lseg', 'macaddr', 'money', 'numeric', 'path', 'point', 'polygon',
  179. 'real', 'serial', 'serial2', 'serial4', 'serial8', 'smallint',
  180. 'smallserial', 'text', 'time', 'timestamp', 'timestamptz', 'timetz',
  181. 'tsquery', 'tsvector', 'txid_snapshot', 'uuid', 'varbit', 'varchar',
  182. 'with time zone', 'without time zone', 'xml',
  183. ]
  184. PSEUDO_TYPES = [
  185. 'any', 'anyelement', 'anyarray', 'anynonarray', 'anyenum', 'anyrange',
  186. 'cstring', 'internal', 'language_handler', 'fdw_handler', 'record',
  187. 'trigger', 'void', 'opaque',
  188. ]
  189. # Remove 'trigger' from types
  190. PSEUDO_TYPES = sorted(set(PSEUDO_TYPES) - set(map(str.lower, KEYWORDS)))
  191. PLPGSQL_KEYWORDS = [
  192. 'ALIAS', 'CONSTANT', 'DIAGNOSTICS', 'ELSIF', 'EXCEPTION', 'EXIT',
  193. 'FOREACH', 'GET', 'LOOP', 'NOTICE', 'OPEN', 'PERFORM', 'QUERY', 'RAISE',
  194. 'RETURN', 'REVERSE', 'SQLSTATE', 'WHILE',
  195. ]
  196. if __name__ == '__main__':
  197. update_myself()