order in XML instead of sorting them by name. Attributes, text nodes and
comments are represented as text files; attributes are shown in a file named
"attributes", attributes are listed in the file as name=value lines (I
-deliberately ignore a small chance there is a newline character in values).
-Text nodes and comments are collected in a file named "text". The filesystem is
+deliberately ignore a small chance of newline characters in values); names and
+values are reencoded to the console encoding. Text nodes and comments are
+collected in a file named "text", stripped and reencoded. The filesystem is
read-only.
The VFS was inspired by a FUSE xmlfs: https://github.com/halhen/xmlfs
"""
-__version__ = "0.2.0"
+__version__ = "0.3.0"
__author__ = "Oleg Broytman <phd@phdru.name>"
__copyright__ = "Copyright (C) 2013 PhiloSoft Design"
__license__ = "GPL"
a.value.encode(default_encoding, "replace"))
for a in attrs])
+def _collect_text(node):
+ text_accumulator = []
+ for element in node.childNodes:
+ if element.localName:
+ continue
+ elif element.nodeType == element.COMMENT_NODE:
+ text = u"<!--%s-->" % element.nodeValue
+ elif element.nodeType == element.TEXT_NODE:
+ text = element.nodeValue.strip()
+ else:
+ xml_error("Unknown node type %d" % element.nodeType)
+ if text: text_accumulator.append(text)
+ return '\n'.join(text_accumulator).encode(default_encoding, "replace")
+
def _list(node, path=''):
childNodes = node.childNodes
n = 0
print "-r--r--r-- 1 user group %d Jan 1 00:00 %s/attributes" % (
len(attr_text), subpath_encoded)
_list(element, subpath)
+ if path:
+ text = _collect_text(node)
+ if text:
+ print "-r--r--r-- 1 user group %d Jan 1 00:00 %s/text" % (
+ len(text), path.encode(default_encoding, "replace"))
def mcxml_list():
"""List the entire VFS"""
if ' ' in path_comp:
i = int(path_comp.split(' ', 1)[0])
node = _get_child_node(node, i)
- elif path_comp == 'attributes':
+ elif path_comp in ('attributes', 'text'):
break
else:
xml_error('Unknown file')
else:
xml_error('There are no attributes')
+ if path_comp == 'text':
+ text = _collect_text(node)
+
outfile = open(real_filename, 'w')
outfile.write(text)
outfile.close()