예제 #1
0
    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')
예제 #2
0
    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
예제 #3
0
    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')
예제 #4
0
파일: utils.py 프로젝트: tintou/hotdoc
    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
예제 #5
0
    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')
예제 #6
0
파일: utils.py 프로젝트: dougnazar/hotdoc
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
예제 #7
0
 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)
예제 #8
0
    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
예제 #9
0
 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)
예제 #10
0
 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)
예제 #11
0
    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)
예제 #12
0
    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)
예제 #13
0
 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
예제 #14
0
파일: utils.py 프로젝트: dougnazar/hotdoc
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
예제 #15
0
    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')
예제 #16
0
    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')
예제 #17
0
    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')
예제 #18
0
    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
예제 #19
0
    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
예제 #20
0
파일: database.py 프로젝트: tense-du/hotdoc
    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