tdrpa.tdworker 1.1.9.3__py38-none-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tdrpa/_tdxlwings/__init__.py +193 -0
- tdrpa/_tdxlwings/__pycache__/__init__.cpython-311.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/__init__.cpython-38.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/_win32patch.cpython-311.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/_win32patch.cpython-38.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/_xlwindows.cpython-311.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/_xlwindows.cpython-38.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/apps.cpython-311.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/apps.cpython-38.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/base_classes.cpython-311.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/base_classes.cpython-38.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/com_server.cpython-311.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/com_server.cpython-38.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/constants.cpython-311.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/constants.cpython-38.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/expansion.cpython-311.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/expansion.cpython-38.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/main.cpython-311.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/main.cpython-38.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/udfs.cpython-311.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/udfs.cpython-38.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/utils.cpython-311.pyc +0 -0
- tdrpa/_tdxlwings/__pycache__/utils.cpython-38.pyc +0 -0
- tdrpa/_tdxlwings/_win32patch.py +90 -0
- tdrpa/_tdxlwings/_xlmac.py +2240 -0
- tdrpa/_tdxlwings/_xlwindows.py +2518 -0
- tdrpa/_tdxlwings/addin/Dictionary.cls +474 -0
- tdrpa/_tdxlwings/addin/IWebAuthenticator.cls +71 -0
- tdrpa/_tdxlwings/addin/WebClient.cls +772 -0
- tdrpa/_tdxlwings/addin/WebHelpers.bas +3203 -0
- tdrpa/_tdxlwings/addin/WebRequest.cls +875 -0
- tdrpa/_tdxlwings/addin/WebResponse.cls +453 -0
- tdrpa/_tdxlwings/addin/xlwings.xlam +0 -0
- tdrpa/_tdxlwings/apps.py +35 -0
- tdrpa/_tdxlwings/base_classes.py +1092 -0
- tdrpa/_tdxlwings/cli.py +1306 -0
- tdrpa/_tdxlwings/com_server.py +385 -0
- tdrpa/_tdxlwings/constants.py +3080 -0
- tdrpa/_tdxlwings/conversion/__init__.py +103 -0
- tdrpa/_tdxlwings/conversion/framework.py +147 -0
- tdrpa/_tdxlwings/conversion/numpy_conv.py +34 -0
- tdrpa/_tdxlwings/conversion/pandas_conv.py +184 -0
- tdrpa/_tdxlwings/conversion/standard.py +321 -0
- tdrpa/_tdxlwings/expansion.py +83 -0
- tdrpa/_tdxlwings/ext/__init__.py +3 -0
- tdrpa/_tdxlwings/ext/sql.py +73 -0
- tdrpa/_tdxlwings/html/xlwings-alert.html +71 -0
- tdrpa/_tdxlwings/js/xlwings.js +577 -0
- tdrpa/_tdxlwings/js/xlwings.ts +729 -0
- tdrpa/_tdxlwings/mac_dict.py +6399 -0
- tdrpa/_tdxlwings/main.py +5205 -0
- tdrpa/_tdxlwings/mistune/__init__.py +63 -0
- tdrpa/_tdxlwings/mistune/block_parser.py +366 -0
- tdrpa/_tdxlwings/mistune/inline_parser.py +216 -0
- tdrpa/_tdxlwings/mistune/markdown.py +84 -0
- tdrpa/_tdxlwings/mistune/renderers.py +220 -0
- tdrpa/_tdxlwings/mistune/scanner.py +121 -0
- tdrpa/_tdxlwings/mistune/util.py +41 -0
- tdrpa/_tdxlwings/pro/__init__.py +40 -0
- tdrpa/_tdxlwings/pro/_xlcalamine.py +536 -0
- tdrpa/_tdxlwings/pro/_xlofficejs.py +146 -0
- tdrpa/_tdxlwings/pro/_xlremote.py +1293 -0
- tdrpa/_tdxlwings/pro/custom_functions_code.js +150 -0
- tdrpa/_tdxlwings/pro/embedded_code.py +60 -0
- tdrpa/_tdxlwings/pro/udfs_officejs.py +549 -0
- tdrpa/_tdxlwings/pro/utils.py +199 -0
- tdrpa/_tdxlwings/quickstart.xlsm +0 -0
- tdrpa/_tdxlwings/quickstart_addin.xlam +0 -0
- tdrpa/_tdxlwings/quickstart_addin_ribbon.xlam +0 -0
- tdrpa/_tdxlwings/quickstart_fastapi/main.py +47 -0
- tdrpa/_tdxlwings/quickstart_fastapi/requirements.txt +3 -0
- tdrpa/_tdxlwings/quickstart_standalone.xlsm +0 -0
- tdrpa/_tdxlwings/reports.py +12 -0
- tdrpa/_tdxlwings/rest/__init__.py +1 -0
- tdrpa/_tdxlwings/rest/api.py +368 -0
- tdrpa/_tdxlwings/rest/serializers.py +103 -0
- tdrpa/_tdxlwings/server.py +14 -0
- tdrpa/_tdxlwings/udfs.py +775 -0
- tdrpa/_tdxlwings/utils.py +777 -0
- tdrpa/_tdxlwings/xlwings-0.31.6.applescript +30 -0
- tdrpa/_tdxlwings/xlwings.bas +2061 -0
- tdrpa/_tdxlwings/xlwings_custom_addin.bas +2042 -0
- tdrpa/_tdxlwings/xlwingslib.cp38-win_amd64.pyd +0 -0
- tdrpa/tdworker/__init__.pyi +8 -0
- tdrpa/tdworker/_excel.pyi +703 -0
- tdrpa/tdworker/_img.pyi +173 -0
- tdrpa/tdworker/_os.pyi +46 -0
- tdrpa/tdworker/_w.pyi +129 -0
- tdrpa/tdworker/_web.pyi +248 -0
- tdrpa/tdworker/_winE.pyi +246 -0
- tdrpa/tdworker/_winK.pyi +74 -0
- tdrpa/tdworker/_winM.pyi +117 -0
- tdrpa/tdworker.cp38-win_amd64.pyd +0 -0
- tdrpa.tdworker-1.1.9.3.dist-info/METADATA +25 -0
- tdrpa.tdworker-1.1.9.3.dist-info/RECORD +97 -0
- tdrpa.tdworker-1.1.9.3.dist-info/WHEEL +5 -0
- tdrpa.tdworker-1.1.9.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,84 @@
|
|
1
|
+
from .block_parser import BlockParser, expand_leading_tab, cleanup_lines
|
2
|
+
from .inline_parser import InlineParser
|
3
|
+
|
4
|
+
|
5
|
+
class Markdown(object):
|
6
|
+
def __init__(self, renderer, block=None, inline=None, plugins=None):
|
7
|
+
if block is None:
|
8
|
+
block = BlockParser()
|
9
|
+
|
10
|
+
if inline is None:
|
11
|
+
inline = InlineParser(renderer)
|
12
|
+
|
13
|
+
self.block = block
|
14
|
+
self.inline = inline
|
15
|
+
self.renderer = inline.renderer
|
16
|
+
self.before_parse_hooks = []
|
17
|
+
self.before_render_hooks = []
|
18
|
+
self.after_render_hooks = []
|
19
|
+
|
20
|
+
if plugins:
|
21
|
+
for plugin in plugins:
|
22
|
+
plugin(self)
|
23
|
+
|
24
|
+
def use(self, plugin):
|
25
|
+
plugin(self)
|
26
|
+
|
27
|
+
def before_parse(self, s, state):
|
28
|
+
s, state = preprocess(s, state)
|
29
|
+
for hook in self.before_parse_hooks:
|
30
|
+
s, state = hook(self, s, state)
|
31
|
+
return s, state
|
32
|
+
|
33
|
+
def before_render(self, tokens, state):
|
34
|
+
for hook in self.before_render_hooks:
|
35
|
+
tokens = hook(self, tokens, state)
|
36
|
+
return tokens
|
37
|
+
|
38
|
+
def after_render(self, result, state):
|
39
|
+
for hook in self.after_render_hooks:
|
40
|
+
result = hook(self, result, state)
|
41
|
+
return result
|
42
|
+
|
43
|
+
def parse(self, s, state=None):
|
44
|
+
if state is None:
|
45
|
+
state = {}
|
46
|
+
|
47
|
+
s, state = self.before_parse(s, state)
|
48
|
+
tokens = self.block.parse(s, state)
|
49
|
+
tokens = self.before_render(tokens, state)
|
50
|
+
result = self.block.render(tokens, self.inline, state)
|
51
|
+
result = self.after_render(result, state)
|
52
|
+
return result
|
53
|
+
|
54
|
+
def read(self, filepath, state=None):
|
55
|
+
if state is None:
|
56
|
+
state = {}
|
57
|
+
|
58
|
+
state['__file__'] = filepath
|
59
|
+
with open(filepath, 'rb') as f:
|
60
|
+
s = f.read()
|
61
|
+
|
62
|
+
return self.parse(s.decode('utf-8'), state)
|
63
|
+
|
64
|
+
def __call__(self, s):
|
65
|
+
return self.parse(s)
|
66
|
+
|
67
|
+
|
68
|
+
def preprocess(s, state):
|
69
|
+
state.update({
|
70
|
+
'def_links': {},
|
71
|
+
'def_footnotes': {},
|
72
|
+
'footnotes': [],
|
73
|
+
})
|
74
|
+
|
75
|
+
if s is None:
|
76
|
+
s = '\n'
|
77
|
+
else:
|
78
|
+
s = s.replace('\u2424', '\n')
|
79
|
+
s = cleanup_lines(s)
|
80
|
+
s = expand_leading_tab(s)
|
81
|
+
if not s.endswith('\n'):
|
82
|
+
s += '\n'
|
83
|
+
|
84
|
+
return s, state
|
@@ -0,0 +1,220 @@
|
|
1
|
+
from .util import escape, escape_html
|
2
|
+
|
3
|
+
|
4
|
+
class BaseRenderer(object):
|
5
|
+
NAME = 'base'
|
6
|
+
|
7
|
+
def __init__(self):
|
8
|
+
self._methods = {}
|
9
|
+
|
10
|
+
def register(self, name, method):
|
11
|
+
self._methods[name] = method
|
12
|
+
|
13
|
+
def _get_method(self, name):
|
14
|
+
try:
|
15
|
+
return object.__getattribute__(self, name)
|
16
|
+
except AttributeError:
|
17
|
+
method = self._methods.get(name)
|
18
|
+
if not method:
|
19
|
+
raise AttributeError('No renderer "{!r}"'.format(name))
|
20
|
+
return method
|
21
|
+
|
22
|
+
def finalize(self, data):
|
23
|
+
raise NotImplementedError(
|
24
|
+
'The renderer needs to implement the finalize method.')
|
25
|
+
|
26
|
+
|
27
|
+
class AstRenderer(BaseRenderer):
|
28
|
+
NAME = 'ast'
|
29
|
+
|
30
|
+
def text(self, text):
|
31
|
+
return {'type': 'text', 'text': text}
|
32
|
+
|
33
|
+
def link(self, link, children=None, title=None):
|
34
|
+
if isinstance(children, str):
|
35
|
+
children = [{'type': 'text', 'text': children}]
|
36
|
+
return {
|
37
|
+
'type': 'link',
|
38
|
+
'link': link,
|
39
|
+
'children': children,
|
40
|
+
'title': title,
|
41
|
+
}
|
42
|
+
|
43
|
+
def image(self, src, alt="", title=None):
|
44
|
+
return {'type': 'image', 'src': src, 'alt': alt, 'title': title}
|
45
|
+
|
46
|
+
def codespan(self, text):
|
47
|
+
return {'type': 'codespan', 'text': text}
|
48
|
+
|
49
|
+
def linebreak(self):
|
50
|
+
return {'type': 'linebreak'}
|
51
|
+
|
52
|
+
def inline_html(self, html):
|
53
|
+
return {'type': 'inline_html', 'text': html}
|
54
|
+
|
55
|
+
def heading(self, children, level):
|
56
|
+
return {'type': 'heading', 'children': children, 'level': level}
|
57
|
+
|
58
|
+
def newline(self):
|
59
|
+
return {'type': 'newline'}
|
60
|
+
|
61
|
+
def thematic_break(self):
|
62
|
+
return {'type': 'thematic_break'}
|
63
|
+
|
64
|
+
def block_code(self, children, info=None):
|
65
|
+
return {
|
66
|
+
'type': 'block_code',
|
67
|
+
'text': children,
|
68
|
+
'info': info
|
69
|
+
}
|
70
|
+
|
71
|
+
def block_html(self, children):
|
72
|
+
return {'type': 'block_html', 'text': children}
|
73
|
+
|
74
|
+
def list(self, children, ordered, level, start=None):
|
75
|
+
token = {
|
76
|
+
'type': 'list',
|
77
|
+
'children': children,
|
78
|
+
'ordered': ordered,
|
79
|
+
'level': level,
|
80
|
+
}
|
81
|
+
if start is not None:
|
82
|
+
token['start'] = start
|
83
|
+
return token
|
84
|
+
|
85
|
+
def list_item(self, children, level):
|
86
|
+
return {'type': 'list_item', 'children': children, 'level': level}
|
87
|
+
|
88
|
+
def _create_default_method(self, name):
|
89
|
+
def __ast(children):
|
90
|
+
return {'type': name, 'children': children}
|
91
|
+
return __ast
|
92
|
+
|
93
|
+
def _get_method(self, name):
|
94
|
+
try:
|
95
|
+
return super(AstRenderer, self)._get_method(name)
|
96
|
+
except AttributeError:
|
97
|
+
return self._create_default_method(name)
|
98
|
+
|
99
|
+
def finalize(self, data):
|
100
|
+
return list(data)
|
101
|
+
|
102
|
+
|
103
|
+
class HTMLRenderer(BaseRenderer):
|
104
|
+
NAME = 'html'
|
105
|
+
HARMFUL_PROTOCOLS = {
|
106
|
+
'javascript:',
|
107
|
+
'vbscript:',
|
108
|
+
'data:',
|
109
|
+
}
|
110
|
+
|
111
|
+
def __init__(self, escape=True, allow_harmful_protocols=None):
|
112
|
+
super(HTMLRenderer, self).__init__()
|
113
|
+
self._escape = escape
|
114
|
+
self._allow_harmful_protocols = allow_harmful_protocols
|
115
|
+
|
116
|
+
def _safe_url(self, url):
|
117
|
+
if self._allow_harmful_protocols is None:
|
118
|
+
schemes = self.HARMFUL_PROTOCOLS
|
119
|
+
elif self._allow_harmful_protocols is True:
|
120
|
+
schemes = None
|
121
|
+
else:
|
122
|
+
allowed = set(self._allow_harmful_protocols)
|
123
|
+
schemes = self.HARMFUL_PROTOCOLS - allowed
|
124
|
+
|
125
|
+
if schemes:
|
126
|
+
for s in schemes:
|
127
|
+
if url.lower().startswith(s):
|
128
|
+
url = '#harmful-link'
|
129
|
+
break
|
130
|
+
return url
|
131
|
+
|
132
|
+
def text(self, text):
|
133
|
+
if self._escape:
|
134
|
+
return escape(text)
|
135
|
+
return escape_html(text)
|
136
|
+
|
137
|
+
def link(self, link, text=None, title=None):
|
138
|
+
if text is None:
|
139
|
+
text = link
|
140
|
+
|
141
|
+
s = '<a href="' + self._safe_url(link) + '"'
|
142
|
+
if title:
|
143
|
+
s += ' title="' + escape_html(title) + '"'
|
144
|
+
return s + '>' + (text or link) + '</a>'
|
145
|
+
|
146
|
+
def image(self, src, alt="", title=None):
|
147
|
+
src = self._safe_url(src)
|
148
|
+
alt = escape_html(alt)
|
149
|
+
s = '<img src="' + src + '" alt="' + alt + '"'
|
150
|
+
if title:
|
151
|
+
s += ' title="' + escape_html(title) + '"'
|
152
|
+
return s + ' />'
|
153
|
+
|
154
|
+
def emphasis(self, text):
|
155
|
+
return '<em>' + text + '</em>'
|
156
|
+
|
157
|
+
def strong(self, text):
|
158
|
+
return '<strong>' + text + '</strong>'
|
159
|
+
|
160
|
+
def codespan(self, text):
|
161
|
+
return '<code>' + escape(text) + '</code>'
|
162
|
+
|
163
|
+
def linebreak(self):
|
164
|
+
return '<br />\n'
|
165
|
+
|
166
|
+
def inline_html(self, html):
|
167
|
+
if self._escape:
|
168
|
+
return escape(html)
|
169
|
+
return html
|
170
|
+
|
171
|
+
def paragraph(self, text):
|
172
|
+
return '<p>' + text + '</p>\n'
|
173
|
+
|
174
|
+
def heading(self, text, level):
|
175
|
+
tag = 'h' + str(level)
|
176
|
+
return '<' + tag + '>' + text + '</' + tag + '>\n'
|
177
|
+
|
178
|
+
def newline(self):
|
179
|
+
return ''
|
180
|
+
|
181
|
+
def thematic_break(self):
|
182
|
+
return '<hr />\n'
|
183
|
+
|
184
|
+
def block_text(self, text):
|
185
|
+
return text
|
186
|
+
|
187
|
+
def block_code(self, code, info=None):
|
188
|
+
html = '<pre><code'
|
189
|
+
if info is not None:
|
190
|
+
info = info.strip()
|
191
|
+
if info:
|
192
|
+
lang = info.split(None, 1)[0]
|
193
|
+
lang = escape_html(lang)
|
194
|
+
html += ' class="language-' + lang + '"'
|
195
|
+
return html + '>' + escape(code) + '</code></pre>\n'
|
196
|
+
|
197
|
+
def block_quote(self, text):
|
198
|
+
return '<blockquote>\n' + text + '</blockquote>\n'
|
199
|
+
|
200
|
+
def block_html(self, html):
|
201
|
+
if not self._escape:
|
202
|
+
return html + '\n'
|
203
|
+
return '<p>' + escape(html) + '</p>\n'
|
204
|
+
|
205
|
+
def block_error(self, html):
|
206
|
+
return '<div class="error">' + html + '</div>\n'
|
207
|
+
|
208
|
+
def list(self, text, ordered, level, start=None):
|
209
|
+
if ordered:
|
210
|
+
html = '<ol'
|
211
|
+
if start is not None:
|
212
|
+
html += ' start="' + str(start) + '"'
|
213
|
+
return html + '>\n' + text + '</ol>\n'
|
214
|
+
return '<ul>\n' + text + '</ul>\n'
|
215
|
+
|
216
|
+
def list_item(self, text, level):
|
217
|
+
return '<li>' + text + '</li>\n'
|
218
|
+
|
219
|
+
def finalize(self, data):
|
220
|
+
return ''.join(data)
|
@@ -0,0 +1,121 @@
|
|
1
|
+
import re
|
2
|
+
|
3
|
+
class Scanner(re.Scanner):
|
4
|
+
def iter(self, string, state, parse_text):
|
5
|
+
sc = self.scanner.scanner(string)
|
6
|
+
|
7
|
+
pos = 0
|
8
|
+
for match in iter(sc.search, None):
|
9
|
+
name, method = self.lexicon[match.lastindex - 1][1]
|
10
|
+
hole = string[pos:match.start()]
|
11
|
+
if hole:
|
12
|
+
yield parse_text(hole, state)
|
13
|
+
|
14
|
+
yield method(match, state)
|
15
|
+
pos = match.end()
|
16
|
+
|
17
|
+
hole = string[pos:]
|
18
|
+
if hole:
|
19
|
+
yield parse_text(hole, state)
|
20
|
+
|
21
|
+
|
22
|
+
class ScannerParser(object):
|
23
|
+
scanner_cls = Scanner
|
24
|
+
RULE_NAMES = tuple()
|
25
|
+
|
26
|
+
def __init__(self):
|
27
|
+
self.rules = list(self.RULE_NAMES)
|
28
|
+
self.rule_methods = {}
|
29
|
+
self._cached_sc = {}
|
30
|
+
|
31
|
+
def register_rule(self, name, pattern, method):
|
32
|
+
self.rule_methods[name] = (pattern, lambda m, state: method(self, m, state))
|
33
|
+
|
34
|
+
def get_rule_pattern(self, name):
|
35
|
+
if name not in self.RULE_NAMES:
|
36
|
+
return self.rule_methods[name][0]
|
37
|
+
return getattr(self, name.upper())
|
38
|
+
|
39
|
+
def get_rule_method(self, name):
|
40
|
+
if name not in self.RULE_NAMES:
|
41
|
+
return self.rule_methods[name][1]
|
42
|
+
return getattr(self, 'parse_' + name)
|
43
|
+
|
44
|
+
def parse_text(self, text, state):
|
45
|
+
raise NotImplementedError
|
46
|
+
|
47
|
+
def _scan(self, s, state, rules):
|
48
|
+
sc = self._create_scanner(rules)
|
49
|
+
for tok in sc.iter(s, state, self.parse_text):
|
50
|
+
if isinstance(tok, list):
|
51
|
+
for t in tok:
|
52
|
+
yield t
|
53
|
+
elif tok:
|
54
|
+
yield tok
|
55
|
+
|
56
|
+
def _create_scanner(self, rules):
|
57
|
+
sc_key = '|'.join(rules)
|
58
|
+
sc = self._cached_sc.get(sc_key)
|
59
|
+
if sc:
|
60
|
+
return sc
|
61
|
+
|
62
|
+
lexicon = [
|
63
|
+
(self.get_rule_pattern(n), (n, self.get_rule_method(n)))
|
64
|
+
for n in rules
|
65
|
+
]
|
66
|
+
sc = self.scanner_cls(lexicon)
|
67
|
+
self._cached_sc[sc_key] = sc
|
68
|
+
return sc
|
69
|
+
|
70
|
+
|
71
|
+
class Matcher(object):
|
72
|
+
PARAGRAPH_END = re.compile(
|
73
|
+
r'(?:\n{2,})|'
|
74
|
+
r'(?:\n {0,3}#{1,6})|' # axt heading
|
75
|
+
r'(?:\n {0,3}(?:`{3,}|~{3,}))|' # fenced code
|
76
|
+
r'(?:\n {0,3}>)|' # blockquote
|
77
|
+
r'(?:\n {0,3}(?:[\*\+-]|1[.)]))|' # list
|
78
|
+
r'(?:\n {0,3}<)' # block html
|
79
|
+
)
|
80
|
+
|
81
|
+
def __init__(self, lexicon):
|
82
|
+
self.lexicon = lexicon
|
83
|
+
|
84
|
+
def search_pos(self, string, pos):
|
85
|
+
m = self.PARAGRAPH_END.search(string, pos)
|
86
|
+
if not m:
|
87
|
+
return None
|
88
|
+
if set(m.group(0)) == {'\n'}:
|
89
|
+
return m.end()
|
90
|
+
return m.start() + 1
|
91
|
+
|
92
|
+
def iter(self, string, state, parse_text):
|
93
|
+
pos = 0
|
94
|
+
endpos = len(string)
|
95
|
+
last_end = 0
|
96
|
+
while 1:
|
97
|
+
if pos >= endpos:
|
98
|
+
break
|
99
|
+
for rule, (name, method) in self.lexicon:
|
100
|
+
match = rule.match(string, pos)
|
101
|
+
if match is not None:
|
102
|
+
start, end = match.span()
|
103
|
+
if start > last_end:
|
104
|
+
yield parse_text(string[last_end:start], state)
|
105
|
+
|
106
|
+
if name.endswith('_start'):
|
107
|
+
token = method(match, state, string)
|
108
|
+
yield token[0]
|
109
|
+
end = token[1]
|
110
|
+
else:
|
111
|
+
yield method(match, state)
|
112
|
+
last_end = pos = end
|
113
|
+
break
|
114
|
+
else:
|
115
|
+
found = self.search_pos(string, pos)
|
116
|
+
if found is None:
|
117
|
+
break
|
118
|
+
pos = found
|
119
|
+
|
120
|
+
if last_end < endpos:
|
121
|
+
yield parse_text(string[last_end:], state)
|
@@ -0,0 +1,41 @@
|
|
1
|
+
try:
|
2
|
+
from urllib.parse import quote
|
3
|
+
import html
|
4
|
+
except ImportError:
|
5
|
+
from urllib import quote
|
6
|
+
html = None
|
7
|
+
|
8
|
+
|
9
|
+
PUNCTUATION = r'''\\!"#$%&'()*+,./:;<=>?@\[\]^`{}|_~-'''
|
10
|
+
ESCAPE_TEXT = r'\\[' + PUNCTUATION + ']'
|
11
|
+
|
12
|
+
|
13
|
+
def escape(s, quote=True):
|
14
|
+
s = s.replace("&", "&")
|
15
|
+
s = s.replace("<", "<")
|
16
|
+
s = s.replace(">", ">")
|
17
|
+
if quote:
|
18
|
+
s = s.replace('"', """)
|
19
|
+
return s
|
20
|
+
|
21
|
+
|
22
|
+
def escape_url(link):
|
23
|
+
safe = (
|
24
|
+
':/?#@' # gen-delims - '[]' (rfc3986)
|
25
|
+
'!$&()*+,;=' # sub-delims - "'" (rfc3986)
|
26
|
+
'%' # leave already-encoded octets alone
|
27
|
+
)
|
28
|
+
|
29
|
+
if html is None:
|
30
|
+
return quote(link.encode('utf-8'), safe=safe)
|
31
|
+
return html.escape(quote(html.unescape(link), safe=safe))
|
32
|
+
|
33
|
+
|
34
|
+
def escape_html(s):
|
35
|
+
if html is not None:
|
36
|
+
return html.escape(html.unescape(s)).replace(''', "'")
|
37
|
+
return escape(s)
|
38
|
+
|
39
|
+
|
40
|
+
def unikey(s):
|
41
|
+
return ' '.join(s.split()).lower()
|
@@ -0,0 +1,40 @@
|
|
1
|
+
"""
|
2
|
+
Required Notice: Copyright (C) Zoomer Analytics GmbH.
|
3
|
+
|
4
|
+
xlwings PRO is dual-licensed under one of the following licenses:
|
5
|
+
|
6
|
+
* PolyForm Noncommercial License 1.0.0 (for noncommercial use):
|
7
|
+
https://polyformproject.org/licenses/noncommercial/1.0.0
|
8
|
+
* xlwings PRO License (for commercial use):
|
9
|
+
https://github.com/xlwings/xlwings/blob/main/LICENSE_PRO.txt
|
10
|
+
|
11
|
+
Commercial licenses can be purchased at https://www.xlwings.org
|
12
|
+
"""
|
13
|
+
|
14
|
+
from .embedded_code import dump_embedded_code, runpython_embedded_code
|
15
|
+
from .reports import Markdown, MarkdownStyle
|
16
|
+
from .udfs_officejs import (
|
17
|
+
custom_functions_call,
|
18
|
+
custom_functions_code,
|
19
|
+
custom_functions_meta,
|
20
|
+
xlarg as arg,
|
21
|
+
xlfunc as func,
|
22
|
+
xlret as ret,
|
23
|
+
)
|
24
|
+
from .utils import LicenseHandler
|
25
|
+
|
26
|
+
__all__ = (
|
27
|
+
"dump_embedded_code",
|
28
|
+
"runpython_embedded_code",
|
29
|
+
"verify_execute_permission",
|
30
|
+
"Markdown",
|
31
|
+
"MarkdownStyle",
|
32
|
+
"arg",
|
33
|
+
"func",
|
34
|
+
"ret",
|
35
|
+
"custom_functions_code",
|
36
|
+
"custom_functions_meta",
|
37
|
+
"custom_functions_call",
|
38
|
+
)
|
39
|
+
|
40
|
+
LicenseHandler.validate_license("pro")
|