Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

# Copyright 2015 Luc Saffre 

# License: BSD (see file COPYING for details) 

 

""" 

This initializes the `SITE.jinja_env` object.  Compare with 

:mod:`lino.utils.config` which also walks through the `config` 

directories. TODO: do only one common loop for both. 

""" 

 

from os.path import join, dirname, isdir 

import cgi 

import datetime 

import jinja2 

SUBDIR_NAME = 'config' 

 

from django.conf import settings 

 

from django.utils.translation import ugettext 

from django.utils.translation import pgettext 

from lino.utils import iif 

from lino.utils import format_date 

from lino.utils.xmlgen import html as xghtml 

from lino.utils.xmlgen.html import E 

from lino.utils.jinja import Counter 

from lino.utils import SumCollector 

from lino.core.auth import AnonymousUser 

 

from lino.core.renderer import HtmlRenderer 

 

from lino.api import rt 

 

 

class JinjaRenderer(HtmlRenderer): 

    def __init__(self, *args, **kwargs): 

        super(JinjaRenderer, self).__init__(*args, **kwargs) 

 

        loaders = [] 

        prefix_loaders = {} 

 

        paths = list(settings.SITE.get_settings_subdirs(SUBDIR_NAME)) 

        if settings.SITE.is_local_project_dir: 

            p = join(settings.SITE.project_dir, SUBDIR_NAME) 

            if isdir(p): 

                paths.append(p) 

        #~ logger.info("20130717 web.py paths %s",paths) 

        if len(paths) > 0: 

            loaders.append(jinja2.FileSystemLoader(paths)) 

 

        def func(name, m): 

            #~ logger.info("20130717 jinja loader %s %s",name,SUBDIR_NAME) 

            if isdir(join(dirname(m.__file__), SUBDIR_NAME)): 

                loader = jinja2.PackageLoader(name, SUBDIR_NAME) 

                loaders.append(loader) 

                prefix_loaders[name] = loader 

        settings.SITE.for_each_app(func) 

 

        loaders.insert(0, jinja2.PrefixLoader(prefix_loaders, delimiter=":")) 

 

        #~ loaders = reversed(loaders) 

        #~ print 20130109, loaders 

        self.jinja_env = jinja2.Environment( 

            #~ extensions=['jinja2.ext.i18n'], 

            loader=jinja2.ChoiceLoader(loaders)) 

        #~ jinja_env = jinja2.Environment(trim_blocks=False) 

 

        #~ from django.utils import translation 

 

        #~ jinja_env.install_gettext_translations(translation) 

 

        def as_table(action_spec): 

            a = settings.SITE.modules.resolve(action_spec) 

            ar = a.request(user=AnonymousUser.instance()) 

            return self.as_table(ar) 

 

        def as_table2(ar): 

            # 20150810 

            # ar.renderer = settings.SITE.plugins.bootstrap3.renderer 

            ar.renderer = self 

 

            t = xghtml.Table() 

            ar.dump2html(t, ar.sliced_data_iterator) 

 

            #~ print ar.get_total_count() 

            return E.tostring(t.as_element()) 

            #~ return E.tostring(E.ul(*[E.li(ar.summary_row(obj)) for obj in ar]),method="html") 

 

        def as_ul(action_spec): 

            a = settings.SITE.modules.resolve(action_spec) 

            ar = a.request(user=AnonymousUser.instance()) 

            # 20150810 

            ar.renderer = self 

            # ar.renderer = settings.SITE.plugins.bootstrap3.renderer 

            return E.tostring(E.ul(*[obj.as_list_item(ar) for obj in ar])) 

 

        # from lino.core.requests import BaseRequest 

 

        self.jinja_env.globals.update( 

            settings=settings, 

            site=settings.SITE, 

            dtos=format_date.fds,  # obsolete 

            dtosl=format_date.fdl,  # obsolete 

            as_ul=as_ul, 

            as_table=as_table2, 

            iif=iif, 

            str=str, 

            len=len, 

            E=E, 

            ar=None, 

            # _=_, 

            now=datetime.datetime.now(), 

            mtos=settings.SITE.decfmt,  # obsolete 

            decfmt=settings.SITE.decfmt, 

            fds=format_date.fds, 

            fdm=format_date.fdm, 

            fdl=format_date.fdl, 

            fdf=format_date.fdf, 

            fdmy=format_date.fdmy, 

            babelattr=settings.SITE.babelattr, 

            babelitem=settings.SITE.babelitem,  # obsolete 

            tr=settings.SITE.babelitem, 

            # dd=dd, 

            rt=rt, 

            escape=cgi.escape, 

            Counter=Counter, 

            SumCollector=SumCollector, 

            # lino=self.modules,  # experimental 

            # site_config=self.site_config, 

 

        ) 

 

        def translate(s): 

            return ugettext(s.decode('utf8')) 

        self.jinja_env.globals.update(_=translate) 

 

        def ptranslate(ctx, s): 

            return pgettext(ctx.decode('utf8'), s.decode('utf8')) 

        self.jinja_env.globals.update(pgettext=pgettext) 

 

        #~ print __file__, 20121231, self.jinja_env.list_templates('.html') 

 

    def show_table(self, *args, **kwargs): 

        e = super(JinjaRenderer, self).show_table(*args, **kwargs) 

        return E.tostring(e)