summaryrefslogtreecommitdiffstats
path: root/doxygen/siphon/process.py
diff options
context:
space:
mode:
Diffstat (limited to 'doxygen/siphon/process.py')
-rw-r--r--doxygen/siphon/process.py318
1 files changed, 0 insertions, 318 deletions
diff --git a/doxygen/siphon/process.py b/doxygen/siphon/process.py
deleted file mode 100644
index ce70be5b399..00000000000
--- a/doxygen/siphon/process.py
+++ /dev/null
@@ -1,318 +0,0 @@
-# Copyright (c) 2016 Comcast Cable Communications Management, LLC.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at:
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Generation template class
-
-import html.parser
-import json
-import logging
-import os
-import sys
-
-import jinja2
-
-# Classes register themselves in this dictionary
-"""Mapping of known processors to their classes"""
-siphons = {}
-
-"""Mapping of known output formats to their classes"""
-formats = {}
-
-
-class Siphon(object):
- """Generate rendered output for siphoned data."""
-
- # Set by subclasses
- """Our siphon name"""
- name = None
-
- # Set by subclasses
- """Name of an identifier used by this siphon"""
- identifier = None
-
- # Set by subclasses
- """The pyparsing object to use to parse with"""
- _parser = None
-
- """The input data"""
- _cmds = None
-
- """Group key to (directory,file) mapping"""
- _group = None
-
- """Logging handler"""
- log = None
-
- """Directory to look for siphon rendering templates"""
- template_directory = None
-
- """Template environment, if we're using templates"""
- _tplenv = None
-
- def __init__(self, template_directory, format):
- super(Siphon, self).__init__()
- self.log = logging.getLogger("siphon.process.%s" % self.name)
-
- # Get our output format details
- fmt_klass = formats[format]
- fmt = fmt_klass()
- self._format = fmt
-
- # Sort out the template search path
- def _tpldir(name):
- return os.sep.join((template_directory, fmt.name, name))
-
- self.template_directory = template_directory
- searchpath = [
- _tpldir(self.name),
- _tpldir("default"),
- ]
- loader = jinja2.FileSystemLoader(searchpath=searchpath)
- self._tplenv = jinja2.Environment(
- loader=loader,
- trim_blocks=True,
- autoescape=True,
- keep_trailing_newline=True)
-
- # Convenience, get a reference to the internal escape and
- # unescape methods in html.parser. These then become
- # available to templates to use, if needed.
- self._h = html.parser.HTMLParser()
- self.escape = html.escape
- self.unescape = html.unescape
-
- # Output renderers
-
- """Returns an object to be used as the sorting key in the item index."""
- def index_sort_key(self, group):
- return group
-
- """Returns a string to use as the header at the top of the item index."""
- def index_header(self):
- return self.template("index_header")
-
- """Returns the string fragment to use for each section in the item
- index."""
- def index_section(self, group):
- return self.template("index_section", group=group)
-
- """Returns the string fragment to use for each entry in the item index."""
- def index_entry(self, meta, item):
- return self.template("index_entry", meta=meta, item=item)
-
- """Returns an object, typically a string, to be used as the sorting key
- for items within a section."""
- def item_sort_key(self, item):
- return item['name']
-
- """Returns a key for grouping items together."""
- def group_key(self, directory, file, macro, name):
- _global = self._cmds['_global']
-
- if file in _global and 'group_label' in _global[file]:
- self._group[file] = (directory, file)
- return file
-
- self._group[directory] = (directory, None)
- return directory
-
- """Returns a key for identifying items within a grouping."""
- def item_key(self, directory, file, macro, name):
- return name
-
- """Returns a string to use as the header when rendering the item."""
- def item_header(self, group):
- return self.template("item_header", group=group)
-
- """Returns a string to use as the body when rendering the item."""
- def item_format(self, meta, item):
- return self.template("item_format", meta=meta, item=item)
-
- """Returns a string to use as the label for the page reference."""
- def page_label(self, group):
- return "_".join((
- self.name,
- self.sanitize_label(group)
- ))
-
- """Returns a title to use for a page."""
- def page_title(self, group):
- _global = self._cmds['_global']
- (directory, file) = self._group[group]
-
- if file and file in _global and 'group_label' in _global[file]:
- return _global[file]['group_label']
-
- if directory in _global and 'group_label' in _global[directory]:
- return _global[directory]['group_label']
-
- return directory
-
- """Returns a string to use as the label for the section reference."""
- def item_label(self, group, item):
- return "__".join((
- self.name,
- item
- ))
-
- """Label sanitizer; for creating Doxygen references"""
- def sanitize_label(self, value):
- return value.replace(" ", "_") \
- .replace("/", "_") \
- .replace(".", "_")
-
- """Template processor"""
- def template(self, name, **kwargs):
- tpl = self._tplenv.get_template(name + self._format.extension)
- return tpl.render(
- this=self,
- **kwargs)
-
- # Processing methods
-
- """Parse the input file into a more usable dictionary structure."""
- def load_json(self, files):
- self._cmds = {}
- self._group = {}
-
- line_num = 0
- line_start = 0
- for filename in files:
- filename = os.path.relpath(filename)
- self.log.info("Parsing items in file \"%s\"." % filename)
- data = None
- with open(filename, "r") as fd:
- data = json.load(fd)
-
- self._cmds['_global'] = data['global']
-
- # iterate the items loaded and regroup it
- for item in data["items"]:
- try:
- o = self._parser.parse(item['block'])
- except Exception:
- self.log.error("Exception parsing item: %s\n%s"
- % (json.dumps(item, separators=(',', ': '),
- indent=4),
- item['block']))
- raise
-
- # Augment the item with metadata
- o["meta"] = {}
- for key in item:
- if key == 'block':
- continue
- o['meta'][key] = item[key]
-
- # Load some interesting fields
- directory = item['directory']
- file = item['file']
- macro = o["macro"]
- name = o["name"]
-
- # Generate keys to group items by
- group_key = self.group_key(directory, file, macro, name)
- item_key = self.item_key(directory, file, macro, name)
-
- if group_key not in self._cmds:
- self._cmds[group_key] = {}
-
- self._cmds[group_key][item_key] = o
-
- """Iterate over the input data, calling render methods to generate the
- output."""
- def process(self, out=None):
-
- if out is None:
- out = sys.stdout
-
- # Accumulated body contents
- contents = ""
-
- # Write the header for this siphon type
- out.write(self.index_header())
-
- # Sort key helper for the index
- def group_sort_key(group):
- return self.index_sort_key(group)
-
- # Iterate the dictionary and process it
- for group in sorted(self._cmds.keys(), key=group_sort_key):
- if group.startswith('_'):
- continue
-
- self.log.info("Processing items in group \"%s\" (%s)." %
- (group, group_sort_key(group)))
-
- # Generate the section index entry (write it now)
- out.write(self.index_section(group))
-
- # Generate the item header (save for later)
- contents += self.item_header(group)
-
- def item_sort_key(key):
- return self.item_sort_key(self._cmds[group][key])
-
- for key in sorted(self._cmds[group].keys(), key=item_sort_key):
- self.log.debug("--- Processing key \"%s\" (%s)." %
- (key, item_sort_key(key)))
-
- o = self._cmds[group][key]
- meta = {
- "directory": o['meta']['directory'],
- "file": o['meta']['file'],
- "macro": o['macro'],
- "name": o['name'],
- "key": key,
- "label": self.item_label(group, key),
- }
-
- # Generate the index entry for the item (write it now)
- out.write(self.index_entry(meta, o))
-
- # Generate the item itself (save for later)
- contents += self.item_format(meta, o)
-
- # Deliver the accumulated body output
- out.write(contents)
-
-
-class Format(object):
- """Output format class"""
-
- """Name of this output format"""
- name = None
-
- """Expected file extension of templates that build this format"""
- extension = None
-
-
-class FormatMarkdown(Format):
- """Markdown output format"""
- name = "markdown"
- extension = ".md"
-
-
-# Register 'markdown'
-formats["markdown"] = FormatMarkdown
-
-
-class FormatItemlist(Format):
- """Itemlist output format"""
- name = "itemlist"
- extension = ".itemlist"
-
-
-# Register 'itemlist'
-formats["itemlist"] = FormatItemlist