2
0
Fork 0

docs: rework the documentation structure

This commit is contained in:
Thomas Touhey 2023-12-06 01:50:59 +01:00
parent ba03eea1a7
commit 7eea91a2f6
30 changed files with 642 additions and 499 deletions

View File

@ -33,7 +33,8 @@ RUN \
&& /opt/build/venv/bin/python -m pip install -r requirements.txt
COPY ./docs ./docs
RUN /opt/build/venv/bin/sphinx-build -M html ./docs build
COPY ./textoutpc ./textoutpc
RUN /opt/build/venv/bin/sphinx-build -M html ./docs ./build
COPY ./textoutpc ./textoutpc
@ -52,7 +53,7 @@ COPY --chmod=644 ./docker/nginx.conf /etc/nginx/nginx.conf
WORKDIR /opt/app
COPY --from=venv /opt/app/venv ./venv
COPY --from=builder --chown=app:app /opt/build/textoutpc ./textoutpc
COPY --from=builder /opt/build/docs/_build/html /opt/app/docs
COPY --from=builder /opt/build/build/html /opt/app/docs
EXPOSE 80
ENTRYPOINT ["/usr/bin/supervisord"]

View File

@ -5,7 +5,7 @@
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= poetry run sphinx-build
SPHINXAUTOOPTS ?= --ignore "*.kate-swp" --watch ../teal
SPHINXAUTOOPTS ?= --ignore "*.kate-swp" --watch ../textoutpc
SPHINXAUTOBUILD ?= poetry run sphinx-autobuild
SOURCEDIR = .
BUILDDIR = _build

12
docs/_static/custom.css vendored Normal file
View File

@ -0,0 +1,12 @@
h1 img {
vertical-align: top;
width: 1.2em;
}
.sidebar-logo {
width: 80%;
}
.mermaid {
text-align: center;
}

BIN
docs/_static/favicon.ico vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
docs/_static/favicon.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

3
docs/_static/logo.svg vendored Normal file
View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg width="100mm" height="100mm" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><g><rect x="-8.8818e-16" width="100" height="100" rx="0" ry="0" fill="#d41b1b" fill-rule="evenodd" stop-color="#000000" style="-inkscape-stroke:none;font-variation-settings:normal"/><g transform="matrix(.77131 0 0 .77125 -4.4155 -4.2916)" fill="#010200" stroke-width=".26855"><path d="m23.34 47.054h10.792v3.6266h-6.0859v38.932h6.1338v3.6687h-10.799z"/><path d="m57.331 57.243c-3.2716 0.0083-6.5859 1.4745-8.6785 4.8845v-4.054h-4.8178l-0.02894 39.132h4.9175v-14.666c2.8171 5.9967 13.516 6.8136 17.724 0 4.034-4.4923 3.6414-16.258 0-20.412-1.7563-3.0307-5.4089-4.8939-9.1168-4.8845zm-0.53227 3.6892c3.8942 0.05861 7.6846 3.8282 7.6507 11.816l-0.03669 0.0021c0.44746 16.558-16.184 13.649-15.837 0.09405l-0.07751-0.09767c-0.1077-7.7344 4.1549-11.877 8.3003-11.815z"/><path d="m97.403 63.567v-4.3958c-4.5556-2.5005-11.634-2.4399-15.743 0-10.822 6.1621-7.2692 23.785 0 26.343 3.4301 2.3799 10.926 2.463 15.712 0v-4.3183c-5.5689 2.6456-10.107 2.6197-14.275 0-4.1953-4.1345-4.4833-12.201 0-17.704 5.4847-3.5059 9.9418-1.9449 14.306 0.07529z"/><path d="m105.67 50.712h5.9964v39.009h-6.0189v3.6557h10.8v-46.304h-10.754z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

9
docs/code.rst Normal file
View File

@ -0,0 +1,9 @@
Code reference
==============
This section presents the code reference, by Python module.
.. toctree::
:maxdepth: 1
code/textoutpc

16
docs/code/textoutpc.rst Normal file
View File

@ -0,0 +1,16 @@
``textoutpc`` -- main namespace for the project
===============================================
This section presents the code reference under the ``textoutpc`` namespace.
.. toctree::
:maxdepth: 1
textoutpc/builtin
textoutpc/demo
textoutpc/exceptions
textoutpc/html
textoutpc/lexer
textoutpc/nodes
textoutpc/parser
textoutpc/tags

View File

@ -0,0 +1,4 @@
``textoutpc.builtin`` -- built-in tags for textoutpc
====================================================
.. automodule:: textoutpc.builtin

View File

@ -0,0 +1,4 @@
``textoutpc.demo`` -- demonstration web app for textoutpc
=========================================================
.. automodule:: textoutpc.demo

View File

@ -0,0 +1,4 @@
``textoutpc.exceptions`` -- exceptions for textoutpc
====================================================
.. automodule:: textoutpc.exceptions

View File

@ -0,0 +1,4 @@
``textoutpc.html`` -- HTML writer for textoutpc
===============================================
.. automodule:: textoutpc.html

View File

@ -0,0 +1,4 @@
``textoutpc.lexer`` -- lexer for textoutpc
==========================================
.. automodule:: textoutpc.lexer

View File

@ -0,0 +1,4 @@
``textoutpc.nodes`` -- docutils nodes specific to textoutpc
===========================================================
.. automodule:: textoutpc.nodes

View File

@ -0,0 +1,4 @@
``textoutpc.parser`` -- docutils parser for textoutpc
=====================================================
.. automodule:: textoutpc.parser

View File

@ -0,0 +1,4 @@
``textoutpc.tags`` -- tag definitions for textoutpc
===================================================
.. automodule:: textoutpc.tags

View File

@ -37,6 +37,8 @@ exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
html_theme = "furo"
html_static_path = ["_static"]
html_title = f"textoutpc {version}"
html_favicon = "_static/favicon.png"
html_logo = "_static/logo.svg"
html_use_index = False
html_copy_source = False
html_show_sourcelink = False
@ -45,9 +47,7 @@ html_css_files = ["custom.css"]
intersphinx_mapping = {
"python": ("https://docs.python.org/3", None),
"fastapi": ("https://fastapi.tiangolo.com/", None),
"pydantic": ("https://docs.pydantic.dev/2.4/", None),
"sqlalchemy": ("https://docs.sqlalchemy.org/en/20/", None),
"docutils": ("https://sphinx-docutils.readthedocs.io/en/latest/", None),
}
todo_include_todos = True

5
docs/guides.rst Normal file
View File

@ -0,0 +1,5 @@
Guides
======
This section contains the guides, i.e. concrete steps to accomplish given
tasks with textoutpc.

View File

@ -1,31 +1,21 @@
Welcome to textoutpc's documentation!
=====================================
textoutpc |version|
===================
textoutpc is a BBcode markup language translator project for `Planète Casio`_.
This project is a set of docutils_ utilities for parsing and rendering the
`Planète Casio`_ flavour of BBCode.
BBcode has been invented in the 90s/2000s for bulletin board systems.
It has been implemented in `Planète Casio`_ during its first years (although
some research has to be made on how that choice was done…).
.. note::
On `Planète Casio`_, which is coded in PHP at the time I'm writing this,
we have our own custom version of BBcode, which we pass through an internal
utility named ``textout()``.
I, Thomas “Cakeisalie5” Touhey, rewrote it recently, and it works pretty well
while being secure, but as the next version of `Planète Casio`_ (the ”v5”)
will be written from scratch, I figured out I could rewrite the ``textout()``
utility in Python, and improve the language parsing to be more practical and
add features that are in the original BBcode markup language.
As this is a rewrite, the vulnerabilities and bug will not be common to this
project and the online version of the transcoder.
The flavour is named "textout", because that is the name of the original
function in the PHP code of the website.
.. toctree::
:maxdepth: 2
:caption: Contents:
:maxdepth: 2
language
usage
tags
guides
language
code
.. _docutils: https://www.docutils.org/
.. _BBCode: https://en.wikipedia.org/wiki/BBCode
.. _Planète Casio: https://www.planet-casio.com/Fr/

View File

@ -1,5 +1,5 @@
The textout BBcode markup language
==================================
Markup language reference
=========================
The BBcode markup language mainly uses tags, which the starting mark looks
like ``[xxx]`` and the ending mark looks like ``[/xxx]``. You can add an
@ -10,287 +10,8 @@ It cannot be used with all tags, so when it is used in the examples below,
suppose you can use it, otherwise, it might not be possible (or not
implemented yet).
--------------
Align the text
--------------
.. toctree::
To align the text, you can use either ``[<alignment mode>]`` or
``[align=<alignment mode>]`` with any of the following modes:
- ``left``: the text is left-aligned;
- ``right``: the text is right-aligned;
- ``center``: the text is aligned at the horizontal middle of the document;
- ``justify``: the text is justified, i.e. the text spaces are optimized for
the right'n'word to end at the right of the line.
For example, to right-align some text, you could do something like this:
.. code::
[right]some text[/]
----------------
Inserting titles
----------------
Do you want to include titles or subtitles to your message, integrated with
the website's design? Use the ``[title]`` and ``[subtitle]`` tags for that:
.. code::
[title]Just do it![/]
[subtitle]Don't let your dreams be dreams![/]
Notice that this tag cannot embed another tag.
----------------
Styling the text
----------------
You can add some basic text style by using the following tags:
- ``[b]`` for **bold** text;
- ``[i]`` for *italic* text;
- ``[u]`` for underlined text;
- ``[o]`` for overlined text;
- ``[s]`` or ``[strike]`` for striked text.
They can all be ended with the generic ending mark ``[/]``.
----------------------
Changing the text font
----------------------
You can change the font of the text by using the ``[font=xxx]`` (or ``[xxx]``
directly, where ``xxx`` represents the font identifier) tag. The following
fonts are available:
- ``arial`` represents Arial;
- ``comic`` represents Comic MS;
- ``tahoma`` represents Tahoma;
- ``courier`` represents Courier;
- ``haettenschweiler`` represents Haettenschweiler;
- ``mono`` and ``monospace`` represents the basic monospace font.
They can be ended with the generic ending mark ``[/]`` as well.
-----------------------
Changing the text color
-----------------------
You can change the color of the text using the ``[color=xxx]`` (or ``[xxx]``
directly for simple colors, where ``xxx`` represents the color) tag. This
tag accepts several types of values:
- simple color names (`inspired from CSS <CSS named colors_>`_) such as
``red``, ``blue``, ``green``, ``transparent``;
- color hex codes using a hash (``#``) followed by hex digits, e.g.
``#01020F``, where the first group of hex digits represents the
red component from 0 to 255, the second group of hex digits represents
the green component from 0 to 255, and the third group of hex digits
represents the blue component from 0 to 255.
Incomplete composites will be filled by zero on the left (e.g. ``#0000F``
is equivalent to ``#00000F``), invalid characters such as ``A`` will be
replaced by 0s;
- three hex digits codes using ``#`` followed by three hex digits, e.g.
``#123`` which will be translated to ``#112233``;
- ``rgb(<red>, <green>, <blue>)``, where the red, green and blue components
are represented using decimal digits and are between 0 and 255 included;
- ``rgba(<red>, <green>, <blue>, <alpha>)``, where the red, green and blue
components are expressed as said before and the alpha component is either
expressed as a percentage (e.g. ``12.34%``) or as a proportion between
``0.0`` and ``1.0``;
- ``hsl(<hue>, <saturation>, <light>)`` or
``hls(<hue>, <light>,<saturation>)``;
- ``hsl(<hue>, <saturation>, <light>, <alpha>)`` or
``hls(<hue>, <light>, <saturation>, <alpha>)``;
- ``hwb(<hue>, <white proportion>, <black proportion>)``.
Here are some examples:
.. code::
[blue]I'm blue![/]
[color=#ff69b4]That color is called “Cuisse de Nymphe émue”![/]
[color=rgb(255, 255,255,0.4)]I'm black![/]
[color=hsl(0,100%, 0.5)]I'm red![/]
--------------------
Inserting hyperlinks
--------------------
Creating hyperlinks on a bunch of text is possible through the ``[url]`` tag.
The URL has to be either absolute, relative, or related to an anchor. It has
to be passed to the tag either through the argument (which allows the content
to be the displayed title of the link) or through the content if there is
no argument. By default, if there is no content and an argument, the argument
will be taken as the link title.
Here are examples:
.. code::
[url]https://planet-casio.com[/]
[url=https://planet-casio.com]Planète Casio[/]
[url=/relative/url.html][/]
For links to profiles, the ``[profil]`` and ``[profile]`` tags can be used.
They take no attribute but take a content which is the user whose the profile
is to be linked's name. For example:
.. code::
[profil]Cakeisalie5[/]
For links to topics and tutorials, the ``[topic]`` and ``[tutorial]``
tags can be used. They take no attribute but take a content which is the
identifier of the topic or tutorial to which to link to.
For example:
.. code::
[topic]234[/]
[tutorial]32[/]
For links to programs, the ``[program]`` and ``[prog]`` tags can be used.
They take no attribute but take a content which is the identifier of the
program to which to link to. For example:
.. code::
[program]3598[/program]
---------------
Quoting someone
---------------
To quote someone visually, you can use the ``[quote]`` tag, which takes the
name of the person you're quoting as the attribute and the quote as the
content. A quote can contain another one, of course. If there is no name,
the display will just be generalistic.
Here are examples:
.. code::
[quote]Someone said that.[/]
[quote=Cakeisalie5]Ever realized that my name contained “Cake”?[/]
-------------------------
Spoilers/Content Warnings
-------------------------
To hide something behind a deliberate action of your user, usually to avoid
hurting people or to hide the solution to a problem, you can use the
``[spoiler]`` tag.
.. code::
[spoiler]This is hidden![/]
[spoiler=Uncover the dark secrets of the night]Boo![/]
[spoiler=Uncover this!|Cover this quick!!]BOOO![/]
---------------
Presenting code
---------------
There are two code tags:
- ``[code]``, which is supposed to be used as a block for multiline code or
to isolate the code from the text;
- ``[inlinecode]`` or the *backquotes* to include code in the text.
For example:
.. code::
[code]Some multiline code, with [center]tags shown as they are[/center].
Incredible, heh?[/code]
[inlinecode]Some inline code.[/inlinecode]
`Some more inline code.`
------------------
Inserting an image
------------------
In order to insert an image, you will have to use the ``[img]`` tag. It will
make a new paragraph containing the image which the URL is given in the
tag content. The tag can be bundled with some attributes, separated with
the pipe (``|``) character:
- ``<width>x<height>``: set the dimensions to the image. If the width isn't
given (i.e. if this attribute starts with ``x``), the height will be set
automatically. If the height isn't given (i.e. no ``x`` or nothing after
the ``x``), the width will be set automatically;
- ``left``, ``right``, ``center``: align the image accordingly;
- ``float``: make the image float, i.e. let the text be where the image isn't.
For example:
.. code::
[img=right|float|x24]https://example.org/image.jpg[/]
is a right-aligned image, floating (which means text will be allowed on
the left of the image), and with a height of 24 pixels and an automatic
width.
Planète Casio admins can use the ``[adimg]`` tag which is equivalent to the
``[img]`` tag but adds the special admin image folder prefix to the image
URLs, so this is possible:
.. code::
[adimg]incredible.jpg[/]
-----------------
Inserting a video
-----------------
This BBcode translator has the ability to integrate videos from some online
platforms into your message, as a block. To do this, you can use the
``[video]`` and ``[video tiny]`` tags. For example:
.. code::
[video]https://www.youtube.com/watch?v=yhXpV8hRKxQ[/]
[video tiny]https://www.youtube.com/watch?v=yhXpV8hRKxQ[/]
------------------------
Inserting a progress bar
------------------------
Do you want to present how your project is evolving using a simple graph,
the progress bar? This is possible using the ``[progress]`` tag, which takes
the percentage (between 0 and 100 included) of the advancement as its
attribute. For example:
.. code::
[progress=50]Building a great wall…[/]
[progress=100][/]
----------------------------
Inserting labels and targets
----------------------------
Is your message in several parts and you only want to link one without using
an entire separate page for the section? This is the tag you might want
to use. To link to a point in your message:
- first, define the label using the ``[label]`` tag, with the name of the
label as the attribute;
- then link to the label using the ``[target]`` tag.
You are not obliged to terminate the ``[label]`` tag (the original version of
it didn't support the ``[label]`` tag termination, in fact). For example:
.. code::
[label=sometag][subtitle]Some chapter[/subtitle]
...
[target=sometag]Go back to the beginning of the chapter[/]
.. _CSS named colors: https://drafts.csswg.org/css-color/#named-colors
language/document
language/style
language/multimedia

View File

@ -0,0 +1,84 @@
Document structure
==================
These tags can be used to represent the document structure.
.. _markup-title:
Titles and subtitles
--------------------
In order to represent titles and subtitles integrated with the website's
design, the ``[title]`` and ``[subtitles]`` tags can be used::
[title]Just do it![/]
[subtitle]Don't let your dreams be dreams![/]
.. note::
These tags cannot embed other tags.
.. _markup-label:
Labels and targets
------------------
Internal references can be defined using labels and targets:
* Labels place an anchor on a part of the message. They are defined using
the ``[label=<your label>]`` tag.
* Targets make a link to a label in another part of the message. They are
defined using the ``[target=<your label>]`` tag.
.. note::
The ``[label]`` tag does not need to be terminated; in fact, the original
version of the tag did not support termination.
An example usage of these tags is the following::
[label=sometag][subtitle]Some chapter[/subtitle]
...
[target=sometag]Go back to the beginning of the chapter[/]
.. _markup-url:
Hyperlinks
----------
Hyperlinks, i.e. reference to other documents available on the World Wide Web,
can be inserted using the ``[url]`` tag. The URL can be provided:
* As the tag value, e.g. ``[url=https://example.org/]My name[/url]``.
This is mostly useful in order to place a label.
* As the tag contents, e.g. ``[url]https://example.org/[/url]``.
The URL itself can be either absolute, relative, or related to an anchor.
Example uses are the following::
[url]https://planet-casio.com[/]
[url=https://planet-casio.com]Planète Casio[/]
[url=/relative/url.html][/]
For links to profiles, the ``[profil]`` and ``[profile]`` tags can be used.
They take no attribute but take a content which is the user whose the profile
is to be linked's name. For example::
[profil]Cakeisalie5[/]
For links to topics and tutorials, the ``[topic]`` and ``[tutorial]``
tags can be used. They take no attribute but take a content which is the
identifier of the topic or tutorial to which to link to.
For example::
[topic]234[/]
[tutorial]32[/]
For links to programs, the ``[program]`` and ``[prog]`` tags can be used.
They take no attribute but take a content which is the identifier of the
program to which to link to. For example::
[program]3598[/program]

View File

@ -0,0 +1,103 @@
Multimedia elements
===================
The following tags can be used to add complex elements.
.. _markup-quote:
Quotes
------
To quote someone visually, one can use the ``[quote]`` tag.
This tag takes an optional value being the person or entity being quoted.
Some examples are::
[quote]Someone said that.[/]
[quote=Cakeisalie5]Ever realized that my name contained “Cake”?[/]
.. _markup-code:
Code blocks or spans
--------------------
There are two tags suitable for presenting code:
``[code]``
Block to present multiline code or isolate the code from the text.
``[inlinecode]`` *(or backquotes)*
Inline code markup.
Example uses are::
[code]Some multiline code, with [center]tags shown as they are[/center].
Incredible, heh?[/code]
[inlinecode]Some inline code.[/inlinecode]
`Some more inline code.`
.. _markup-image:
Images
------
In order to insert an image, the ``[img]`` tag can be used.
It will make a new paragraph containing the image which the URL is given in the
tag content. The tag can be bundled with some attributes, separated with
the pipe (``|``) character:
* ``<width>x<height>``: set the dimensions to the image. If the width isn't
given (i.e. if this attribute starts with ``x``), the height will be set
automatically. If the height isn't given (i.e. no ``x`` or nothing after
the ``x``), the width will be set automatically;
* ``left``, ``right``, ``center``: align the image accordingly;
* ``float``: make the image float, i.e. let the text be where the image isn't.
The following example is a right-aligned image, floating (which means text
will be allowed on the left of the image), and with a height of 24 pixels and
an automatic width::
[img=right|float|x24]https://example.org/image.jpg[/]
Planète Casio administrators can use the ``[adimg]`` tag which is equivalent to
the ``[img]`` tag but adds the special admin image folder prefix to the image
URLs, so this is possible::
[adimg]incredible.jpg[/]
Videos
------
Videos can be inserted as blocks using the ``[video]`` or ``[video tiny]``
tag. For example::
[video]https://www.youtube.com/watch?v=yhXpV8hRKxQ[/]
[video tiny]https://www.youtube.com/watch?v=yhXpV8hRKxQ[/]
.. _markup-progress-bar:
Progress bars
-------------
In order to insert a progress bar, the ``[progress]`` tag can be used.
This tag takes an integer value between 0 and 100 included representing
the advancement.
For example::
[progress=50]Building a great wall…[/]
[progress=100][/]
.. _markup-spoiler:
Spoilers / Content Warnings
---------------------------
In order to hide something behind a deliberate action of the user,
the ``[spoiler]`` tag can be used.
For example::
[spoiler]This is hidden![/]
[spoiler=Uncover the dark secrets of the night]Boo![/]
[spoiler=Uncover this!|Cover this quick!!]BOOO![/]

145
docs/language/style.rst Normal file
View File

@ -0,0 +1,145 @@
Text styling
============
The following tags can be used to style the textual content of the messages.
.. _markup-align:
Alignment
---------
In order to align text, one can either use ``[<alignment mode>]`` or
``[align=<alignment mode>]`` with any of the following modes:
``left``
The text is left-aligned.
``right``
The text is right-aligned.
``center``
The text is aligned at the horizontal middle of the document;
``justify``
The text is justified, i.e. the text spaces are optimized for
the right'n'word to end at the right of the line.
For example, to right-align some text, one can do the following::
[right]some text[/]
[align=right]some more text[/]
.. _markup-strong:
Font weight
-----------
In order to have text with more weight, the ``[b]`` tag can be used.
For example::
[b]Some bold text[/]
.. _markup-italic:
Font style
----------
In order to set the font as italic, the ``[i]`` tag can be used.
For example::
[i]Some italic text[/]
.. _markup-decoration:
Font decoration
---------------
The following decorations can be applied to text using the following tags:
``[u]``
The text will be underlined.
``[o]``
The text will be overlined.
``[s]`` or ``[strike]``
The text will have a line through.
For example::
[u]This text is underlined.[/]
[o]This text is overlined.[/]
[s]This text is striked through.[/]
.. _markup-font:
Text font
---------
The text font can be set using the ``[font=xxx]`` (or ``[xxx]``
directly, where ``xxx`` represents the font identifier) tag.
The following fonts are available:
``arial``
Arial.
``comic``
Comic MS.
``tahoma``
Tahoma.
``courier``
Courier.
``haettenschweiler``
Haettenschweiler.
``mono`` or ``monospace``
Monospace.
For example::
[comic]This text is in comic font![/]
.. _markup-color:
Text color
----------
The color of the text can be set using the ``[color=xxx]`` (or ``[xxx]``
directly for simple colors, where ``xxx`` represents the color) tag. This
tag accepts several types of values:
- Simple color names (`inspired from CSS <CSS named colors_>`_) such as
``red``, ``blue``, ``green``, ``transparent``;
- Color hex codes using a hash (``#``) followed by hex digits, e.g.
``#01020F``, where the first group of hex digits represents the
red component from 0 to 255, the second group of hex digits represents
the green component from 0 to 255, and the third group of hex digits
represents the blue component from 0 to 255.
Incomplete composites will be filled by zero on the left (e.g. ``#0000F``
is equivalent to ``#00000F``), invalid characters such as ``A`` will be
replaced by 0s;
- Three hex digits codes using ``#`` followed by three hex digits, e.g.
``#123`` which will be translated to ``#112233``;
- ``rgb(<red>, <green>, <blue>)``, where the red, green and blue components
are represented using decimal digits and are between 0 and 255 included;
- ``rgba(<red>, <green>, <blue>, <alpha>)``, where the red, green and blue
components are expressed as said before and the alpha component is either
expressed as a percentage (e.g. ``12.34%``) or as a proportion between
``0.0`` and ``1.0``;
- ``hsl(<hue>, <saturation>, <light>)`` or
``hls(<hue>, <light>,<saturation>)``;
- ``hsl(<hue>, <saturation>, <light>, <alpha>)`` or
``hls(<hue>, <light>, <saturation>, <alpha>)``;
- ``hwb(<hue>, <white proportion>, <black proportion>)``.
Some examples are::
[blue]I'm blue![/]
[color=#ff69b4]That color is called “Cuisse de Nymphe émue”![/]
[color=rgb(255, 255,255,0.4)]I'm black![/]
[color=hsl(0,100%, 0.5)]I'm red![/]
.. _CSS named colors: https://drafts.csswg.org/css-color/#named-colors

View File

@ -1,124 +0,0 @@
Defining tags for textoutpc
===========================
A tag is a class defined in the ``textoutpc.Tags`` submodule and referenced
in the `_tags` array in ``textoutpc.Tags.__init__``. It usually takes a name
that starts with ``Textout`` and an uppercase character, and finishes by
``Tag``, and shall inherit one of the base classes defined in
``textoutpc.Tags.__base__`` depending on how the tag will be used:
- ``TextoutInlineTag``: tag to be used inside a paragraph,
e.g. text formatting;
- ``TextoutBlockTag``: tag to be used at paragraph level, e.g. video.
There are a few public members you can define as a tag:
- ``aliases``: the array of names this tag can be accessed as.
Basic tags (the ones with brackets ``[]``) are defined as ``[<name>]``
(e.g. ``[hello]``) and special characters are defined with their symbol,
e.g. `````;
- ``raw``: the tag's content shall not be interpreted, which is generally
only useful when the content is preprocessed (see below). The default
is ``False`` if there is no preprocess method, and `True` otherwise;
- ``noinline``: for raw tags, forbid inline tags (declared outside of the
tag) within the tag (*only works with ``raw = True``*!);
- ``generic``: the tag can be ended using the generic tag ending mark ``[/]``.
It is defined as ``True`` by default for all tags;
- ``notempty``: ignore the tag when its content is empty. By default, this
value is `False`;
- ``superblock``: is a super-block (for blocks) which means it adds a block
level, and adds a paragraph tag implicitely;
- ``inlined``: if is a block, transforms automatically the surrounding block
into a superblock while it's there;
- ``procvalue``: process the value as normal text before passing it;
- ``not_within_itself``: make that if a tag is opened within itself (depth
included), the tag above and all tags below are closed first;
- ``only_in``: allow the tag to only be beneath certain tags;
- ``allowed_tags``: allowed tags right beneath the current one;
- ``no_text``: disable raw text within the tag;
- ``expect_child``: make that all content below (without depth) that isn't
within the specified tags is ignored.
So for example, if I want to make the inline tag ``[hello]`` as an example,
with the alternate name ``[hai]``, I'd start off by writing:
.. code-block:: python
from textoutpc import InlineTag as _InlineTag
class TextoutHelloTag(_InlineTag):
""" The [hello] tag, which does things.
Example uses:
[hello]world[/hello]
[hai=something]world[/hai] """
aliases = ('[hello]', '[hai]')
# ...
---------------------
Getting the arguments
---------------------
There are two methods the tag can define to get various parts of the user
input:
- ``prepare(name, value)``: the tag has been called, but the content has not
yet been read — this method uses the name and the value to define the tag's
behaviour. By default, when prepared, the tag does nothing;
- ``preprocess(content)``: the content has been read and the tag wants to know
about it — this method uses the content to define the tag's behaviour.
By default, the tag prints its content while reading it (instead of
storing it for this method);
- ``default()``: the content is empty and the tag wants to know about it (this
method is only called when ``preprocess()`` is not defined).
Both methods can raise an exception (whatever the exception is) if the tag
is called with invalid arguments; when this is the case, the tag is just
printed as is, e.g. in ``[color=;;]test[/color]``, the ``TextoutColorTag``
will return an exception at preparation, and the tag will be printed as is.
The ``prepare()`` and ``preprocess()`` method can be defined for given output
types (languages, e.g. ``html`` or ``lightscript``) by setting up
``<action>_<output type>()``-like methods. The ``preprocess()`` methods can
also be defined dynamically by the ``prepare()`` methods, as their existence
is checked after the preparation.
It is recommended to only use the ``preprocess()`` method when the tag is a
raw tag, and not to check if the content is empty or not, as the ``default()``
method is here to test this.
If the ``preprocess()`` method returns a modified content, this content will
be used instead of the original one (and will be escaped for output languages
such as HTML).
-----------------------
Defining the tag output
-----------------------
For each output type, there are three output methods the tag can define:
- ``begin()``: output what comes before the content, e.g. ``<b>``;
- ``content()``: output what comes instead of content, e.g. ``hello``;
- ``end()``: output what comes after the content, e.g. ``</b>``.
These methods are **not supposed** to modify any (not even internal) members
or methods, they are just supposed to output, although you can define
variables in ``begin()`` to be used in ``end()``.
As for ``prepare()`` and ``preprocess()``, these output methods can be defined
for given output types by appending ``_<output type>`` to the name, e.g.
``begin_html()``. They can also be defined dynamically by the ``prepare()``
and ``preprocess()`` methods.
A ``content()`` method without a ``preprocess()`` means that the content of
the tag in the user input will be ignored.
-------------------------------------
Defining internal members and methods
-------------------------------------
For all members and methods specific to the tag objects (except the ones
presented previously), it is recommended to use an underscore before the
name of the member or method, e.g. ``self._bold``.

View File

@ -1,56 +0,0 @@
Using textoutpc
===============
To use this module, simply use the ``to<language>()`` functions once imported:
.. code-block:: python
#!/usr/bin/env python3
import textoutpc
text = "Hello, [i]beautiful [b]world[/i]!"
print(textoutpc.tohtml(text))
print("---")
print(textoutpc.tolightscript(text))
The supported output types are:
- ``html``: `HTML`_ compatible output, requiring some additional style and
script;
- ``lightscript``: `Lightscript`_ Markdown-like language. See
`the Lightscript topic on Planète Casio <Lightscript topic_>`_ for
more information.
The ``tohtml()`` and ``tolightscript()`` can take additional keywords that
tags can read so that they can adapt their behaviour. The name of the tweaks
are case-insensitive and non-alphanumeric characters are ignored: for example,
``label_prefix``, ``LABELPREFIX`` and ``__LaBeL___PRE_FIX__`` are all
equivalent.
The following tweaks are read by the translator and built-in tags:
- ``inline``: if ``True``, only use inline tags, not blocks (for inline
contexts such as instant messaging or one-line comments).
- ``label_prefix`` (HTML): prefix to be used by the ``[label]`` and
``[target]`` tags, e.g. ``msg45529-``. Defaults to `""` for PCv42
compatibility;
- ``obsolete_tags`` (HTML): use obsolete HTML tags for old browsers
(e.g. lynx) compatibility, e.g. ``<b>``, ``<i>``, ``<center>``, and
others. Defaults to ``True``.
- ``title_level`` (HTML): level at which to start for titles and subtitles,
e.g. 5 means ``h5`` for ``h5`` for titles and ``h6`` for subtitles.
- ``link_target`` (HTML): either ``self`` (default, load in the same
frame as it was clicked) or ``blank`` (load in an other window).
An example call would be:
.. code-block:: python
#!/usr/bin/env python3
import textoutpc
print(textoutpc.tohtml("Hello, [i]beautiful[/i]!", obsolete__TAGS=False))
.. _HTML: https://www.w3.org/html/
.. _Lightscript: https://git.planet-casio.com/lephe/lightscript
.. _Lightscript topic: https://planet-casio.com/Fr/forums/lecture_sujet.php?id=15022

67
poetry.lock generated
View File

@ -512,6 +512,21 @@ files = [
{file = "jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc"},
]
[[package]]
name = "livereload"
version = "2.6.3"
description = "Python LiveReload is an awesome tool for web developers"
optional = false
python-versions = "*"
files = [
{file = "livereload-2.6.3-py2.py3-none-any.whl", hash = "sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4"},
{file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"},
]
[package.dependencies]
six = "*"
tornado = {version = "*", markers = "python_version > \"2.7\""}
[[package]]
name = "markupsafe"
version = "2.1.3"
@ -941,6 +956,17 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments
testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
[[package]]
name = "six"
version = "1.16.0"
description = "Python 2 and 3 compatibility utilities"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
files = [
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
]
[[package]]
name = "snowballstemmer"
version = "2.2.0"
@ -998,6 +1024,25 @@ docs = ["sphinxcontrib-websupport"]
lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"]
test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"]
[[package]]
name = "sphinx-autobuild"
version = "2021.3.14"
description = "Rebuild Sphinx documentation on changes, with live-reload in the browser."
optional = false
python-versions = ">=3.6"
files = [
{file = "sphinx-autobuild-2021.3.14.tar.gz", hash = "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05"},
{file = "sphinx_autobuild-2021.3.14-py3-none-any.whl", hash = "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac"},
]
[package.dependencies]
colorama = "*"
livereload = "*"
sphinx = "*"
[package.extras]
test = ["pytest", "pytest-cov"]
[[package]]
name = "sphinx-basic-ng"
version = "1.0.0b2"
@ -1147,6 +1192,26 @@ files = [
{file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
]
[[package]]
name = "tornado"
version = "6.4"
description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
optional = false
python-versions = ">= 3.8"
files = [
{file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"},
{file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"},
{file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"},
{file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"},
{file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"},
{file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"},
{file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"},
{file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"},
{file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"},
{file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"},
{file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"},
]
[[package]]
name = "typing-extensions"
version = "4.8.0"
@ -1240,4 +1305,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p
[metadata]
lock-version = "2.0"
python-versions = "^3.8"
content-hash = "f53e8a48b99a511dc9abb02f191abf24ee1617baae006fa8128bb25d2d6c8b73"
content-hash = "0529ac8bca1629d40f672d31f3c24764e58437ed80e3f092837769e18f0d86f7"

View File

@ -38,6 +38,7 @@ typing-extensions = "^4.8.0"
pre-commit = "^3.3.3"
pytest = "^7.4.3"
pytest-cov = "^4.1.0"
sphinx-autobuild = "^2021.3.14"
[tool.poetry.group.deployment.dependencies]
gunicorn = "^21.2.0"
@ -99,6 +100,7 @@ rst-roles = [
"py:meth",
"py:exc",
"py:mod",
"ref",
]
rst-directives = ["py:data", "doctest"]

View File

@ -17,13 +17,16 @@ from docutils.nodes import (
Node,
Element,
Text,
citation,
container,
emphasis,
image,
literal,
reference,
strong,
subtitle,
target,
title,
)
from thcolor.colors import Color
from thcolor.errors import ColorExpressionSyntaxError
@ -59,6 +62,64 @@ FONT_NAMES: dict[str, str] = {
}
class TitleTag(RawTag):
"""Title tag.
Example uses::
[title]Example title[/]
See :ref:`markup-title` for more information.
"""
__slots__ = ()
def validate(self) -> None:
"""Validate the name and value for this tag.
:raises TagValidationError: The name and value combination is invalid.
"""
if self.value is not None:
raise UnexpectedValue()
def process(self, *, children: Sequence[Node]) -> Iterator[Node]:
"""Process the tag with children to build document nodes.
:param children: The children to process.
:return: The produced nodes.
"""
yield title("", children)
class SubtitleTag(RawTag):
"""Subtitle tag.
Example uses::
[subtitle]Example subtitle[/]
See :ref:`markup-title` for more information.
"""
__slots__ = ()
def validate(self) -> None:
"""Validate the name and value for this tag.
:raises TagValidationError: The name and value combination is invalid.
"""
if self.value is not None:
raise UnexpectedValue()
def process(self, *, children: Sequence[Node]) -> Iterator[Node]:
"""Process the tag with children to build document nodes.
:param children: The children to process.
:return: The produced nodes.
"""
yield subtitle("", children)
class TextTag(Tag):
"""Main tag for setting text formatting.
@ -76,10 +137,18 @@ class TextTag(Tag):
[color=rgb(255, 255, 255, 0.4)]BLACKNESS[/color]
[color=hsl(0, 100%, 0.5)]This will be red.[/color]
Also supports a hack used on Planète Casio for a while, which
is a CSS injection, e.g.:
Also supports a hack used on Planète Casio for a while, which
is a CSS injection, e.g.::
[color=brown; size: 16pt]Hello world![/color]
See the following sections for more information:
* :ref:`markup-strong`
* :ref:`markup-italic`
* :ref:`markup-decoration`
* :ref:`markup-font`
* :ref:`markup-color`
"""
__slots__ = (
@ -333,17 +402,23 @@ class AlignTag(Tag):
[align=center]This text is centered horizontally.[/align]
[justify]This text is justified.[/justify]
See :ref:`markup-align` for more information.
"""
__slots__ = ("kind",)
ALIGN_KEYS = {
ALIGN_KEYS: dict[str, Literal["center", "left", "right", "justify"]] = {
"center": "center",
"centre": "center",
"left": "left",
"right": "right",
"justify": "justify",
}
"""Alignment keys recognized as tags or tag values."""
kind: Literal["center", "left", "right", "justify"]
"""Kind of alignment."""
def validate(self) -> None:
"""Validate the name and value for this tag.
@ -390,6 +465,34 @@ class AlignTag(Tag):
yield div
class QuoteTag(Tag):
"""Tag for presenting a quote.
Example uses::
[quote]Someone said that.[/]
[quote=Cakeisalie5]Ever realized that my name contained Cake?[/]
See :ref:`markup-quote` for more information.
"""
__slots__ = ()
def process(self, *, children: Sequence[Node]) -> Iterator[Node]:
"""Process the tag with children to build document nodes.
:param children: The children to process.
:return: The produced nodes.
"""
if self.value is not None:
children = [
strong("", emphasis("", f"{self.value} a écrit :")),
*children,
]
yield citation("", *children)
class CodeTag(RawTag):
"""Basic code tag, for displaying code.
@ -399,6 +502,8 @@ class CodeTag(RawTag):
{
printf("hello, world");
}[/code]
See :ref:`markup-code` for more information.
"""
__slots__ = ()
@ -425,6 +530,8 @@ class InlineCodeTag(RawTag):
`some inline code`
[inlinecode][b]The tags will be shown verbatim.[/b][/inlinecode]
[inlinecode][inlinecode][i]This also[/inlinecode] works![/inlinecode]
See :ref:`markup-code` for more information.
"""
__slots__ = ()
@ -472,6 +579,8 @@ class ImageTag(RawTag):
[img=12x24]picture_url[/img]
[img=center|12x24]picture_url[/img]
[img=x24|right]picture_url[/img]
See :ref:`markup-image` for more information.
"""
__slots__ = ("width", "height", "alignment", "floating")
@ -610,6 +719,8 @@ class AdminImageTag(ImageTag):
[adimg=12x24]some_picture.png[/img]
[adimg=center|12x24]some_picture.png[/img]
[adimg=x24|right]some_picture.png[/img]
See :ref:`markup-image` for more information.
"""
__slots__ = ()
@ -632,6 +743,8 @@ class LabelTag(Tag):
[label=installation]Installation de tel logiciel... (no ending req.)
[label=compilation][/label] Compilation de tel logiciel...
See :ref:`markup-label` for more information.
"""
__slots__ = ()
@ -660,6 +773,8 @@ class TargetTag(Tag):
Example uses::
[target=installation]Check out the installation manual[/target]!
See :ref:`markup-label` for more information.
"""
__slots__ = ()
@ -694,6 +809,8 @@ class LinkTag(Tag):
[url=https://example.org/hi]Go to example.org[/url]!
[url=/Fr/index.php][/url]
[url]https://random.org/randomize.php[/url]
See :ref:`markup-url` for more information.
"""
__slots__ = ("url",)
@ -760,6 +877,8 @@ class ProfileTag(LinkTag):
Example uses::
[profil]Cakeisalie5[/]
See :ref:`markup-url` for more information.
"""
__slots__ = ()
@ -798,6 +917,8 @@ class TopicTag(LinkTag):
Example uses::
[topic]234[/]
See :ref:`markup-url` for more information.
"""
__slots__ = ()
@ -835,6 +956,8 @@ class TutorialTag(LinkTag):
Example uses::
[tutorial]71[/]
See :ref:`markup-url` for more information.
"""
__slots__ = ()
@ -872,6 +995,8 @@ class ProgramTag(LinkTag):
Example uses::
[program]3598[/]
See :ref:`markup-url` for more information.
"""
__slots__ = ()
@ -909,6 +1034,8 @@ class ProgressTag(Tag):
[progress=50]My great progress bar[/progress]
[progress=100][/progress]
See :ref:`markup-progress-bar` for more information.
"""
__slots__ = ("progress_value",)
@ -1026,6 +1153,8 @@ class SpoilerTag(Tag):
[spoiler=Y a quelque chose de caché !|Ah, bah en fait non :)]:E
And it's multiline, [big]and formatted[/big], as usual :D[/spoiler]
See :ref:`markup-spoiler` for more information.
"""
__slots__ = ("_closed_title", "_opened_title")

View File

@ -29,6 +29,7 @@ app = Flask(
template_folder=STATIC_PATH / "templates",
static_folder=STATIC_PATH / "static",
)
"""WSGI application for the textoutpc demonstration."""
assets = AssetsEnvironment(app)
assets.register(

View File

@ -23,10 +23,13 @@ from .builtin import (
NoEvalTag,
ProfileTag,
ProgressTag,
QuoteTag,
RotTag,
SpoilerTag,
SubtitleTag,
TargetTag,
TextTag,
TitleTag,
)
from .exceptions import TagValidationError
from .lexer import (
@ -43,7 +46,6 @@ from .tags import Tag
BUILTIN_TAGS = {
# TODO: Add the [calc] BBCode tag.
# TODO: Add the [quote] BBCode tag.
# TODO: Add the [indent] BBCode tag.
# TODO: Add the [list] and [li] BBCode tags.
# TODO: Add the [table], [tr], [td] and [th] BBCode tags.
@ -79,6 +81,7 @@ BUILTIN_TAGS = {
"[profile]": ProfileTag,
"[progress]": ProgressTag,
"[purple]": TextTag,
"[quote]": QuoteTag,
"[red]": TextTag,
"[rot]": RotTag,
"[rot13]": RotTag,
@ -87,8 +90,10 @@ BUILTIN_TAGS = {
"[small]": TextTag,
"[spoiler]": SpoilerTag,
"[strike]": TextTag,
"[subtitle]": SubtitleTag,
"[tahoma]": TextTag,
"[target]": TargetTag,
"[title]": TitleTag,
"[u]": TextTag,
"[url]": LinkTag,
"[yellow]": TextTag,