edwh-editorjs 2.3.2__tar.gz → 2.5.0a1__tar.gz

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.
Files changed (30) hide show
  1. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/.gitignore +1 -0
  2. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/CHANGELOG.md +10 -0
  3. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/PKG-INFO +1 -1
  4. edwh_editorjs-2.5.0a1/editorjs/__about__.py +1 -0
  5. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/editorjs/blocks.py +35 -3
  6. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/editorjs/core.py +38 -11
  7. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/tests/test_core.py +26 -0
  8. edwh_editorjs-2.3.2/.github/workflows/build_documentation.yml +0 -36
  9. edwh_editorjs-2.3.2/.github/workflows/publish_to_pypi.yml +0 -40
  10. edwh_editorjs-2.3.2/.github/workflows/pytest.yml +0 -30
  11. edwh_editorjs-2.3.2/editorjs/__about__.py +0 -1
  12. edwh_editorjs-2.3.2/htmlcov/.gitignore +0 -2
  13. edwh_editorjs-2.3.2/htmlcov/class_index.html +0 -259
  14. edwh_editorjs-2.3.2/htmlcov/favicon_32_cb_58284776.png +0 -0
  15. edwh_editorjs-2.3.2/htmlcov/function_index.html +0 -395
  16. edwh_editorjs-2.3.2/htmlcov/index.html +0 -132
  17. edwh_editorjs-2.3.2/htmlcov/keybd_closed_cb_ce680311.png +0 -0
  18. edwh_editorjs-2.3.2/htmlcov/status.json +0 -1
  19. edwh_editorjs-2.3.2/htmlcov/style_cb_8e611ae1.css +0 -337
  20. edwh_editorjs-2.3.2/htmlcov/z_a93c8aeb4b8fa1f9___init___py.html +0 -125
  21. edwh_editorjs-2.3.2/htmlcov/z_a93c8aeb4b8fa1f9_blocks_py.html +0 -406
  22. edwh_editorjs-2.3.2/htmlcov/z_a93c8aeb4b8fa1f9_exceptions_py.html +0 -116
  23. edwh_editorjs-2.3.2/htmlcov/z_a93c8aeb4b8fa1f9_parser_py.html +0 -172
  24. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/README.md +0 -0
  25. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/editorjs/__init__.py +0 -0
  26. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/editorjs/exceptions.py +0 -0
  27. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/editorjs/helpers.py +0 -0
  28. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/editorjs/types.py +0 -0
  29. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/pyproject.toml +0 -0
  30. {edwh_editorjs-2.3.2 → edwh_editorjs-2.5.0a1}/tests/__init__.py +0 -0
@@ -11,6 +11,7 @@ dist/*
11
11
  .env
12
12
  venv*
13
13
  *coverage*
14
+ htmlcov/*
14
15
  dist/
15
16
  build/
16
17
  example.*
@@ -2,6 +2,16 @@
2
2
 
3
3
  <!--next-version-placeholder-->
4
4
 
5
+ ## v2.4.0 (2024-12-02)
6
+
7
+ ### Feature
8
+
9
+ * **image:** Support more options for the image block ([`c74dcce`](https://github.com/educationwarehouse/edwh-editorjs/commit/c74dccef5c1115038f6de0f08250dfa6cff18796))
10
+
11
+ ### Fix
12
+
13
+ * Less exceptions, more warnings for better ease-of-use ([`891fca1`](https://github.com/educationwarehouse/edwh-editorjs/commit/891fca198e774c53a8b6365b927a080f61c0b2c8))
14
+
5
15
  ## v2.3.2 (2024-11-27)
6
16
 
7
17
  ### Fix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: edwh-editorjs
3
- Version: 2.3.2
3
+ Version: 2.5.0a1
4
4
  Summary: EditorJS.py
5
5
  Project-URL: Homepage, https://github.com/educationwarehouse/edwh-EditorJS
6
6
  Author-email: SKevo <skevo.cw@gmail.com>, Robin van der Noord <robin.vdn@educationwarehouse.nl>
@@ -0,0 +1 @@
1
+ __version__ = "2.5.0a1"
@@ -406,7 +406,17 @@ class ImageBlock(EditorJSBlock):
406
406
  def to_markdown(cls, data: EditorChildData) -> str:
407
407
  url = data.get("url", "") or data.get("file", {}).get("url", "")
408
408
  caption = data.get("caption", "")
409
- return f"""![{caption}]({url} "{caption}")\n\n"""
409
+
410
+ with_border = "1" if data.get("withBorder") else ""
411
+ with_background = "1" if data.get("withBackground") else ""
412
+ stretched = "1" if data.get("stretched") else ""
413
+
414
+ # always custom type so we can render as <figure> instead of markdown2's default (simple <img>)
415
+ return f"""<editorjs type="image" caption="{caption}" border="{with_border}" background="{with_background}" stretched="{stretched}" url="{url}" />\n\n"""
416
+
417
+ @classmethod
418
+ def _caption(cls, node: MDChildNode):
419
+ return node.get("alt") or node.get("caption") or ""
410
420
 
411
421
  @classmethod
412
422
  def to_json(cls, node: MDChildNode) -> list[dict]:
@@ -414,15 +424,37 @@ class ImageBlock(EditorJSBlock):
414
424
  {
415
425
  "type": "image",
416
426
  "data": {
417
- "caption": cls.to_text(node),
418
427
  "file": {"url": node.get("url")},
428
+ "caption": cls._caption(node),
429
+ "withBorder": bool(node.get("border", False)),
430
+ "stretched": bool(node.get("stretched", False)),
431
+ "withBackground": bool(node.get("background", False)),
419
432
  },
420
433
  }
421
434
  ]
422
435
 
423
436
  @classmethod
424
437
  def to_text(cls, node: MDChildNode) -> str:
425
- return node.get("alt") or node.get("caption") or ""
438
+ caption = cls._caption(node)
439
+ url = node.get("url")
440
+
441
+ background = node.get("background") or ""
442
+ stretched = node.get("stretched") or ""
443
+ border = node.get("border") or ""
444
+
445
+ return f"""
446
+ <div class="ce-block {stretched and 'ce-block--stretched'}">
447
+ <div class="ce-block__content">
448
+ <div class="cdx-block image-tool image-tool--filled {background and 'image-tool--withBackground'} {stretched and 'image-tool--stretched'} {border and 'image-tool--withBorder'}">
449
+ <div class="image-tool__image">
450
+ <figure>
451
+ <img class="image-tool__image-picture" src="{url}" title="{caption}" alt="{caption}">
452
+ <figcaption>{caption}</figcaption>
453
+ </figure>
454
+ </div>
455
+ </div>
456
+ </div>
457
+ """
426
458
 
427
459
 
428
460
  @block("blockquote", "quote")
@@ -1,11 +1,13 @@
1
1
  import json
2
2
  import typing as t
3
+ import warnings
3
4
 
4
5
  import markdown2
5
6
  import mdast
6
7
  from typing_extensions import Self
7
8
 
8
9
  from .blocks import BLOCKS
10
+ from .exceptions import TODO
9
11
  from .helpers import unix_timestamp
10
12
  from .types import MDRootNode
11
13
 
@@ -41,13 +43,26 @@ class EditorJS:
41
43
  for child in blocks:
42
44
  _type = child["type"]
43
45
  if not (block := BLOCKS.get(_type)):
44
- raise TypeError(f"from_json: Unsupported block type `{_type}`")
45
-
46
- data = child.get("data", {})
47
- # forward any 'tunes' via data:
48
- data["tunes"] = data.get("tunes") or child.get("tunes") or {}
49
-
50
- markdown_items.append(block.to_markdown(data))
46
+ warnings.warn(
47
+ f"from_json: Unsupported block type `{_type}`",
48
+ category=RuntimeWarning,
49
+ )
50
+ continue
51
+
52
+ try:
53
+ data = child.get("data", {})
54
+ # forward any 'tunes' via data:
55
+ data["tunes"] = data.get("tunes") or child.get("tunes") or {}
56
+
57
+ markdown_items.append(block.to_markdown(data))
58
+ except Exception as e:
59
+ warnings.warn(
60
+ "from_json: Oh oh, unexpected block failure!",
61
+ category=RuntimeWarning,
62
+ source=e,
63
+ )
64
+ # if isinstance(e, TODO):
65
+ # raise e
51
66
 
52
67
  markdown = "".join(markdown_items)
53
68
  return cls.from_markdown(markdown)
@@ -76,9 +91,22 @@ class EditorJS:
76
91
  for child in self._mdast["children"]:
77
92
  _type = child["type"]
78
93
  if not (block := BLOCKS.get(_type)):
79
- raise TypeError(f"to_json: Unsupported block type `{_type}`")
80
-
81
- blocks.extend(block.to_json(child))
94
+ warnings.warn(
95
+ f"to_json: Unsupported block type `{_type}`",
96
+ category=RuntimeWarning,
97
+ )
98
+ continue
99
+
100
+ try:
101
+ blocks.extend(block.to_json(child))
102
+ except Exception as e:
103
+ warnings.warn(
104
+ "to_json: Oh oh, unexpected block failure!",
105
+ category=RuntimeWarning,
106
+ source=e,
107
+ )
108
+ # if isinstance(e, TODO):
109
+ # raise e
82
110
 
83
111
  data = {"time": unix_timestamp(), "blocks": blocks, "version": EDITORJS_VERSION}
84
112
 
@@ -107,7 +135,6 @@ class EditorJS:
107
135
  Export HTML string
108
136
  """
109
137
  md = self.to_markdown()
110
- # todo: deal with custom elements like linktool, attaches
111
138
  return self._md.convert(md)
112
139
 
113
140
  def __repr__(self):
@@ -246,3 +246,29 @@ def test_embed():
246
246
  print(e.to_markdown())
247
247
  print(e.to_html())
248
248
  print(e.to_json())
249
+
250
+
251
+ def test_image_options():
252
+ json_blocks = r"""{"time":1733155142016,"blocks":[{"id":"e7_WBThzLQ","type":"image","data":{"caption":"border","withBorder":true,"withBackground":false,"stretched":false,"file":{"url":"https://py4web.leiden.dockers.local/img/upload/5.jpg?hash=b39755c8a568cbf45d329e3a3128fb43065b1d1b","name":"kat.jpg","title":"kat","extension":"jpg","size":3682051}}},{"id":"B5qVcjqBuB","type":"image","data":{"caption":"stretch","withBorder":false,"withBackground":false,"stretched":true,"file":{"url":"https://py4web.leiden.dockers.local/img/upload/6.jpg?hash=b39755c8a568cbf45d329e3a3128fb43065b1d1b","name":"kat.jpg","title":"kat","extension":"jpg","size":3682051}}},{"id":"ft32yP2_cv","type":"image","data":{"caption":"background","withBorder":false,"withBackground":true,"stretched":false,"file":{"url":"https://py4web.leiden.dockers.local/img/upload/7.jpg?hash=b39755c8a568cbf45d329e3a3128fb43065b1d1b","name":"kat.jpg","title":"kat","extension":"jpg","size":3682051}}}],"version":"2.30.7"}"""
253
+
254
+ e = EditorJS.from_json(json_blocks)
255
+
256
+ print(e.to_markdown())
257
+ print(e.to_html())
258
+ print(e.to_json())
259
+
260
+
261
+ def test_figcaption():
262
+ # md = """![Party Time!](https://py4web.leiden.dockers.local/img/upload/23.png?hash=979795a433fc15cb94eccb3159f1f1e4054b1664 "Party Time!")"""
263
+ # e = EditorJS.from_markdown(md)
264
+
265
+ js = """{"time":1742471258492,"blocks":[{"id":"ZoA3rbc05C","type":"image","data":{"caption":"Party Time!","withBorder":false,"withBackground":false,"stretched":false,"file":{"url":"https://py4web.leiden.dockers.local/img/upload/23.png?hash=979795a433fc15cb94eccb3159f1f1e4054b1664"}}}],"version":"2.30.7"}"""
266
+ e = EditorJS.from_json(js)
267
+
268
+ html = e.to_html()
269
+
270
+ assert "figcaption" in html
271
+
272
+ print(
273
+ html
274
+ )
@@ -1,36 +0,0 @@
1
- name: Build documentation
2
-
3
- on:
4
- workflow_dispatch:
5
- release:
6
- types: [published]
7
-
8
- jobs:
9
- build:
10
- runs-on: ubuntu-latest
11
- strategy:
12
- matrix:
13
- python-version: ['3.10']
14
-
15
- steps:
16
- - uses: actions/checkout@v2
17
-
18
- - name: Set up Python ${{ matrix.python-version }}
19
- uses: actions/setup-python@v2
20
- with:
21
- python-version: ${{ matrix.python-version }}
22
-
23
- - name: Install dependencies
24
- run: |
25
- python -m pip install --upgrade pip
26
- pip install pdoc
27
- if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
28
- - name: Build docs
29
- run: |
30
- chmod +x ./scripts/build_documentation.sh
31
- bash ./scripts/build_documentation.sh
32
- - name: Deploy
33
- uses: JamesIves/github-pages-deploy-action@4.1.4
34
- with:
35
- branch: documentation
36
- folder: ./documentation
@@ -1,40 +0,0 @@
1
- name: Upload Python Package to PyPI
2
-
3
- on:
4
- release:
5
- types: [published]
6
-
7
- jobs:
8
- deploy:
9
- runs-on: ubuntu-latest
10
- strategy:
11
- matrix:
12
- python-version: ['3.10']
13
-
14
- steps:
15
- - uses: actions/checkout@v2
16
-
17
- - name: Set up Python ${{ matrix.python-version }}
18
- uses: actions/setup-python@v2
19
- with:
20
- python-version: ${{ matrix.python-version }}
21
-
22
- - name: Install dependencies
23
- run: |
24
- python -m pip install --upgrade pip
25
- python -m pip install pytest
26
- if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
27
-
28
- - name: Test with pyTest
29
- run: |
30
- python -m pytest -v
31
-
32
- - name: Build package
33
- run: |
34
- bash ./scripts/compile_for_pypi.sh
35
-
36
- - name: Publish package
37
- uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29
38
- with:
39
- user: __token__
40
- password: ${{ secrets.PYPI_API_TOKEN }}
@@ -1,30 +0,0 @@
1
- name: Test with pyTest
2
-
3
- on: [workflow_dispatch, push, pull_request]
4
-
5
- jobs:
6
- deploy:
7
- runs-on: ubuntu-latest
8
- strategy:
9
- matrix:
10
- python-version: ['3.10']
11
- fail-fast: false
12
-
13
- steps:
14
- - uses: actions/checkout@v2
15
-
16
- - name: Set up Python
17
- uses: actions/setup-python@v2
18
- with:
19
- python-version: ${{ matrix.python-version }}
20
- cache: 'pip'
21
-
22
- - name: Install dependencies
23
- run: |
24
- python -m pip install --upgrade pip
25
- python -m pip install pytest
26
- if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
27
-
28
- - name: Test with pyTest
29
- run: |
30
- python -m pytest -v
@@ -1 +0,0 @@
1
- __version__ = "2.3.2"
@@ -1,2 +0,0 @@
1
- # Created by coverage.py
2
- *
@@ -1,259 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
- <title>Coverage report</title>
6
- <link rel="icon" sizes="32x32" href="favicon_32_cb_58284776.png">
7
- <link rel="stylesheet" href="style_cb_8e611ae1.css" type="text/css">
8
- <script src="coverage_html_cb_6fb7b396.js" defer></script>
9
- </head>
10
- <body class="indexfile">
11
- <header>
12
- <div class="content">
13
- <h1>Coverage report:
14
- <span class="pc_cov">76%</span>
15
- </h1>
16
- <aside id="help_panel_wrapper">
17
- <input id="help_panel_state" type="checkbox">
18
- <label for="help_panel_state">
19
- <img id="keyboard_icon" src="keybd_closed_cb_ce680311.png" alt="Show/hide keyboard shortcuts">
20
- </label>
21
- <div id="help_panel">
22
- <p class="legend">Shortcuts on this page</p>
23
- <div class="keyhelp">
24
- <p>
25
- <kbd>f</kbd>
26
- <kbd>n</kbd>
27
- <kbd>s</kbd>
28
- <kbd>m</kbd>
29
- <kbd>x</kbd>
30
- <kbd>c</kbd>
31
- &nbsp; change column sorting
32
- </p>
33
- <p>
34
- <kbd>[</kbd>
35
- <kbd>]</kbd>
36
- &nbsp; prev/next file
37
- </p>
38
- <p>
39
- <kbd>?</kbd> &nbsp; show/hide this help
40
- </p>
41
- </div>
42
- </div>
43
- </aside>
44
- <form id="filter_container">
45
- <input id="filter" type="text" value="" placeholder="filter...">
46
- <div>
47
- <input id="hide100" type="checkbox" >
48
- <label for="hide100">hide covered</label>
49
- </div>
50
- </form>
51
- <h2>
52
- <a class="button" href="index.html">Files</a>
53
- <a class="button" href="function_index.html">Functions</a>
54
- <a class="button current">Classes</a>
55
- </h2>
56
- <p class="text">
57
- <a class="nav" href="https://coverage.readthedocs.io/en/7.6.4">coverage.py v7.6.4</a>,
58
- created at 2024-10-31 13:29 +0100
59
- </p>
60
- </div>
61
- </header>
62
- <main id="index">
63
- <table class="index" data-sortable>
64
- <thead>
65
- <tr class="tablehead" title="Click to sort">
66
- <th id="file" class="name left" aria-sort="none" data-shortcut="f">File<span class="arrows"></span></th>
67
- <th id="region" class="name left" aria-sort="none" data-default-sort-order="ascending" data-shortcut="n">class<span class="arrows"></span></th>
68
- <th id="statements" aria-sort="none" data-default-sort-order="descending" data-shortcut="s">statements<span class="arrows"></span></th>
69
- <th id="missing" aria-sort="none" data-default-sort-order="descending" data-shortcut="m">missing<span class="arrows"></span></th>
70
- <th id="excluded" aria-sort="none" data-default-sort-order="descending" data-shortcut="x">excluded<span class="arrows"></span></th>
71
- <th id="coverage" class="right" aria-sort="none" data-shortcut="c">coverage<span class="arrows"></span></th>
72
- </tr>
73
- </thead>
74
- <tbody>
75
- <tr class="region">
76
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9___init___py.html">pyeditorjs/__init__.py</a></td>
77
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
78
- <td>14</td>
79
- <td>3</td>
80
- <td>0</td>
81
- <td class="right" data-ratio="11 14">79%</td>
82
- </tr>
83
- <tr class="region">
84
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t42">pyeditorjs/blocks.py</a></td>
85
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t42"><data value='EditorJsBlock'>EditorJsBlock</data></a></td>
86
- <td>4</td>
87
- <td>3</td>
88
- <td>0</td>
89
- <td class="right" data-ratio="1 4">25%</td>
90
- </tr>
91
- <tr class="region">
92
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t87">pyeditorjs/blocks.py</a></td>
93
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t87"><data value='HeaderBlock'>HeaderBlock</data></a></td>
94
- <td>9</td>
95
- <td>1</td>
96
- <td>0</td>
97
- <td class="right" data-ratio="8 9">89%</td>
98
- </tr>
99
- <tr class="region">
100
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t120">pyeditorjs/blocks.py</a></td>
101
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t120"><data value='ParagraphBlock'>ParagraphBlock</data></a></td>
102
- <td>2</td>
103
- <td>0</td>
104
- <td>0</td>
105
- <td class="right" data-ratio="2 2">100%</td>
106
- </tr>
107
- <tr class="region">
108
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t134">pyeditorjs/blocks.py</a></td>
109
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t134"><data value='ListBlock'>ListBlock</data></a></td>
110
- <td>8</td>
111
- <td>1</td>
112
- <td>0</td>
113
- <td class="right" data-ratio="7 8">88%</td>
114
- </tr>
115
- <tr class="region">
116
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t168">pyeditorjs/blocks.py</a></td>
117
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t168"><data value='DelimiterBlock'>DelimiterBlock</data></a></td>
118
- <td>1</td>
119
- <td>0</td>
120
- <td>0</td>
121
- <td class="right" data-ratio="1 1">100%</td>
122
- </tr>
123
- <tr class="region">
124
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t174">pyeditorjs/blocks.py</a></td>
125
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t174"><data value='ImageBlock'>ImageBlock</data></a></td>
126
- <td>10</td>
127
- <td>1</td>
128
- <td>0</td>
129
- <td class="right" data-ratio="9 10">90%</td>
130
- </tr>
131
- <tr class="region">
132
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t236">pyeditorjs/blocks.py</a></td>
133
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t236"><data value='QuoteBlock'>QuoteBlock</data></a></td>
134
- <td>7</td>
135
- <td>7</td>
136
- <td>0</td>
137
- <td class="right" data-ratio="0 7">0%</td>
138
- </tr>
139
- <tr class="region">
140
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t253">pyeditorjs/blocks.py</a></td>
141
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t253"><data value='TableBlock'>TableBlock</data></a></td>
142
- <td>11</td>
143
- <td>11</td>
144
- <td>0</td>
145
- <td class="right" data-ratio="0 11">0%</td>
146
- </tr>
147
- <tr class="region">
148
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t275">pyeditorjs/blocks.py</a></td>
149
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t275"><data value='CodeBlock'>CodeBlock</data></a></td>
150
- <td>4</td>
151
- <td>4</td>
152
- <td>0</td>
153
- <td class="right" data-ratio="0 4">0%</td>
154
- </tr>
155
- <tr class="region">
156
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t286">pyeditorjs/blocks.py</a></td>
157
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t286"><data value='WarningBlock'>WarningBlock</data></a></td>
158
- <td>6</td>
159
- <td>6</td>
160
- <td>0</td>
161
- <td class="right" data-ratio="0 6">0%</td>
162
- </tr>
163
- <tr class="region">
164
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t304">pyeditorjs/blocks.py</a></td>
165
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html#t304"><data value='RawBlock'>RawBlock</data></a></td>
166
- <td>4</td>
167
- <td>4</td>
168
- <td>0</td>
169
- <td class="right" data-ratio="0 4">0%</td>
170
- </tr>
171
- <tr class="region">
172
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html">pyeditorjs/blocks.py</a></td>
173
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_blocks_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
174
- <td>80</td>
175
- <td>0</td>
176
- <td>0</td>
177
- <td class="right" data-ratio="80 80">100%</td>
178
- </tr>
179
- <tr class="region">
180
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_exceptions_py.html#t8">pyeditorjs/exceptions.py</a></td>
181
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_exceptions_py.html#t8"><data value='EditorJsException'>EditorJsException</data></a></td>
182
- <td>0</td>
183
- <td>0</td>
184
- <td>0</td>
185
- <td class="right" data-ratio="0 0">100%</td>
186
- </tr>
187
- <tr class="region">
188
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_exceptions_py.html#t14">pyeditorjs/exceptions.py</a></td>
189
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_exceptions_py.html#t14"><data value='EditorJsParseError'>EditorJsParseError</data></a></td>
190
- <td>0</td>
191
- <td>0</td>
192
- <td>0</td>
193
- <td class="right" data-ratio="0 0">100%</td>
194
- </tr>
195
- <tr class="region">
196
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_exceptions_py.html#t18">pyeditorjs/exceptions.py</a></td>
197
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_exceptions_py.html#t18"><data value='EditorJSUnsupportedBlock'>EditorJSUnsupportedBlock</data></a></td>
198
- <td>0</td>
199
- <td>0</td>
200
- <td>0</td>
201
- <td class="right" data-ratio="0 0">100%</td>
202
- </tr>
203
- <tr class="region">
204
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_exceptions_py.html">pyeditorjs/exceptions.py</a></td>
205
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_exceptions_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
206
- <td>4</td>
207
- <td>0</td>
208
- <td>0</td>
209
- <td class="right" data-ratio="4 4">100%</td>
210
- </tr>
211
- <tr class="region">
212
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_parser_py.html#t10">pyeditorjs/parser.py</a></td>
213
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_parser_py.html#t10"><data value='EditorJsParser'>EditorJsParser</data></a></td>
214
- <td>19</td>
215
- <td>6</td>
216
- <td>0</td>
217
- <td class="right" data-ratio="13 19">68%</td>
218
- </tr>
219
- <tr class="region">
220
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_parser_py.html">pyeditorjs/parser.py</a></td>
221
- <td class="name left"><a href="z_a93c8aeb4b8fa1f9_parser_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
222
- <td>15</td>
223
- <td>0</td>
224
- <td>0</td>
225
- <td class="right" data-ratio="15 15">100%</td>
226
- </tr>
227
- </tbody>
228
- <tfoot>
229
- <tr class="total">
230
- <td class="name left">Total</td>
231
- <td class="name left">&nbsp;</td>
232
- <td>198</td>
233
- <td>47</td>
234
- <td>0</td>
235
- <td class="right" data-ratio="151 198">76%</td>
236
- </tr>
237
- </tfoot>
238
- </table>
239
- <p id="no_rows">
240
- No items found using the specified filter.
241
- </p>
242
- </main>
243
- <footer>
244
- <div class="content">
245
- <p>
246
- <a class="nav" href="https://coverage.readthedocs.io/en/7.6.4">coverage.py v7.6.4</a>,
247
- created at 2024-10-31 13:29 +0100
248
- </p>
249
- </div>
250
- <aside class="hidden">
251
- <a id="prevFileLink" class="nav" href=""></a>
252
- <a id="nextFileLink" class="nav" href=""></a>
253
- <button type="button" class="button_prev_file" data-shortcut="["></button>
254
- <button type="button" class="button_next_file" data-shortcut="]"></button>
255
- <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
256
- </aside>
257
- </footer>
258
- </body>
259
- </html>