view src/tools/common/ansi.py @ 2169:f472179305a1

tools(templates): workflow improvments: - template theme can be specified in parenthesis: (some_theme)path/to/template.html. Withtout parenthesis, "default" is used - static content are supposed to be in [theme]/static, error pages in [theme]/error/[err_code].html - default page are used in some case (2 for now): if error page with specified code doesn't exists, a base page is used, and if a page doesn't exist for a theme, the same one for default theme is looked for - CSS files are automatically found for HTML pages - CSS files can be split, the'll be added in the template according to the page requested. - theme CSS file is looked for, and if not found the default theme equivalent is looked for. - each element of a path can be associated to a CSS file, and styles.css is always there. For instance if blog/articles.html is requested, the following CSS can be included: "styles.css", "blog.css", "blog_article.css". They all must be in /static - if the automatic finding of CSS files is not wanted, css_files arguments can be used instead, with full relative path (i.e. including theme) - CSS files can be merged and included inline with css_inline argument - root_path can be specified, it will be used as a prefix for static files - requested theme (which may differ from actual theme, e.g. if the template is not found and default one is used instead) is available in template with "theme" variable - added getThemeAndRoot method to retrieve theme and theme root path from template
author Goffi <goffi@goffi.org>
date Sun, 05 Mar 2017 23:41:10 +0100
parents 4b78b4c7f805
children d3e48c9a255e
line wrap: on
line source

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

# SàT: a XMPP client
# Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org)

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import sys

class ANSI(object):

    ## ANSI escape sequences ##
    RESET = '\033[0m'
    NORMAL_WEIGHT = '\033[22m'
    FG_BLACK, FG_RED, FG_GREEN, FG_YELLOW, FG_BLUE, FG_MAGENTA, FG_CYAN, FG_WHITE = ('\033[3%dm' % nb for nb in xrange(8))
    BOLD = '\033[1m'
    BLINK = '\033[5m'
    BLINK_OFF = '\033[25m'

    @classmethod
    def color(cls, *args):
        """output text using ANSI codes

        this method simply merge arguments, and add RESET if is not the last arguments
        """
        # XXX: we expect to have at least on argument
        if args[-1] != cls.RESET:
            args = list(args)
            args.append(cls.RESET)
        return u''.join(args)


try:
    tty = sys.stdout.isatty()
except (AttributeError, TypeError):  # FIXME: TypeError is here for Pyjamas, need to be removed
    tty = False
if not tty:
    # we don't want ANSI escape codes if we are not outputing to a tty!
    for attr in dir(ANSI):
        if isinstance(getattr(ANSI, attr), basestring):
            setattr(ANSI, attr, u'')
del tty