markdown-to-confluence 0.5.3__py3-none-any.whl → 0.5.4__py3-none-any.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.
- {markdown_to_confluence-0.5.3.dist-info → markdown_to_confluence-0.5.4.dist-info}/METADATA +182 -157
- {markdown_to_confluence-0.5.3.dist-info → markdown_to_confluence-0.5.4.dist-info}/RECORD +26 -26
- md2conf/__init__.py +1 -1
- md2conf/__main__.py +42 -21
- md2conf/api.py +3 -2
- md2conf/converter.py +8 -8
- md2conf/drawio/extension.py +3 -3
- md2conf/extension.py +4 -0
- md2conf/external.py +25 -8
- md2conf/image.py +10 -9
- md2conf/mermaid/render.py +1 -1
- md2conf/options.py +2 -0
- md2conf/plantuml/extension.py +6 -6
- md2conf/plantuml/render.py +6 -7
- md2conf/png.py +10 -6
- md2conf/processor.py +24 -3
- md2conf/publisher.py +114 -22
- md2conf/scanner.py +7 -1
- md2conf/svg.py +128 -109
- md2conf/toc.py +72 -0
- {markdown_to_confluence-0.5.3.dist-info → markdown_to_confluence-0.5.4.dist-info}/WHEEL +0 -0
- {markdown_to_confluence-0.5.3.dist-info → markdown_to_confluence-0.5.4.dist-info}/entry_points.txt +0 -0
- {markdown_to_confluence-0.5.3.dist-info → markdown_to_confluence-0.5.4.dist-info}/licenses/LICENSE +0 -0
- {markdown_to_confluence-0.5.3.dist-info → markdown_to_confluence-0.5.4.dist-info}/top_level.txt +0 -0
- {markdown_to_confluence-0.5.3.dist-info → markdown_to_confluence-0.5.4.dist-info}/zip-safe +0 -0
- /md2conf/{puppeteer-config.json → mermaid/puppeteer-config.json} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: markdown-to-confluence
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.4
|
|
4
4
|
Summary: Publish Markdown files to Confluence wiki
|
|
5
5
|
Author-email: Levente Hunyadi <hunyadi@gmail.com>
|
|
6
6
|
Maintainer-email: Levente Hunyadi <hunyadi@gmail.com>
|
|
@@ -62,7 +62,6 @@ This Python package
|
|
|
62
62
|
* Text with **bold**, *italic*, `monospace`, <ins>underline</ins> and ~~strikethrough~~
|
|
63
63
|
* Link to [sections on the same page](#getting-started) or [external locations](http://example.com/)
|
|
64
64
|
* Subscript and superscript
|
|
65
|
-
* Math formulas with LaTeX notation
|
|
66
65
|
* Emoji
|
|
67
66
|
* Ordered and unordered lists
|
|
68
67
|
* Block quotes
|
|
@@ -76,6 +75,8 @@ This Python package
|
|
|
76
75
|
* [Tasklists](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/about-tasklists)
|
|
77
76
|
* draw\.io diagrams
|
|
78
77
|
* [Mermaid diagrams](https://mermaid.live/)
|
|
78
|
+
* PlantUML diagrams
|
|
79
|
+
* Math formulas with LaTeX notation
|
|
79
80
|
* Confluence status labels and date widget
|
|
80
81
|
|
|
81
82
|
Whenever possible, the implementation uses [Confluence REST API v2](https://developer.atlassian.com/cloud/confluence/rest/v2/) to fetch space properties, and get, create or update page content.
|
|
@@ -198,50 +199,54 @@ If you lack appropriate permissions, you will get an *Unauthorized* response fro
|
|
|
198
199
|
|
|
199
200
|
### Associating a Markdown file with a wiki page
|
|
200
201
|
|
|
201
|
-
Each Markdown file is associated with a Confluence wiki page
|
|
202
|
+
Each Markdown file is associated with a Confluence wiki page either *explicitly* or *implicitly*.
|
|
203
|
+
|
|
204
|
+
#### Explicit association
|
|
205
|
+
|
|
206
|
+
We associate a Markdown document with a Confluence page explicitly by specifying the related Confluence page ID in a Markdown comment:
|
|
202
207
|
|
|
203
208
|
```markdown
|
|
204
209
|
<!-- confluence-page-id: 20250001023 -->
|
|
205
210
|
```
|
|
206
211
|
|
|
207
|
-
The above tells the tool to synchronize the Markdown file with the given Confluence page ID.
|
|
212
|
+
The above tells the tool to synchronize the Markdown file with the given Confluence page ID. The Confluence wiki page must be created beforehand. The comment can be placed anywhere in the source file.
|
|
208
213
|
|
|
209
|
-
|
|
214
|
+
#### Implicit association
|
|
210
215
|
|
|
211
|
-
|
|
216
|
+
Each Markdown document is automatically paired with a Confluence page in the target space if they have the same title.
|
|
212
217
|
|
|
213
|
-
|
|
214
|
-
<!-- confluence-space-key: SPACE -->
|
|
215
|
-
```
|
|
218
|
+
If a Confluence page with the given title doesn't exist, it is created automatically, and its identifier is injected into the source as a Markdown comment.
|
|
216
219
|
|
|
217
|
-
|
|
220
|
+
If a Confluence page already exists whose title matches the Markdown document title, additional precautions are taken to avoid overwriting an unrelated page. Each implicitly associated page has to trace back to a trusted well-known Confluence page via parent-child relationships before its content would be synchronized. Trusted Confluence pages include:
|
|
218
221
|
|
|
219
|
-
|
|
222
|
+
* the *root page* whose page ID is
|
|
223
|
+
* specified in the command line, or
|
|
224
|
+
* extracted from the index file of a directory that is being synchronized
|
|
225
|
+
* a page associated with a Markdown document via a page ID
|
|
226
|
+
* embedded as a Markdown comment, or
|
|
227
|
+
* specified in the Markdown front-matter
|
|
220
228
|
|
|
221
|
-
|
|
229
|
+
If a Confluence page doesn't have a trusted ancestor, synchronization fails. This restricts updates to subtrees of well-known pages.
|
|
222
230
|
|
|
223
|
-
|
|
231
|
+
### Setting the Confluence space
|
|
232
|
+
|
|
233
|
+
If you work in an environment where there are multiple Confluence spaces, and some Markdown pages may go into one space, whereas other pages may go into another, you can set the target space on a per-document basis:
|
|
224
234
|
|
|
225
235
|
```markdown
|
|
226
|
-
<!--
|
|
236
|
+
<!-- confluence-space-key: SPACE -->
|
|
227
237
|
```
|
|
228
238
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
The generated-by text can also be templated with the following variables:
|
|
239
|
+
This overrides the default space set via command-line arguments or environment variables.
|
|
232
240
|
|
|
233
|
-
|
|
234
|
-
- `%{filestem}`: the name of the Markdown file without the extension
|
|
235
|
-
- `%{filepath}`: the path of the Markdown file relative to the _source root_
|
|
236
|
-
- `%{filedir}`: the dirname of the `%{filepath}` (the path without the filename)
|
|
241
|
+
### Page title
|
|
237
242
|
|
|
238
|
-
|
|
243
|
+
*md2conf* makes a best-effort attempt at setting the Confluence wiki page title when it publishes a Markdown document the first time. The following act as sources for deriving a page title:
|
|
239
244
|
|
|
240
|
-
|
|
245
|
+
1. The `title` attribute set in the [front-matter](https://daily-dev-tips.com/posts/what-exactly-is-frontmatter/). Front-matter is a block delimited by `---` at the beginning of a Markdown document. Both JSON and YAML syntax are supported.
|
|
246
|
+
2. The text of the topmost unique Markdown heading (`#`). For example, if a document has a single first-level heading (e.g. `# My document`), its text is used. However, if there are multiple first-level headings, this step is skipped.
|
|
247
|
+
3. The file name (without the extension `.md`) and a digest. The digest is included to ensure the title is unique across the Confluence space.
|
|
241
248
|
|
|
242
|
-
|
|
243
|
-
<!-- generated-by: Do not edit! Check out the file %{filepath} in the repo -->
|
|
244
|
-
```
|
|
249
|
+
If the `title` attribute (in the front-matter) or the topmost unique heading (in the document body) changes, the Confluence page title is updated. A warning is raised if the new title conflicts with the title of another page, and thus cannot be updated.
|
|
245
250
|
|
|
246
251
|
### Publishing a single page
|
|
247
252
|
|
|
@@ -267,7 +272,7 @@ The title of each Markdown file (either the text of the topmost unique heading (
|
|
|
267
272
|
|
|
268
273
|
```
|
|
269
274
|
docs
|
|
270
|
-
├── index.md:
|
|
275
|
+
├── index.md: Eternal golden braid
|
|
271
276
|
├── computer-science
|
|
272
277
|
│ ├── index.md: Introduction to computer science
|
|
273
278
|
│ ├── algebra.md: Linear algebra
|
|
@@ -278,7 +283,7 @@ docs
|
|
|
278
283
|
│ └── statistics
|
|
279
284
|
│ ├── index.md: Introduction to statistics
|
|
280
285
|
│ └── median.md: Mean vs. median
|
|
281
|
-
└── ethics.md:
|
|
286
|
+
└── ethics.md: History of ethics
|
|
282
287
|
```
|
|
283
288
|
|
|
284
289
|
#### Page hierarchy in Confluence
|
|
@@ -286,7 +291,7 @@ docs
|
|
|
286
291
|
Observe how `index.md` and `README.md` files have assumed parent (or ancestor) role for any Markdown files in the same directory (or below).
|
|
287
292
|
|
|
288
293
|
```
|
|
289
|
-
|
|
294
|
+
Eternal golden braid
|
|
290
295
|
├── Introduction to computer science
|
|
291
296
|
│ ├── Linear algebra
|
|
292
297
|
│ └── Theory of algorithms
|
|
@@ -294,7 +299,7 @@ Root page
|
|
|
294
299
|
│ ├── Consciousness and intelligence
|
|
295
300
|
│ └── Introduction to statistics
|
|
296
301
|
│ └── Mean vs. median
|
|
297
|
-
└──
|
|
302
|
+
└── History of ethics
|
|
298
303
|
```
|
|
299
304
|
|
|
300
305
|
### Subscript and superscript
|
|
@@ -313,57 +318,6 @@ The short name notation `:smile:` in a Markdown document is converted into the c
|
|
|
313
318
|
<ac:emoticon ac:name="smile" ac:emoji-shortname=":smile:" ac:emoji-id="1f604" ac:emoji-fallback="😄"/>
|
|
314
319
|
```
|
|
315
320
|
|
|
316
|
-
### Colors
|
|
317
|
-
|
|
318
|
-
Confluence allows setting text color and highlight color. Even though Markdown doesn't directly support colors, it is possible to set text and highlight color via the HTML element `<span>` and the CSS attributes `color` and `background-color`, respectively:
|
|
319
|
-
|
|
320
|
-
Text in <span style="color: rgb(255,86,48);">red</span>, <span style="color: rgb(54,179,126);">green</span> and <span style="color: rgb(76,154,255);">blue</span>:
|
|
321
|
-
|
|
322
|
-
```markdown
|
|
323
|
-
Text in <span style="color: rgb(255,86,48);">red</span>, <span style="color: rgb(54,179,126);">green</span> and <span style="color: rgb(76,154,255);">blue</span>.
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
Highlight in <span style="background-color: rgb(198,237,251);">teal</span>, <span style="background-color: rgb(211,241,167);">lime</span> and <span style="background-color: rgb(254,222,200);">yellow</span>:
|
|
327
|
-
|
|
328
|
-
```markdown
|
|
329
|
-
Highlight in <span style="background-color: rgb(198,237,251);">teal</span>, <span style="background-color: rgb(211,241,167);">lime</span> and <span style="background-color: rgb(254,222,200);">yellow</span>.
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
Highlighting is also supported via `==marks==`. However, the background color is not customizable.
|
|
333
|
-
|
|
334
|
-
The following table shows standard text colors (CSS `color`) that are available via Confluence UI:
|
|
335
|
-
|
|
336
|
-
| Color name | CSS attribute value |
|
|
337
|
-
| :------------ | :------------------ |
|
|
338
|
-
| bold blue | rgb(7,71,166) |
|
|
339
|
-
| blue | rgb(76,154,255) |
|
|
340
|
-
| subtle blue | rgb(179,212,255) |
|
|
341
|
-
| bold teal | rgb(0,141,166) |
|
|
342
|
-
| teal | rgb(0,184,217) |
|
|
343
|
-
| subtle teal | rgb(179,245,255) |
|
|
344
|
-
| bold green | rgb(0,102,68) |
|
|
345
|
-
| green | rgb(54,179,126) |
|
|
346
|
-
| subtle green | rgb(171,245,209) |
|
|
347
|
-
| bold orange | rgb(255,153,31) |
|
|
348
|
-
| yellow | rgb(255,196,0) |
|
|
349
|
-
| subtle yellow | rgb(255,240,179) |
|
|
350
|
-
| bold red | rgb(191,38,0) |
|
|
351
|
-
| red | rgb(255,86,48) |
|
|
352
|
-
| subtle red | rgb(255,189,173) |
|
|
353
|
-
| bold purple | rgb(64,50,148) |
|
|
354
|
-
| purple | rgb(101,84,192) |
|
|
355
|
-
| subtle purple | rgb(234,230,255) |
|
|
356
|
-
|
|
357
|
-
The following table shows standard highlight colors (CSS `background-color`) that are available via Confluence UI:
|
|
358
|
-
|
|
359
|
-
| Color name | CSS attribute value |
|
|
360
|
-
| ------------- | ------------------- |
|
|
361
|
-
| teal | rgb(198,237,251) |
|
|
362
|
-
| lime | rgb(211,241,167) |
|
|
363
|
-
| yellow | rgb(254,222,200) |
|
|
364
|
-
| magenta | rgb(253,208,236) |
|
|
365
|
-
| purple | rgb(223,216,253) |
|
|
366
|
-
|
|
367
321
|
### Lists and tables
|
|
368
322
|
|
|
369
323
|
If your Markdown lists or tables don't appear in Confluence as expected, verify that the list or table is delimited by a blank line both before and after, as per strict Markdown syntax. While some previewers accept a more lenient syntax (e.g. an itemized list immediately following a paragraph), *md2conf* uses [Python-Markdown](https://python-markdown.github.io/) internally to convert Markdown into XHTML, which expects the Markdown document to adhere to the stricter syntax.
|
|
@@ -396,6 +350,34 @@ Unfortunately, Confluence struggles with SVG images, e.g. they may only show in
|
|
|
396
350
|
|
|
397
351
|
External images referenced with an absolute URL retain the original URL.
|
|
398
352
|
|
|
353
|
+
### draw\.io diagrams
|
|
354
|
+
|
|
355
|
+
With the command-line option `--no-render-drawio` (default), editable diagram data is extracted from images with embedded draw\.io diagrams (`*.drawio.png` and `*.drawio.svg`), and uploaded to Confluence as attachments. Files that match `*.drawio` or `*.drawio.xml` are uploaded as-is. You need a [marketplace app](https://marketplace.atlassian.com/apps/1210933/draw-io-diagrams-uml-bpmn-aws-erd-flowcharts) to view and edit these diagrams on a Confluence page.
|
|
356
|
+
|
|
357
|
+
With the command-line option `--render-drawio`, images with embedded draw\.io diagrams (`*.drawio.png` and `*.drawio.svg`) are uploaded unchanged, and shown on the Confluence page as images. These diagrams are not editable in Confluence. When both an SVG and a PNG image is available, PNG is preferred. Files that match `*.drawio` or `*.drawio.xml` are converted into PNG or SVG images by invoking draw\.io as a command-line utility, and the generated images are uploaded to Confluence as attachments, and shown as images.
|
|
358
|
+
|
|
359
|
+
### Mermaid diagrams
|
|
360
|
+
|
|
361
|
+
You can add [Mermaid diagrams](https://mermaid.js.org/) to your Markdown documents to create visual representations of systems, processes, and relationships. There are two ways to include a Mermaid diagram:
|
|
362
|
+
|
|
363
|
+
* an image reference to a `.mmd` or `.mermaid` file, i.e. ``, or
|
|
364
|
+
* a fenced code block with the language specifier `mermaid`.
|
|
365
|
+
|
|
366
|
+
*md2conf* offers two options to publish the diagram:
|
|
367
|
+
|
|
368
|
+
1. Pre-render into an image (command-line option `--render-mermaid`). The source file or code block is interpreted by and converted into a PNG or SVG image with the Mermaid diagram utility [mermaid-cli](https://github.com/mermaid-js/mermaid-cli). The generated image is then uploaded to Confluence as an attachment to the page.
|
|
369
|
+
2. Display on demand (command-line option `--no-render-mermaid`). The code block is transformed into a [diagram macro](https://stratus-addons.atlassian.net/wiki/spaces/MDFC/overview), which is processed by Confluence. You need a separate [marketplace app](https://marketplace.atlassian.com/apps/1226567/mermaid-diagrams-for-confluence) to turn macro definitions into images when a Confluence page is visited.
|
|
370
|
+
|
|
371
|
+
If you are running into issues with the pre-rendering approach (e.g. misaligned labels in the generated image), verify if `mermaid-cli` can process the Mermaid source:
|
|
372
|
+
|
|
373
|
+
```sh
|
|
374
|
+
mmdc -i sample.mmd -o sample.png -b transparent --scale 2
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
Ensure that `mermaid-cli` is set up, refer to *Installation* for instructions.
|
|
378
|
+
|
|
379
|
+
Note that `mermaid-cli` has some implicit dependencies (e.g. a headless browser) that may not be immediately available in a CI/CD environment such as GitHub Actions. Refer to the `Dockerfile` in the *md2conf* project root, or [mermaid-cli documentation](https://github.com/mermaid-js/mermaid-cli) on how to install these dependencies such as a `chromium-browser` and various fonts.
|
|
380
|
+
|
|
399
381
|
### LaTeX math formulas
|
|
400
382
|
|
|
401
383
|
Inline formulas can be enclosed with `$` signs, or delimited with `\(` and `\)`, i.e.
|
|
@@ -413,16 +395,15 @@ is shown as
|
|
|
413
395
|
|
|
414
396
|
$$\int _{a}^{b}f(x)dx=F(b)-F(a)$$
|
|
415
397
|
|
|
416
|
-
|
|
398
|
+
If installed, *md2conf* can pre-render math formulas with [Matplotlib](https://matplotlib.org/). This approach doesn't require a third-party Confluence extension.
|
|
417
399
|
|
|
418
|
-
|
|
400
|
+
Displaying math formulas in Confluence (without pre-rendering) requires the extension [LaTeX Math for Confluence - Math Formula & Equations](https://help.narva.net/latex-math-for-confluence/).
|
|
419
401
|
|
|
420
|
-
|
|
402
|
+
### Alignment
|
|
421
403
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
```
|
|
404
|
+
You can configure diagram and image alignment using the JSON/YAML front-matter attribute `alignment` or the command-line argument of the same name. Possible values are `center` (default), `left` and `right`. The value configured in the Markdown file front-matter takes precedence.
|
|
405
|
+
|
|
406
|
+
Unfortunately, not every third-party app supports every alignment variant. For example, the draw\.io marketplace app supports left and center but not right alignment; and diagrams produced by the Mermaid marketplace app are always centered, ignoring the setting for alignment.
|
|
426
407
|
|
|
427
408
|
### Confluence widgets
|
|
428
409
|
|
|
@@ -456,39 +437,108 @@ Use the pseudo-language `csf` in a Markdown code block to pass content directly
|
|
|
456
437
|
```
|
|
457
438
|
````
|
|
458
439
|
|
|
459
|
-
###
|
|
440
|
+
### Implicit URLs
|
|
460
441
|
|
|
461
|
-
|
|
442
|
+
*md2conf* implicitly defines some URLs, as if you included the following at the start of the Markdown document for each URL:
|
|
462
443
|
|
|
463
|
-
|
|
444
|
+
```markdown
|
|
445
|
+
[CUSTOM-URL]: https://example.com/path/to/resource
|
|
446
|
+
```
|
|
464
447
|
|
|
465
|
-
|
|
448
|
+
Specifically, image references for status labels (e.g. `![My label][STATUS-RED]`) are automatically resolved into internally defined URLs via this mechanism.
|
|
466
449
|
|
|
467
|
-
|
|
450
|
+
### Colors
|
|
468
451
|
|
|
469
|
-
|
|
470
|
-
---
|
|
471
|
-
title: "Collaborating with other teams"
|
|
472
|
-
page_id: "19830101"
|
|
473
|
-
synchronized: false
|
|
474
|
-
---
|
|
452
|
+
Confluence allows setting text color and highlight color. Even though Markdown doesn't directly support colors, it is possible to set text and highlight color via the HTML element `<span>` and the CSS attributes `color` and `background-color`, respectively:
|
|
475
453
|
|
|
476
|
-
|
|
454
|
+
Text in <span style="color: rgb(255,86,48);">red</span>, <span style="color: rgb(54,179,126);">green</span> and <span style="color: rgb(76,154,255);">blue</span>:
|
|
455
|
+
|
|
456
|
+
```markdown
|
|
457
|
+
Text in <span style="color: rgb(255,86,48);">red</span>, <span style="color: rgb(54,179,126);">green</span> and <span style="color: rgb(76,154,255);">blue</span>.
|
|
477
458
|
```
|
|
478
459
|
|
|
479
|
-
|
|
460
|
+
Highlight in <span style="background-color: rgb(198,237,251);">teal</span>, <span style="background-color: rgb(211,241,167);">lime</span> and <span style="background-color: rgb(254,222,200);">yellow</span>:
|
|
480
461
|
|
|
481
|
-
|
|
462
|
+
```markdown
|
|
463
|
+
Highlight in <span style="background-color: rgb(198,237,251);">teal</span>, <span style="background-color: rgb(211,241,167);">lime</span> and <span style="background-color: rgb(254,222,200);">yellow</span>.
|
|
464
|
+
```
|
|
482
465
|
|
|
483
|
-
|
|
466
|
+
Highlighting is also supported via `==marks==`. However, the background color is not customizable.
|
|
484
467
|
|
|
485
|
-
|
|
486
|
-
2. The text of the topmost unique Markdown heading (`#`). For example, if a document has a single first-level heading (e.g. `# My document`), its text is used. However, if there are multiple first-level headings, this step is skipped.
|
|
487
|
-
3. The file name (without the extension `.md`) and a digest. The digest is included to ensure the title is unique across the Confluence space.
|
|
468
|
+
The following table shows standard text colors (CSS `color`) that are available via Confluence UI:
|
|
488
469
|
|
|
489
|
-
|
|
470
|
+
| Color name | CSS attribute value |
|
|
471
|
+
| :------------ | :------------------ |
|
|
472
|
+
| bold blue | rgb(7,71,166) |
|
|
473
|
+
| blue | rgb(76,154,255) |
|
|
474
|
+
| subtle blue | rgb(179,212,255) |
|
|
475
|
+
| bold teal | rgb(0,141,166) |
|
|
476
|
+
| teal | rgb(0,184,217) |
|
|
477
|
+
| subtle teal | rgb(179,245,255) |
|
|
478
|
+
| bold green | rgb(0,102,68) |
|
|
479
|
+
| green | rgb(54,179,126) |
|
|
480
|
+
| subtle green | rgb(171,245,209) |
|
|
481
|
+
| bold orange | rgb(255,153,31) |
|
|
482
|
+
| yellow | rgb(255,196,0) |
|
|
483
|
+
| subtle yellow | rgb(255,240,179) |
|
|
484
|
+
| bold red | rgb(191,38,0) |
|
|
485
|
+
| red | rgb(255,86,48) |
|
|
486
|
+
| subtle red | rgb(255,189,173) |
|
|
487
|
+
| bold purple | rgb(64,50,148) |
|
|
488
|
+
| purple | rgb(101,84,192) |
|
|
489
|
+
| subtle purple | rgb(234,230,255) |
|
|
490
|
+
|
|
491
|
+
The following table shows standard highlight colors (CSS `background-color`) that are available via Confluence UI:
|
|
492
|
+
|
|
493
|
+
| Color name | CSS attribute value |
|
|
494
|
+
| ------------- | ------------------- |
|
|
495
|
+
| teal | rgb(198,237,251) |
|
|
496
|
+
| lime | rgb(211,241,167) |
|
|
497
|
+
| yellow | rgb(254,222,200) |
|
|
498
|
+
| magenta | rgb(253,208,236) |
|
|
499
|
+
| purple | rgb(223,216,253) |
|
|
500
|
+
|
|
501
|
+
### HTML in Markdown
|
|
502
|
+
|
|
503
|
+
*md2conf* relays HTML elements nested in Markdown content to Confluence (such as `e<sup>x</sup>` for superscript). However, Confluence uses an extension of XHTML, i.e. the content must qualify as valid XML too. In particular, unterminated tags (e.g. `<br>` or `<img ...>`) or inconsistent nesting (e.g. `<b><i></b></i>`) are not permitted, and will raise an XML parsing error. When an HTML element has no content such as `<br>` or `<img>`, use a self-closing tag:
|
|
504
|
+
|
|
505
|
+
```html
|
|
506
|
+
<br/>
|
|
507
|
+
<img src="image.png" width="24" height="24" />
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
### Links to attachments
|
|
511
|
+
|
|
512
|
+
If *md2conf* encounters a Markdown link that points to a file in the directory hierarchy being synchronized, it automatically uploads the file as an attachment to the Confluence page. Activating the link in Confluence downloads the file. Typical examples include PDFs (`*.pdf`), word processor documents (`*.docx`), spreadsheets (`*.xlsx`), plain text files (`*.txt`) or logs (`*.log`). The MIME type is set based on the file type.
|
|
513
|
+
|
|
514
|
+
### Setting generated-by prompt text for wiki pages
|
|
515
|
+
|
|
516
|
+
In order to ensure readers are not editing a generated document, the tool adds a warning message at the top of the Confluence page as an *info panel*. You can customize the text that appears. The text can contain markup as per the [Confluence Storage Format](https://confluence.atlassian.com/doc/confluence-storage-format-790796544.html), and is emitted directly into the *info panel* macro.
|
|
517
|
+
|
|
518
|
+
Provide generated-by prompt text in the Markdown file with a tag:
|
|
519
|
+
|
|
520
|
+
```markdown
|
|
521
|
+
<!-- generated-by: Do not edit! Check out the <a href="https://example.com/project">original source</a>. -->
|
|
522
|
+
```
|
|
490
523
|
|
|
491
|
-
|
|
524
|
+
Alternatively, use the `--generated-by GENERATED_BY` option. The tag takes precedence.
|
|
525
|
+
|
|
526
|
+
The generated-by text can also be templated with the following variables:
|
|
527
|
+
|
|
528
|
+
- `%{filename}`: the name of the Markdown file
|
|
529
|
+
- `%{filestem}`: the name of the Markdown file without the extension
|
|
530
|
+
- `%{filepath}`: the path of the Markdown file relative to the _source root_
|
|
531
|
+
- `%{filedir}`: the dirname of the `%{filepath}` (the path without the filename)
|
|
532
|
+
|
|
533
|
+
When publishing a directory hierarchy, the *source root* is the directory in which *md2conf* is launched. When publishing a single file, this is the directory in which the Markdown file resides.
|
|
534
|
+
|
|
535
|
+
It can be used with the CLI `--generated-by` option or directly in the files:
|
|
536
|
+
|
|
537
|
+
```markdown
|
|
538
|
+
<!-- generated-by: Do not edit! Check out the file %{filepath} in the repo -->
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
### Avoiding duplicate titles
|
|
492
542
|
|
|
493
543
|
By default, when *md2conf* extracts a page title from the first unique heading in a Markdown document, the heading remains in the document body. This means the title appears twice on the Confluence page: once as the page title at the top, and once as the first heading in the content.
|
|
494
544
|
|
|
@@ -540,6 +590,28 @@ While the structure remains semantically correct, the visual separation is lost.
|
|
|
540
590
|
2. **Use an admonition block:** Wrap the abstract in an info/note block
|
|
541
591
|
3. **Use front-matter title:** Set `title` in front-matter to keep the heading in the body
|
|
542
592
|
|
|
593
|
+
### Ignoring files
|
|
594
|
+
|
|
595
|
+
Skip files and subdirectories in a directory with rules defined in `.mdignore`. Each rule should occupy a single line. Rules follow the syntax (and constraints) of [fnmatch](https://docs.python.org/3/library/fnmatch.html#fnmatch.fnmatch). Specifically, `?` matches any single character, and `*` matches zero or more characters. For example, use `up-*.md` to exclude Markdown files that start with `up-`. Lines that start with `#` are treated as comments.
|
|
596
|
+
|
|
597
|
+
Files that don't have the extension `*.md` are skipped automatically. Hidden directories (whose name starts with `.`) are not recursed into. To skip an entire directory, add the name of the directory without a trailing `/`.
|
|
598
|
+
|
|
599
|
+
Relative paths to items in a nested directory are not supported. You must put `.mdignore` in the same directory where the items to be skipped reside.
|
|
600
|
+
|
|
601
|
+
If you add the `synchronized` attribute to JSON or YAML front-matter with the value `false`, the document content (including attachments) and metadata (e.g. tags) will not be synchronized with Confluence:
|
|
602
|
+
|
|
603
|
+
```yaml
|
|
604
|
+
---
|
|
605
|
+
title: "Collaborating with other teams"
|
|
606
|
+
page_id: "19830101"
|
|
607
|
+
synchronized: false
|
|
608
|
+
---
|
|
609
|
+
|
|
610
|
+
This Markdown document is neither parsed, nor synchronized with Confluence.
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
This is useful if you have a page in a hierarchy that participates in parent-child relationships but whose content is edited directly in Confluence. Specifically, these documents can be referenced with relative links from other Markdown documents in the file system tree.
|
|
614
|
+
|
|
543
615
|
### Labels
|
|
544
616
|
|
|
545
617
|
If a Markdown document has the front-matter attribute `tags`, *md2conf* assigns the specified tags to the Confluence page as labels.
|
|
@@ -571,54 +643,6 @@ properties:
|
|
|
571
643
|
|
|
572
644
|
The attribute `properties` is parsed as a dictionary with keys of type string and values of type JSON. *md2conf* passes JSON values to Confluence REST API unchanged.
|
|
573
645
|
|
|
574
|
-
### draw\.io diagrams
|
|
575
|
-
|
|
576
|
-
With the command-line option `--no-render-drawio` (default), editable diagram data is extracted from images with embedded draw\.io diagrams (`*.drawio.png` and `*.drawio.svg`), and uploaded to Confluence as attachments. Files that match `*.drawio` or `*.drawio.xml` are uploaded as-is. You need a [marketplace app](https://marketplace.atlassian.com/apps/1210933/draw-io-diagrams-uml-bpmn-aws-erd-flowcharts) to view and edit these diagrams on a Confluence page.
|
|
577
|
-
|
|
578
|
-
With the command-line option `--render-drawio`, images with embedded draw\.io diagrams (`*.drawio.png` and `*.drawio.svg`) are uploaded unchanged, and shown on the Confluence page as images. These diagrams are not editable in Confluence. When both an SVG and a PNG image is available, PNG is preferred. Files that match `*.drawio` or `*.drawio.xml` are converted into PNG or SVG images by invoking draw\.io as a command-line utility, and the generated images are uploaded to Confluence as attachments, and shown as images.
|
|
579
|
-
|
|
580
|
-
### Mermaid diagrams
|
|
581
|
-
|
|
582
|
-
You can add [Mermaid diagrams](https://mermaid.js.org/) to your Markdown documents to create visual representations of systems, processes, and relationships. There are two ways to include a Mermaid diagram:
|
|
583
|
-
|
|
584
|
-
* an image reference to a `.mmd` or `.mermaid` file, i.e. ``, or
|
|
585
|
-
* a fenced code block with the language specifier `mermaid`.
|
|
586
|
-
|
|
587
|
-
*md2conf* offers two options to publish the diagram:
|
|
588
|
-
|
|
589
|
-
1. Pre-render into an image (command-line option `--render-mermaid`). The source file or code block is interpreted by and converted into a PNG or SVG image with the Mermaid diagram utility [mermaid-cli](https://github.com/mermaid-js/mermaid-cli). The generated image is then uploaded to Confluence as an attachment to the page.
|
|
590
|
-
2. Display on demand (command-line option `--no-render-mermaid`). The code block is transformed into a [diagram macro](https://stratus-addons.atlassian.net/wiki/spaces/MDFC/overview), which is processed by Confluence. You need a separate [marketplace app](https://marketplace.atlassian.com/apps/1226567/mermaid-diagrams-for-confluence) to turn macro definitions into images when a Confluence page is visited.
|
|
591
|
-
|
|
592
|
-
If you are running into issues with the pre-rendering approach (e.g. misaligned labels in the generated image), verify if `mermaid-cli` can process the Mermaid source:
|
|
593
|
-
|
|
594
|
-
```sh
|
|
595
|
-
mmdc -i sample.mmd -o sample.png -b transparent --scale 2
|
|
596
|
-
```
|
|
597
|
-
|
|
598
|
-
Ensure that `mermaid-cli` is set up, refer to *Installation* for instructions.
|
|
599
|
-
|
|
600
|
-
Note that `mermaid-cli` has some implicit dependencies (e.g. a headless browser) that may not be immediately available in a CI/CD environment such as GitHub Actions. Refer to the `Dockerfile` in the *md2conf* project root, or [mermaid-cli documentation](https://github.com/mermaid-js/mermaid-cli) on how to install these dependencies such as a `chromium-browser` and various fonts.
|
|
601
|
-
|
|
602
|
-
### Alignment
|
|
603
|
-
|
|
604
|
-
You can configure diagram and image alignment using the JSON/YAML front-matter attribute `alignment` or the command-line argument of the same name. Possible values are `center` (default), `left` and `right`. The value configured in the Markdown file front-matter takes precedence.
|
|
605
|
-
|
|
606
|
-
Unfortunately, not every third-party app supports every alignment variant. For example, the draw\.io marketplace app supports left and center but not right alignment; and diagrams produced by the Mermaid marketplace app are always centered, ignoring the setting for alignment.
|
|
607
|
-
|
|
608
|
-
### Links to attachments
|
|
609
|
-
|
|
610
|
-
If *md2conf* encounters a Markdown link that points to a file in the directory hierarchy being synchronized, it automatically uploads the file as an attachment to the Confluence page. Activating the link in Confluence downloads the file. Typical examples include PDFs (`*.pdf`), word processor documents (`*.docx`), spreadsheets (`*.xlsx`), plain text files (`*.txt`) or logs (`*.log`). The MIME type is set based on the file type.
|
|
611
|
-
|
|
612
|
-
### Implicit URLs
|
|
613
|
-
|
|
614
|
-
*md2conf* implicitly defines some URLs, as if you included the following at the start of the Markdown document for each URL:
|
|
615
|
-
|
|
616
|
-
```markdown
|
|
617
|
-
[CUSTOM-URL]: https://example.com/path/to/resource
|
|
618
|
-
```
|
|
619
|
-
|
|
620
|
-
Specifically, image references for status labels (e.g. `![My label][STATUS-RED]`) are automatically resolved into internally defined URLs via this mechanism.
|
|
621
|
-
|
|
622
646
|
### Local output
|
|
623
647
|
|
|
624
648
|
*md2conf* supports local output, in which the tool doesn't communicate with the Confluence REST API. Instead, it reads a single Markdown file or a directory of Markdown files, and writes Confluence Storage Format (`*.csf`) output for each document. (Confluence Storage Format is a derivative of XHTML with Confluence-specific tags for complex elements such as images with captions, code blocks, info panels, collapsed sections, etc.) You can push the generated output to Confluence by invoking the API (e.g. with `curl`).
|
|
@@ -637,7 +661,7 @@ Use the `--help` switch to get a full list of supported command-line options:
|
|
|
637
661
|
|
|
638
662
|
```console
|
|
639
663
|
$ python3 -m md2conf --help
|
|
640
|
-
usage: md2conf mdpath [OPTIONS]
|
|
664
|
+
usage: md2conf mdpath [mdpath ...] [OPTIONS]
|
|
641
665
|
|
|
642
666
|
positional arguments:
|
|
643
667
|
mdpath Path to Markdown file or directory to convert and publish.
|
|
@@ -661,6 +685,7 @@ options:
|
|
|
661
685
|
--generated-by MARKDOWN
|
|
662
686
|
Add prompt to pages (default: 'This page has been generated with a tool.').
|
|
663
687
|
--no-generated-by Do not add 'generated by a tool' prompt to pages.
|
|
688
|
+
--skip-update Skip saving Confluence page ID in Markdown files.
|
|
664
689
|
--render-drawio Render draw.io diagrams as image files. (Installed utility required to covert.)
|
|
665
690
|
--no-render-drawio Upload draw.io diagram sources as Confluence page attachments. (Marketplace app required to display.)
|
|
666
691
|
--render-mermaid Render Mermaid diagrams as image files. (Installed utility required to convert.)
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
markdown_to_confluence-0.5.
|
|
2
|
-
md2conf/__init__.py,sha256=
|
|
3
|
-
md2conf/__main__.py,sha256=
|
|
4
|
-
md2conf/api.py,sha256=
|
|
1
|
+
markdown_to_confluence-0.5.4.dist-info/licenses/LICENSE,sha256=SEEBf2BMI1LUHnDvyHnV6L12A6zTAOQcsyMvaawAXWo,1077
|
|
2
|
+
md2conf/__init__.py,sha256=0xq0z3v7oQaJxJwZRPOd-Z4zgOOCnzgDJYa9nytHTD0,402
|
|
3
|
+
md2conf/__main__.py,sha256=BPUZd0uzCsAOH3Y5o7ydvV7Z77jSI8fHfo4AZPyYj2c,14639
|
|
4
|
+
md2conf/api.py,sha256=3TlUmiDU31dfL8raMwv2wQWV_IvVq6fu8j86cjKTz1A,42780
|
|
5
5
|
md2conf/attachment.py,sha256=Nc3qGDENWBnsI6OVwMLXnk0EyEITpvov9MluDFD90ZI,1689
|
|
6
6
|
md2conf/coalesce.py,sha256=YHnqFwow5wCj6OQ3oosig01D2lxWusAScMF4HAUO2-g,1305
|
|
7
7
|
md2conf/collection.py,sha256=ukN74VCa4HaGSh6tLXpLd0j_UNPywcnKI0X7usgdSCo,824
|
|
8
8
|
md2conf/compatibility.py,sha256=4ZNN6VLqxSbI1kowdsPproGZqwxBISys4Z22vBfe6Z8,687
|
|
9
|
-
md2conf/converter.py,sha256=
|
|
9
|
+
md2conf/converter.py,sha256=7eP4sEPgmyjiD0PO3jjyS5TcDY3OSW9hYsriLd9rbek,63201
|
|
10
10
|
md2conf/csf.py,sha256=6H9G-5cZyyWMJr0tFskPNiWdQ2Ehq-V8EhlvvxhukWY,6582
|
|
11
11
|
md2conf/emoticon.py,sha256=0g4rkx3d58xU4nnLak5ms7i0FSDnq0WJrLVFRgGyLC8,542
|
|
12
12
|
md2conf/entities.dtd,sha256=M6NzqL5N7dPs_eUA_6sDsiSLzDaAacrx9LdttiufvYU,30215
|
|
13
13
|
md2conf/environment.py,sha256=TfNEz3Pyw9qe7f8i7e_kph16c09fhZ4cLNZZzIjmI18,3892
|
|
14
|
-
md2conf/extension.py,sha256=
|
|
15
|
-
md2conf/external.py,sha256=
|
|
14
|
+
md2conf/extension.py,sha256=_IBf_yhYb6luQM3A-vAAtCpjHay33kE4Au_SGuC3kow,2274
|
|
15
|
+
md2conf/external.py,sha256=uY1G7bdqEMJW66vOvKsh5CS4oHY-YA7h2VVuaSdaqBo,2366
|
|
16
16
|
md2conf/formatting.py,sha256=ygL59VgpioX069axEX-7XjKs0sUjTfIZiBE5fWmITxc,4557
|
|
17
17
|
md2conf/frontmatter.py,sha256=iWtn_oXoLQxvCsdI3OXs1ylWGmB-gc7mMLpSGg113i4,1888
|
|
18
|
-
md2conf/image.py,sha256=
|
|
18
|
+
md2conf/image.py,sha256=YrtcE5KhzcbjiT-oQEkk--yKSiRSPlDUtMpekoepIdo,5289
|
|
19
19
|
md2conf/latex.py,sha256=haZKkUxSEcPj3fVmiIVZAwgszqNqGLk1GQ7i8KGHpo0,2226
|
|
20
20
|
md2conf/local.py,sha256=eY3WpY-lNzLZeAfxX1ACVEhuzz0HDYX_sNQogJfkqcM,3673
|
|
21
21
|
md2conf/markdown.py,sha256=4Km-AbQH04nDgPF0ijo-Ld7o8jTPXzENIMn7P1qIk0o,3148
|
|
22
22
|
md2conf/matcher.py,sha256=Xg4YSb87iPkCzhKuKytBut6NOkEab3IM-AjzXbwy64U,6774
|
|
23
23
|
md2conf/metadata.py,sha256=NOjbCIrwLgTIIeNgmo7w5JXuT-pxOXBGSg-irfdpokk,976
|
|
24
|
-
md2conf/options.py,sha256=
|
|
25
|
-
md2conf/png.py,sha256=
|
|
26
|
-
md2conf/processor.py,sha256=
|
|
27
|
-
md2conf/publisher.py,sha256=
|
|
28
|
-
md2conf/puppeteer-config.json,sha256=-dMTAN_7kNTGbDlfXzApl0KJpAWna9YKZdwMKbpOb60,159
|
|
24
|
+
md2conf/options.py,sha256=DLxnQBhDmDJgfEDSYyMChJi_krS1nsquOHBKg82aGrY,4500
|
|
25
|
+
md2conf/png.py,sha256=GU3-0dG6HqwGjedJVUciaIdA-6CdPTy_clsOQGr6dGE,6251
|
|
26
|
+
md2conf/processor.py,sha256=xVLpvKg2FEO0tWsHQ8sm7YpimQepbZ07W0_yUzcvl6c,11116
|
|
27
|
+
md2conf/publisher.py,sha256=xRIig53b4-DLncL07XBgLN3ecmTsWwNEK3ckjyhqfU8,11574
|
|
29
28
|
md2conf/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
|
-
md2conf/scanner.py,sha256=
|
|
29
|
+
md2conf/scanner.py,sha256=bupKNe47DRc8MyMLzYfgtzyVHV9osJSgnr7KCnKsMuM,3888
|
|
31
30
|
md2conf/serializer.py,sha256=W4_yLJfT3vLw0PUg88lpUEnvn64CjaX3ZaKgIrwcxfw,1786
|
|
32
|
-
md2conf/svg.py,sha256=
|
|
31
|
+
md2conf/svg.py,sha256=fjr8sWe-tqdAKaIq2bsR9qPrhnCXUmoVRtezHZa86cg,11558
|
|
33
32
|
md2conf/text.py,sha256=cnYV_JQp_v91LbQHo3qvxcEuhIdaPjCjkmLOKINcNv4,1736
|
|
34
|
-
md2conf/toc.py,sha256=
|
|
33
|
+
md2conf/toc.py,sha256=aJEH3fIzDr2RufxFbHJ8maEpezp8uXI_uw90k3-KNkA,4585
|
|
35
34
|
md2conf/uri.py,sha256=my0deyR5SlppJrYCbXF1Zz94QA1JT-HTWe9pKw7AJ_A,1158
|
|
36
35
|
md2conf/xml.py,sha256=uaaUDs0hfluNX74dfkY_Dxu1KmeNDGogpGRGpUVEfE4,5526
|
|
37
36
|
md2conf/drawio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
|
-
md2conf/drawio/extension.py,sha256
|
|
37
|
+
md2conf/drawio/extension.py,sha256=HHLUriTfg82VCfOEyzU-6j2IM9rxR3I1UdSDdujWHgU,4409
|
|
39
38
|
md2conf/drawio/render.py,sha256=veSu5gjm5ggLnmaH7uvH9qNeOygBJpqhSKK_LJs0QTk,8581
|
|
40
39
|
md2conf/mermaid/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
41
40
|
md2conf/mermaid/config.py,sha256=5Dec2QcdB_GtnuXIW6nhJK8J5caduNZU1oz1mcmmb44,376
|
|
42
41
|
md2conf/mermaid/extension.py,sha256=1drXVM_KbS00dcjSCRru0wwbil4zq3aR81dHMhfe7zA,4021
|
|
43
|
-
md2conf/mermaid/
|
|
42
|
+
md2conf/mermaid/puppeteer-config.json,sha256=-dMTAN_7kNTGbDlfXzApl0KJpAWna9YKZdwMKbpOb60,159
|
|
43
|
+
md2conf/mermaid/render.py,sha256=zO6M5UWSKiezoxPojD8iwFnwrFEDw_P6liQi-C3LQgw,1817
|
|
44
44
|
md2conf/mermaid/scanner.py,sha256=oIpaNxiZBNcmggnjlyYGcIVOXcYQWjf1lEVdyIwE4xE,1379
|
|
45
45
|
md2conf/plantuml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
46
|
md2conf/plantuml/config.py,sha256=j0ONhkzmAPagh00ltamTKlVEvXa6R284We9pDxRy-5U,378
|
|
47
|
-
md2conf/plantuml/extension.py,sha256
|
|
48
|
-
md2conf/plantuml/render.py,sha256=
|
|
47
|
+
md2conf/plantuml/extension.py,sha256=EQ-2O4d2cWBGcIHcFFXgaCNrfi357hS6IE_PsvwJ8_k,6256
|
|
48
|
+
md2conf/plantuml/render.py,sha256=Lf1It2KxHPKNGM1rhIDg9zdC3iqhRNCduByqa0_k_qw,3725
|
|
49
49
|
md2conf/plantuml/scanner.py,sha256=Oso6VbHVuMaPMKMazQc_bf4hhOT5WeJN5WiVPM8peyM,1347
|
|
50
|
-
markdown_to_confluence-0.5.
|
|
51
|
-
markdown_to_confluence-0.5.
|
|
52
|
-
markdown_to_confluence-0.5.
|
|
53
|
-
markdown_to_confluence-0.5.
|
|
54
|
-
markdown_to_confluence-0.5.
|
|
55
|
-
markdown_to_confluence-0.5.
|
|
50
|
+
markdown_to_confluence-0.5.4.dist-info/METADATA,sha256=bz_rRHiqV-EYCMcXCE9NMlUc8bk28SbFz9KO43YuW0E,45324
|
|
51
|
+
markdown_to_confluence-0.5.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
52
|
+
markdown_to_confluence-0.5.4.dist-info/entry_points.txt,sha256=F1zxa1wtEObtbHS-qp46330WVFLHdMnV2wQ-ZorRmX0,50
|
|
53
|
+
markdown_to_confluence-0.5.4.dist-info/top_level.txt,sha256=_FJfl_kHrHNidyjUOuS01ngu_jDsfc-ZjSocNRJnTzU,8
|
|
54
|
+
markdown_to_confluence-0.5.4.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
55
|
+
markdown_to_confluence-0.5.4.dist-info/RECORD,,
|
md2conf/__init__.py
CHANGED
|
@@ -5,7 +5,7 @@ Parses Markdown files, converts Markdown content into the Confluence Storage For
|
|
|
5
5
|
Confluence API endpoints to upload images and content.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
__version__ = "0.5.
|
|
8
|
+
__version__ = "0.5.4"
|
|
9
9
|
__author__ = "Levente Hunyadi"
|
|
10
10
|
__copyright__ = "Copyright 2022-2026, Levente Hunyadi"
|
|
11
11
|
__license__ = "MIT"
|