File: PackageResource.py

package info (click to toggle)
plastex 3.1-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,132 kB
  • sloc: python: 23,341; xml: 18,076; javascript: 7,755; ansic: 46; makefile: 40; sh: 26
file content (94 lines) | stat: -rw-r--r-- 3,237 bytes parent folder | download | duplicates (2)
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
import re, shutil
from pathlib import Path
from typing import Union, List, Any, Optional

from plasTeX.Logging import getLogger
from plasTeX.Renderers.PageTemplate import Renderer
from plasTeX.TeX import TeXDocument

log = getLogger()

class PackageResource:
    outdir = ''
    copy = False
    key = ''

    def __init__(self, renderers: Optional[Union[List[str], str]] = None,
                 path: Optional[Path] = None, data: Any = None, **kwargs):
        if isinstance(renderers, list):
            self.rendererPatterns = renderers
        elif renderers is None:
            self.rendererPatterns = ['html5']
        else:
            self.rendererPatterns = [renderers]
        self.path = path
        self.data = data

    def alter(self, renderer: Renderer, rendererName: str, document: TeXDocument,
              target: Path) -> None:
        for pattern in self.rendererPatterns:
            if re.match(pattern, rendererName):
                self.alterRenderer(renderer)
                self.alterDocument(document=document, rendererName=rendererName)
                self.copyFile(target)
                return

    def alterRenderer(self, renderer: Renderer) -> None:
        pass

    def alterDocument(self, document: TeXDocument, rendererName: str) -> None:
        rendererdata = document.rendererdata[rendererName]
        if self.key:
            if isinstance(self.data, list):
                data = self.data
            else:
                data = [self.data]
            rendererdata.setdefault(self.key, []).extend(data)

    def copyFile(self, target: Optional[Path] =None) -> None:
        if self.copy and target:
            (target/self.outdir).mkdir(parents=True, exist_ok=True)
            try:
                shutil.copy(str(self.path), str(target/self.outdir))
            except IOError:
                log.error('Package resource cannot be copied :' + str(self.path))


class PackageCss(PackageResource):
    outdir = 'styles'
    key = 'css'
    copy = True

    def __init__(self, renderers: Optional[Union[List[str], str]] = None,
            path: Optional[Path] = None, data: Any = None, copy_only: bool = False):
        super().__init__(renderers, path, data)
        if path is None:
            raise ValueError('PackageCss path was not provided')
        self.data = path.name
        if copy_only:
            self.key = ''

class PackageJs(PackageResource):
    outdir = 'js'
    key = 'js'
    copy = True

    def __init__(self, renderers: Optional[Union[List[str], str]] = None,
                 path: Optional[Path] = None, data: Any = None, copy_only: bool = False):
        super().__init__(renderers, path, data)
        if path is None:
            raise ValueError('PackageJs path was not provided')
        self.data = path.name
        if copy_only:
            self.key = ''

class PackageTemplateDir(PackageResource):
    """A directory of templates to load, specified using the path argument."""
    def alterRenderer(self, renderer: Renderer) -> None:
        renderer.importDirectory(str(self.path))

class PackagePreCleanupCB(PackageResource):
    key = 'preCleanupCallbacks'

class PackageProcessFilecontents(PackageResource):
    key = 'processFileContents'