aboutsummaryrefslogtreecommitdiffstats
path: root/build/plugins/_xsyn_includes.py
diff options
context:
space:
mode:
authoralexv-smirnov <alex@ydb.tech>2023-03-15 19:59:12 +0300
committeralexv-smirnov <alex@ydb.tech>2023-03-15 19:59:12 +0300
commit056bb284ccf8dd6793ec3a54ffa36c4fb2b9ad11 (patch)
tree4740980126f32e3af7937ba0ca5f83e59baa4ab0 /build/plugins/_xsyn_includes.py
parent269126dcced1cc8b53eb4398b4a33e5142f10290 (diff)
downloadydb-056bb284ccf8dd6793ec3a54ffa36c4fb2b9ad11.tar.gz
add library/cpp/actors, ymake build to ydb oss export
Diffstat (limited to 'build/plugins/_xsyn_includes.py')
-rw-r--r--build/plugins/_xsyn_includes.py60
1 files changed, 60 insertions, 0 deletions
diff --git a/build/plugins/_xsyn_includes.py b/build/plugins/_xsyn_includes.py
new file mode 100644
index 0000000000..8d33cea2f0
--- /dev/null
+++ b/build/plugins/_xsyn_includes.py
@@ -0,0 +1,60 @@
+def get_include_callback():
+ """
+ .. function: get_include_callback returns function that processes each DOM element to get xsyn include from it, and it's aware of directory with all the xsyns.
+
+ :param xsyn_dir directory with xsyns.
+ """
+ def get_include(element):
+ """
+ .. function: get_include returns list of includes from this DOM element.
+
+ :param element DOM element.
+ """
+ res = []
+ if element.nodeType == element.ELEMENT_NODE and element.nodeName == "parse:include":
+ attrs = element.attributes
+ for i in xrange(attrs.length):
+ attr = attrs.item(i)
+ if attr.nodeName == "path":
+ include_filename = attr.nodeValue
+ res.append(include_filename)
+ return res
+
+ return get_include
+
+
+def traverse_xsyn(element, on_element):
+ """
+ .. function: traverse_xsyn traverses element and returns concatenated lists of calling on_element of each element.
+
+ :param element element in DOM.
+ :param on_element callback on element that returns list of values.
+ """
+ res = on_element(element)
+ for child in element.childNodes:
+ child_results = traverse_xsyn(child, on_element)
+ res += child_results
+ return res
+
+
+def process_xsyn(filepath, on_element):
+ """
+ .. function: process_xsyn processes xsyn file and return concatenated list of calling on_element on each DOM element.
+
+ :param filepath path to xsyn file
+ :param on_element callback called on each element in xsyn that returns list of values.
+
+ """
+
+ # keep a stack of filepathes if on_element calls process_xsyn recursively
+ with open(filepath) as xsyn_file:
+ from xml.dom.minidom import parse
+ tree = parse(xsyn_file)
+ tree.normalize()
+ res = traverse_xsyn(tree, on_element)
+ return res
+
+
+def get_all_includes(filepath):
+ callback = get_include_callback()
+ return process_xsyn(filepath, callback)