def format_page(self, page, link_resolver, output): """ Called by `doc_repo.DocRepo.format_page`, to leave full control to extensions over the formatting of the pages they are responsible of. Args: page: doc_tree.Page, the page to format. link_resolver: links.LinkResolver, object responsible for resolving links potentially mentioned in `page` output: str, path to the output directory. """ formatter = self.get_formatter('html') if page.is_stale: debug('Formatting page %s' % page.link.ref, 'formatting') if output: actual_output = os.path.join(output, formatter.get_output_folder()) if not os.path.exists(actual_output): os.makedirs(actual_output) else: actual_output = None page.format(formatter, link_resolver, output, actual_output) else: debug('Not formatting page %s, up to date' % page.link.ref, 'formatting')
def get_or_create_symbol(self, type_, **kwargs): """ Banana banana """ unique_name = kwargs.get('unique_name') if not unique_name: unique_name = kwargs.get('display_name') kwargs['unique_name'] = unique_name filename = kwargs.get('filename') if filename: kwargs['filename'] = os.path.abspath(filename) if self.__incremental: symbol = self.__session.query(type_).filter( type_.unique_name == unique_name).first() else: symbol = None if not symbol: symbol = type_() self.__session.add(symbol) debug('Created symbol with unique name %s' % unique_name, 'symbols') for key, value in kwargs.items(): setattr(symbol, key, value) if self.__incremental: self.symbol_updated_signal(self, symbol) self.__symbols[unique_name] = symbol return symbol
def format_page(self, page, link_resolver, output): """ Called by `project.Project.format_page`, to leave full control to extensions over the formatting of the pages they are responsible of. Args: page: tree.Page, the page to format. link_resolver: links.LinkResolver, object responsible for resolving links potentially mentioned in `page` output: str, path to the output directory. """ if page.is_stale: debug('Formatting page %s' % page.link.ref, 'formatting') if output: actual_output = os.path.join(output, 'html') if not os.path.exists(actual_output): os.makedirs(actual_output) else: actual_output = None page.format(self.formatter, link_resolver, actual_output) else: debug('Not formatting page %s, up to date' % page.link.ref, 'formatting')
def parse_comments(self, filenames): for filename in filenames: with open(filename, 'rb') as f: debug('Getting comments in %s' % filename) lines = [] header = filename.endswith('.h') skip_next_symbol = header # FIXME Use the lexer for that! for l in f.readlines(): l = unicode_dammit(l) lines.append(l) if skip_next_symbol and l.startswith("#pragma once"): skip_next_symbol = False cs = extract_comments(''.join(lines)) for c in cs: if c[3]: line = lines[c[1] - 1] comment = (len(line) - len(line.lstrip(' '))) * ' ' + c[0] block = self.__raw_comment_parser.parse_comment( comment, filename, c[1], c[2], self.project.include_paths) if block is not None: self.extension.add_comment(block) elif not skip_next_symbol: if header: self.__raw_macros.append(RawMacro(c, filename)) # self.__create_macro_from_raw_text(c, filename, filter_names) else: skip_next_symbol = False
def __resolve_symbol(self, symbol, link_resolver, page_path): symbol.resolve_links(link_resolver) symbol.link.ref = "%s#%s" % (page_path, symbol.unique_name) for link in symbol.get_extra_links(): link.ref = "%s#%s" % (page_path, link.id_) tsl = self.typed_symbols.get(type(symbol)) if tsl: tsl.symbols.append(symbol) by_parent_symbols = self.by_parent_symbols.get(symbol.parent_name) if not by_parent_symbols: by_parent_symbols = self.__get_empty_typed_symbols() parent_name = symbol.parent_name if parent_name is None: parent_name = 'Others symbols' self.by_parent_symbols[symbol.parent_name] = by_parent_symbols by_parent_symbols.get(type(symbol)).symbols.append(symbol) self.symbols.append(symbol) debug('Resolved symbol %s to page %s' % (symbol.unique_name, self.link.ref), 'resolution')
def __get_extra_extension_classes(paths): """ Banana banana """ extra_classes = [] wset = pkg_resources.WorkingSet([]) distributions, _ = wset.find_plugins(pkg_resources.Environment(paths)) for dist in distributions: sys.path.append(dist.location) wset.add(dist) for entry_point in wset.iter_entry_points(group='hotdoc.extensions', name='get_extension_classes'): try: activation_function = entry_point.load() classes = activation_function() # pylint: disable=broad-except except Exception as exc: info("Failed to load %s %s" % (entry_point.module_name, exc)) debug(traceback.format_exc()) continue for klass in classes: extra_classes.append(klass) return extra_classes
def __format_symbols(self, formatter, link_resolver): for symbol in self.symbols: if symbol is None: continue debug('Formatting symbol %s in page %s' % ( symbol.unique_name, self.source_file), 'formatting') symbol.skip = not formatter.format_symbol(symbol, link_resolver)
def get_or_create_symbol(self, type_, **kwargs): """ Banana banana """ unique_name = kwargs.get('unique_name') if not unique_name: unique_name = kwargs.get('display_name') kwargs['unique_name'] = unique_name filename = kwargs.get('filename') if filename: kwargs['filename'] = os.path.abspath(filename) if self.__incremental: symbol = self.__session.query(type_).filter( type_.unique_name == unique_name).first() else: symbol = None if not symbol: symbol = type_() self.__session.add(symbol) debug('Created symbol with unique name %s' % unique_name, 'symbols') for key, value in kwargs.items(): setattr(symbol, key, value) if self.__incremental: self.symbol_updated_signal(self, symbol) self.__symbols[unique_name] = symbol return symbol
def __format_symbols(self, formatter, link_resolver): for symbol in self.symbols: if symbol is None: continue debug( 'Formatting symbol %s in page %s' % (symbol.unique_name, self.source_file), 'formatting') symbol.skip = not formatter.format_symbol(symbol, link_resolver)
def __format_symbols(self, formatter, link_resolver): for symbol in self.symbols: if symbol is None: continue debug('Formatting symbol %s in page %s' % ( symbol.unique_name, self.name), 'formatting') symbol.detailed_description = formatter.format_symbol( symbol, link_resolver)
def debug(self, message, domain=None): """ Shortcut function for `utils.loggable.debug` Args: message: see `utils.loggable.debug` domain: see `utils.loggable.debug` """ if domain is None: domain = self.extension_name debug(message, domain)
def debug(self, message, domain=None): """ Shortcut function for `utils.loggable.debug` Args: message: see `utils.loggable.debug` domain: see `utils.loggable.debug` """ if domain is None: domain = self.extension_name debug(message, domain)
def rename_symbol(self, unique_name, target): sym = self.__symbols.get(target) if sym: for alias in self.__aliased[unique_name]: alias.target = unique_name if sym.unique_name == sym.display_name: sym.display_name = unique_name sym.unique_name = unique_name del self.__symbols[target] self.__symbols[unique_name] = sym debug('Renamed symbol with unique name %s to %s' % (target, unique_name)) return sym
def get_extension_classes(sort, extra_extension_paths=None): """ Banana banana """ all_classes = {} deps_map = {} for entry_point in pkg_resources.iter_entry_points( group='hotdoc.extensions', name='get_extension_classes'): if entry_point.module_name == 'hotdoc_c_extension.extensions': continue try: activation_function = entry_point.load() classes = activation_function() # pylint: disable=broad-except except Exception as exc: info("Failed to load %s" % entry_point.module_name, exc) debug(traceback.format_exc()) continue for klass in classes: all_classes[klass.extension_name] = klass if extra_extension_paths: for klass in __get_extra_extension_classes(extra_extension_paths): all_classes[klass.extension_name] = klass klass_list = list(all_classes.values()) if not sort: return klass_list for i, klass in enumerate(klass_list): deps = klass.get_dependencies() topodeps = set() for dep in deps: if dep.dependency_name not in all_classes: if dep.optional: continue else: error( "setup-issue", "Missing dependency %s for %s" % (dep.dependency_name, klass.extension_name)) if dep.is_upstream: topodeps.add(klass_list.index( all_classes[dep.dependency_name])) deps_map[i] = topodeps sorted_class_indices = toposort_flatten(deps_map) sorted_classes = [klass_list[i] for i in sorted_class_indices] return sorted_classes
def __resolve_symbol(self, symbol, link_resolver): symbol.resolve_links(link_resolver) symbol.link.ref = "%s#%s" % (self.link.ref, symbol.unique_name) for link in symbol.get_extra_links(): link.ref = "%s#%s" % (self.link.ref, link.id_) tsl = self.typed_symbols[type(symbol)] tsl.symbols.append(symbol) self.symbols.append(symbol) debug('Resolved symbol %s to page %s' % (symbol.display_name, self.link.ref), 'resolution')
def __resolve_symbol(self, symbol, link_resolver): symbol.resolve_links(link_resolver) symbol.link.ref = "%s#%s" % (self.link.ref, symbol.unique_name) for link in symbol.get_extra_links(): link.ref = "%s#%s" % (self.link.ref, link.id_) tsl = self.typed_symbols[type(symbol)] tsl.symbols.append(symbol) self.symbols.append(symbol) debug( 'Resolved symbol %s to page %s' % (symbol.display_name, self.link.ref), 'resolution')
def parse_toplevel_config(self, config): """Parse @config to setup @self state.""" html_theme = config.get('html_theme', 'default') if html_theme == 'default': default_theme = os.path.join(HERE, os.pardir, 'hotdoc_bootstrap_theme', 'dist') html_theme = os.path.abspath(default_theme) debug("Using default theme") else: html_theme = config.get_path('html_theme') debug("Using theme located at %s" % html_theme) Formatter.theme_path = html_theme Formatter.extra_theme_path = config.get_path('html_extra_theme')
def create_symbol(self, type_, **kwargs): """ Banana banana """ unique_name = kwargs.get('unique_name') if not unique_name: unique_name = kwargs.get('display_name') kwargs['unique_name'] = unique_name filename = kwargs.get('filename') if filename: filename = os.path.abspath(filename) kwargs['filename'] = os.path.abspath(filename) if unique_name in self.__symbols and not type_ == ProxySymbol: warn('symbol-redefined', "%s(unique_name=%s, filename=%s, project=%s)" " has already been defined: %s" % (type_.__name__, unique_name, filename, kwargs.get('project_name'), self.get_symbol(unique_name))) return None aliases = kwargs.pop('aliases', []) alias_symbols = [] for alias in aliases: alias_symbols.append( self.create_symbol(ProxySymbol, unique_name=alias, target=unique_name)) symbol = type_() debug('Created symbol with unique name %s' % unique_name, 'symbols') for key, value in list(kwargs.items()): setattr(symbol, key, value) symbol.aliases += alias_symbols if not isinstance(symbol, ProxySymbol): self.__symbols[unique_name] = symbol self.__aliased[unique_name].extend(aliases) for alias in self.__aliased[unique_name]: self.__aliases[alias] = symbol return symbol
def parse_toplevel_config(self, config): """Parse @config to setup @self state.""" if not Formatter.initialized: html_theme = config.get('html_theme', 'default') if html_theme != 'default': uri = urllib.parse.urlparse(html_theme) if not uri.scheme: html_theme = config.get_path('html_theme') debug("Using theme located at %s" % html_theme) elif uri.scheme.startswith('http'): html_theme = self.__download_theme(uri) if html_theme == 'default': default_theme = os.path.join(HERE, os.pardir, 'hotdoc_bootstrap_theme', 'dist') html_theme = os.path.abspath(default_theme) debug("Using default theme") theme_meta_path = os.path.join(html_theme, 'theme.json') if os.path.exists(theme_meta_path): with open(theme_meta_path, 'r') as _: Formatter.theme_meta = json.loads(_.read()) searchpath = [] self.__load_theme_templates(searchpath, HERE) Formatter.theme_path = html_theme if html_theme: self.__load_theme_templates(searchpath, html_theme) Formatter.extra_theme_path = config.get_path('html_extra_theme') if Formatter.extra_theme_path: self.__load_theme_templates(searchpath, Formatter.extra_theme_path) Formatter.engine = Engine( loader=FileLoader(searchpath, encoding='UTF-8'), extensions=[CoreExtension(), CodeExtension()]) Formatter.engine.global_vars.update({'e': html.escape}) Formatter.initialized = True
def get_or_create_symbol(self, type_, **kwargs): """ Banana banana """ unique_name = kwargs.get('unique_name') if not unique_name: unique_name = kwargs.get('display_name') kwargs['unique_name'] = unique_name filename = kwargs.get('filename') if filename: kwargs['filename'] = os.path.abspath(filename) aliases = kwargs.pop('aliases', []) for alias in aliases: self.get_or_create_symbol(ProxySymbol, unique_name=alias, target=unique_name) if self.__incremental: symbol = self.get_symbol(unique_name) else: symbol = None if not symbol: symbol = type_() self.__session.add(symbol) debug('Created symbol with unique name %s' % unique_name, 'symbols') for key, value in list(kwargs.items()): setattr(symbol, key, value) self.__symbols[unique_name] = symbol for alias in aliases: self.__symbols[alias] = symbol self.__aliases[unique_name] = aliases return symbol