/scripts/process_function_template.py

https://github.com/ricardogsilva/Quantum-GIS
Python | 139 lines | 107 code | 30 blank | 2 comment | 39 complexity | a08b05120a23ae24d6c8d7afb09bb5e0 MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. import sys
  3. import os
  4. import json
  5. import glob
  6. from copy import deepcopy
  7. sys.path.append(
  8. os.path.join(
  9. os.path.dirname(os.path.realpath(__file__)),
  10. '../python/ext-libs'))
  11. cpp = open(sys.argv[1], "w", encoding="utf-8")
  12. cpp.write(
  13. "#include \"qgsexpression.h\"\n"
  14. "#include \"qgsexpression_p.h\"\n"
  15. "#include <mutex>\n"
  16. "\n"
  17. "void QgsExpression::initFunctionHelp()\n"
  18. "{\n"
  19. " static std::once_flag initialized;\n"
  20. " std::call_once( initialized, []\n"
  21. " {"
  22. )
  23. def quote(v):
  24. if isinstance(v, dict):
  25. for k in v:
  26. v[k] = quote(v[k])
  27. return v
  28. elif isinstance(v, list):
  29. return map(quote, v)
  30. elif isinstance(v, str):
  31. return v.replace('"', '\\"').replace('\n', '\\n')
  32. elif isinstance(v, bool):
  33. return v
  34. else:
  35. raise BaseException("unexpected type " + repr(v))
  36. for f in sorted(glob.glob('resources/function_help/json/*')):
  37. with open(f, encoding="utf-8") as function_file:
  38. try:
  39. json_params = json.load(function_file)
  40. except:
  41. print(f)
  42. raise
  43. json_params = quote(json_params)
  44. for field in ['name', 'type']:
  45. if field not in json_params:
  46. raise BaseException("%s: %s missing" % (f, field))
  47. if not json_params['type'] in ['function', 'operator', 'value', 'expression', 'group']:
  48. raise BaseException("%s: invalid type %s " % (f, json_params['type']))
  49. if 'variants' not in json_params:
  50. # convert single variant shortcut to a expanded variant
  51. v = {}
  52. for i in json_params:
  53. v[i] = json_params[i]
  54. v['variant'] = json_params['name']
  55. v['variant_description'] = json_params['description']
  56. json_params['variants'] = [v]
  57. name = "\"{0}\"".format(json_params['name'])
  58. if json_params['type'] == 'operator':
  59. for v in json_params['variants']:
  60. if 'arguments' not in v:
  61. raise BaseException("%s: arguments expected for operator" % f)
  62. a_list = list(deepcopy(v['arguments']))
  63. if not 1 <= len(a_list) <= 2:
  64. raise BaseException("%s: 1 or 2 arguments expected for operator found %i" % (f, len(a_list)))
  65. cpp.write("\n\n functionHelpTexts().insert( QStringLiteral( {0} ),\n Help( QStringLiteral( {0} ), tr( \"{1}\" ), tr( \"{2}\" ),\n QList<HelpVariant>()".format(
  66. name, json_params['type'], json_params['description'])
  67. )
  68. for v in json_params['variants']:
  69. cpp.write(
  70. "\n << HelpVariant( tr( \"{0}\" ), tr( \"{1}\" ),\n QList<HelpArg>()".format(v['variant'], v['variant_description']))
  71. if 'arguments' in v:
  72. for a in v['arguments']:
  73. cpp.write("\n << HelpArg( QStringLiteral( \"{0}\" ), tr( \"{1}\" ), {2}, {3}, {4}, {5} )".format(
  74. a['arg'],
  75. a.get('description', ''),
  76. "true" if a.get('descOnly', False) else "false",
  77. "true" if a.get('syntaxOnly', False) else "false",
  78. "true" if a.get('optional', False) else "false",
  79. 'QStringLiteral( "{}" )'.format(a.get('default', '')) if a.get('default', '') else "QString()"
  80. )
  81. )
  82. cpp.write(",\n /* variableLenArguments */ {0}".format(
  83. "true" if v.get('variableLenArguments', False) else "false"))
  84. cpp.write(",\n QList<HelpExample>()")
  85. if 'examples' in v:
  86. for e in v['examples']:
  87. cpp.write("\n << HelpExample( tr( \"{0}\" ), tr( \"{1}\" ), tr( \"{2}\" ) )".format(
  88. e['expression'],
  89. e['returns'],
  90. e.get('note', ''))
  91. )
  92. if 'notes' in v:
  93. cpp.write(",\n tr( \"{0}\" )".format(v['notes']))
  94. else:
  95. cpp.write(",\n QString()")
  96. if 'tags' in v:
  97. cpp.write(",\n QStringList()")
  98. for t in v['tags']:
  99. cpp.write("\n << QStringLiteral( \"{0}\" ) << tr( \"{0}\" )".format(t))
  100. cpp.write("\n )")
  101. cpp.write("\n )")
  102. cpp.write("\n );")
  103. for f in sorted(glob.glob('resources/function_help/text/*')):
  104. n = os.path.basename(f)
  105. with open(f) as content:
  106. cpp.write("\n\n functionHelpTexts().insert( \"{0}\",\n Help( tr( \"{0}\" ), tr( \"group\" ), tr( \"{1}\" ), QList<HelpVariant>() ) );\n".format(
  107. n, content.read().replace("\\", "&#92;").replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n')))
  108. cpp.write("\n } );\n}\n")
  109. cpp.close()