css-inline


Namecss-inline JSON
Version 0.16.0 PyPI version JSON
download
home_pageNone
SummaryHigh-performance library for inlining CSS into HTML 'style' attributes
upload_time2025-07-16 21:54:38
maintainerNone
docs_urlNone
authorDmitry Dygalo <dmitry@dygalo.dev>
requires_python>=3.9
licenseNone
keywords css html email stylesheet inlining
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # css_inline

[<img alt="build status" src="https://img.shields.io/github/actions/workflow/status/Stranger6667/css-inline/build.yml?style=flat-square&labelColor=555555&logo=github" height="20">](https://github.com/Stranger6667/css-inline/actions/workflows/build.yml)
[<img alt="pypi" src="https://img.shields.io/pypi/v/css_inline.svg?style=flat-square" height="20">](https://pypi.org/project/css_inline/)
[<img alt="versions" src="https://img.shields.io/pypi/pyversions/css_inline.svg?style=flat-square" height="20">](https://pypi.org/project/css_inline/)
[<img alt="license" src="https://img.shields.io/pypi/l/css_inline.svg?style=flat-square" height="20">](https://opensource.org/licenses/MIT)
[<img alt="codecov.io" src="https://img.shields.io/codecov/c/gh/Stranger6667/css-inline?logo=codecov&style=flat-square&token=tOzvV4kDY0" height="20">](https://app.codecov.io/github/Stranger6667/css-inline)
[<img alt="gitter" src="https://img.shields.io/gitter/room/Stranger6667/css-inline?style=flat-square" height="20">](https://gitter.im/Stranger6667/css-inline)

`css_inline` is a high-performance library for inlining CSS into HTML 'style' attributes.

This library is designed for scenarios such as preparing HTML emails or embedding HTML into third-party web pages.

For instance, the library transforms HTML like this:

```html
<html>
  <head>
    <style>h1 { color:blue; }</style>
  </head>
  <body>
    <h1>Big Text</h1>
  </body>
</html>
```

into:

```html
<html>
  <head></head>
  <body>
    <h1 style="color:blue;">Big Text</h1>
  </body>
</html>
```

- Uses reliable components from Mozilla's Servo project
- 10-400x faster than alternatives
- Inlines CSS from `style` and `link` tags
- Removes `style` and `link` tags
- Resolves external stylesheets (including local files)
- Optionally caches external stylesheets
- Can process multiple documents in parallel
- Works on Linux, Windows, macOS and in the browser via PyOdide
- Supports HTML5 & CSS3
- Tested on CPython 3.9, 3.10, 3.11, 3.12, 3.13 and PyPy 3.9, 3.10.

## Playground

If you'd like to try `css-inline`, you can check the WebAssembly-powered [playground](https://css-inline.org/) to see the results instantly.

## Installation

Install with `pip`:

```shell
pip install css_inline
```

Pre-compiled wheels are available for most popular platforms.
If not available for your platform, a Rust compiler will be needed to build this package from source. Rust version 1.65 or higher is required.

## Usage

```python
import css_inline

HTML = """<html>
<head>
    <style>h1 { color:blue; }</style>
</head>
<body>
    <h1>Big Text</h1>
</body>
</html>"""

inlined = css_inline.inline(HTML)
# HTML becomes this:
#
# <html>
# <head>
#    <style>h1 { color:blue; }</style>
# </head>
# <body>
#     <h1 style="color:blue;">Big Text</h1>
# </body>
# </html>
```

Note that `css-inline` automatically adds missing `html` and `body` tags, so the output is a valid HTML document.

Alternatively, you can inline CSS into an HTML fragment, preserving the original structure:

```python
FRAGMENT = """<main>
<h1>Hello</h1>
<section>
<p>who am i</p>
</section>
</main>"""

CSS = """
p {
    color: red;
}

h1 {
    color: blue;
}
"""

inlined = css_inline.inline_fragment(FRAGMENT, CSS)
# HTML becomes this:
# <main>
# <h1 style="color: blue;">Hello</h1>
# <section>
# <p style="color: red;">who am i</p>
# </section>
# </main>
```

When there is a need to inline multiple HTML documents simultaneously, `css_inline` offers `inline_many` and `inline_many_fragments` functions.
This feature allows for concurrent processing of several inputs, significantly improving performance when dealing with a large number of documents.

```python
import css_inline

css_inline.inline_many(["<...>", "<...>"])
```

Under the hood, `inline_many`, spawns threads at the Rust layer to handle the parallel processing of inputs.
This results in faster execution times compared to employing parallel processing techniques at the Python level.

**Note**: To fully benefit from `inline_many`, you should run your application on a multicore machine.

### Configuration

For configuration options use the `CSSInliner` class:

```python
import css_inline

inliner = css_inline.CSSInliner(keep_style_tags=True)
inliner.inline("...")
```

- `inline_style_tags`. Specifies whether to inline CSS from "style" tags. Default: `True`
- `keep_style_tags`. Specifies whether to keep "style" tags after inlining. Default: `False`
- `keep_link_tags`. Specifies whether to keep "link" tags after inlining. Default: `False`
- `base_url`. The base URL used to resolve relative URLs. If you'd like to load stylesheets from your filesystem, use the `file://` scheme. Default: `None`
- `load_remote_stylesheets`. Specifies whether remote stylesheets should be loaded. Default: `True`
- `cache`. Specifies caching options for external stylesheets (for example, `StylesheetCache(size=5)`). Default: `None`
- `extra_css`. Extra CSS to be inlined. Default: `None`
- `preallocate_node_capacity`. **Advanced**. Preallocates capacity for HTML nodes during parsing. This can improve performance when you have an estimate of the number of nodes in your HTML document. Default: `32`

You can also skip CSS inlining for an HTML tag by adding the `data-css-inline="ignore"` attribute to it:

```html
<head>
  <style>h1 { color:blue; }</style>
</head>
<body>
  <!-- The tag below won't receive additional styles -->
  <h1 data-css-inline="ignore">Big Text</h1>
</body>
```

The `data-css-inline="ignore"` attribute also allows you to skip `link` and `style` tags:

```html
<head>
  <!-- Styles below are ignored -->
  <style data-css-inline="ignore">h1 { color:blue; }</style>
</head>
<body>
  <h1>Big Text</h1>
</body>
```

Alternatively, you may keep `style` from being removed by using the `data-css-inline="keep"` attribute.
This is useful if you want to keep `@media` queries for responsive emails in separate `style` tags:

```html
<head>
  <!-- Styles below are not removed -->
  <style data-css-inline="keep">h1 { color:blue; }</style>
</head>
<body>
  <h1>Big Text</h1>
</body>
```

Such tags will be kept in the resulting HTML even if the `keep_style_tags` option is set to `false`.

If you'd like to load stylesheets from your filesystem, use the `file://` scheme:

```python
import css_inline

# styles/email is relative to the current directory
inliner = css_inline.CSSInliner(base_url="file://styles/email/")
inliner.inline("...")
```

You can also cache external stylesheets to avoid excessive network requests:

```python
import css_inline

inliner = css_inline.CSSInliner(
    cache=css_inline.StylesheetCache(size=5)
)
inliner.inline("...")
```

Caching is disabled by default.

## XHTML compatibility

If you'd like to work around some XHTML compatibility issues like closing empty tags (`<hr>` vs. `<hr/>`), you can use the following snippet that involves `lxml`:

```python
import css_inline
from lxml import html, etree

document = "..."  # Your HTML document
inlined = css_inline.inline(document)
tree = html.fromstring(inlined)
inlined = etree.tostring(tree).decode(encoding="utf-8")
```

## Performance

`css-inline` is powered by efficient tooling from Mozilla's Servo project and significantly outperforms other Python alternatives in terms of speed.
Most of the time it achieves over a **10x** speed advantage compared to the next fastest alternative.

Here is the performance comparison:

|             | Size    | `css_inline 0.16.0` | `premailer 3.10.0`     | `toronado 0.1.0`        | `inlinestyler 0.2.5`   | `pynliner 0.8.0`       |
|-------------|---------|---------------------|------------------------|-------------------------|------------------------|------------------------|
| Basic       | 230 B   | 4.31 µs             | 106.94 µs (**24.77x**) | 602.44 µs (**139.52x**) | 1.02 ms (**236.65x**)  | 1.13ms (**263.43x**)   |
| Realistic-1 | 8.58 KB | 83.37 µs           | 1.20 ms (**14.42x**)   | 13.66 ms (**163.85x**)  | 26.37 ms (**316.30x**) | 44.76 ms (**536.88x**) |
| Realistic-2 | 4.3 KB  | 57.60 µs            | 1.73 ms (**30.04x**)   | ERROR                   | 17.71 ms (**307.46x**) | ERROR                  |
| GitHub page | 1.81 MB | 139.57 ms           | 13.94 s (**99.90x**)  | ERROR                   | ERROR                  | ERROR                  |

The "Basic" case was obtained by benchmarking the example from the Usage section.
Note that the `toronado`, `inlinestyler`, and `pynliner` libraries both encountered errors when used to inline CSS in the last scenario.

The benchmarking code is available in the `benches/bench.py` file. The benchmarks were conducted using the stable `rustc 1.87`, Python `3.12.5` on Ryzen 9 9950X.

## Comparison with other libraries

Besides performance, `css-inline` differs from other Python libraries for CSS inlining.

- Generally supports more CSS features than other libraries (for example, `toronado` and `pynliner` do not support pseudo-elements);
- It has fewer configuration options and is not as flexible as `premailer`;
- Works on fewer platforms than LXML-based libraries (`premailer`, `inlinestyler`, `toronado`, and optionally `pynliner`);
- Does not have debug logs yet;
- Supports only HTML 5.

## Further reading

If you want to know how this library was created & how it works internally, you could take a look at these articles:

- [Rust crate](https://dygalo.dev/blog/rust-for-a-pythonista-2/)
- [Python bindings](https://dygalo.dev/blog/rust-for-a-pythonista-3/)

## License

This project is licensed under the terms of the [MIT license](https://opensource.org/licenses/MIT).


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "css-inline",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "css, html, email, stylesheet, inlining",
    "author": "Dmitry Dygalo <dmitry@dygalo.dev>",
    "author_email": "Dmitry Dygalo <dmitry@dygalo.dev>",
    "download_url": "https://files.pythonhosted.org/packages/31/fb/8eefb6b32803f8ca0ceefdd2d7cd14686264ec59ccae20205bda8e3b060f/css_inline-0.16.0.tar.gz",
    "platform": null,
    "description": "# css_inline\n\n[<img alt=\"build status\" src=\"https://img.shields.io/github/actions/workflow/status/Stranger6667/css-inline/build.yml?style=flat-square&labelColor=555555&logo=github\" height=\"20\">](https://github.com/Stranger6667/css-inline/actions/workflows/build.yml)\n[<img alt=\"pypi\" src=\"https://img.shields.io/pypi/v/css_inline.svg?style=flat-square\" height=\"20\">](https://pypi.org/project/css_inline/)\n[<img alt=\"versions\" src=\"https://img.shields.io/pypi/pyversions/css_inline.svg?style=flat-square\" height=\"20\">](https://pypi.org/project/css_inline/)\n[<img alt=\"license\" src=\"https://img.shields.io/pypi/l/css_inline.svg?style=flat-square\" height=\"20\">](https://opensource.org/licenses/MIT)\n[<img alt=\"codecov.io\" src=\"https://img.shields.io/codecov/c/gh/Stranger6667/css-inline?logo=codecov&style=flat-square&token=tOzvV4kDY0\" height=\"20\">](https://app.codecov.io/github/Stranger6667/css-inline)\n[<img alt=\"gitter\" src=\"https://img.shields.io/gitter/room/Stranger6667/css-inline?style=flat-square\" height=\"20\">](https://gitter.im/Stranger6667/css-inline)\n\n`css_inline` is a high-performance library for inlining CSS into HTML 'style' attributes.\n\nThis library is designed for scenarios such as preparing HTML emails or embedding HTML into third-party web pages.\n\nFor instance, the library transforms HTML like this:\n\n```html\n<html>\n  <head>\n    <style>h1 { color:blue; }</style>\n  </head>\n  <body>\n    <h1>Big Text</h1>\n  </body>\n</html>\n```\n\ninto:\n\n```html\n<html>\n  <head></head>\n  <body>\n    <h1 style=\"color:blue;\">Big Text</h1>\n  </body>\n</html>\n```\n\n- Uses reliable components from Mozilla's Servo project\n- 10-400x faster than alternatives\n- Inlines CSS from `style` and `link` tags\n- Removes `style` and `link` tags\n- Resolves external stylesheets (including local files)\n- Optionally caches external stylesheets\n- Can process multiple documents in parallel\n- Works on Linux, Windows, macOS and in the browser via PyOdide\n- Supports HTML5 & CSS3\n- Tested on CPython 3.9, 3.10, 3.11, 3.12, 3.13 and PyPy 3.9, 3.10.\n\n## Playground\n\nIf you'd like to try `css-inline`, you can check the WebAssembly-powered [playground](https://css-inline.org/) to see the results instantly.\n\n## Installation\n\nInstall with `pip`:\n\n```shell\npip install css_inline\n```\n\nPre-compiled wheels are available for most popular platforms.\nIf not available for your platform, a Rust compiler will be needed to build this package from source. Rust version 1.65 or higher is required.\n\n## Usage\n\n```python\nimport css_inline\n\nHTML = \"\"\"<html>\n<head>\n    <style>h1 { color:blue; }</style>\n</head>\n<body>\n    <h1>Big Text</h1>\n</body>\n</html>\"\"\"\n\ninlined = css_inline.inline(HTML)\n# HTML becomes this:\n#\n# <html>\n# <head>\n#    <style>h1 { color:blue; }</style>\n# </head>\n# <body>\n#     <h1 style=\"color:blue;\">Big Text</h1>\n# </body>\n# </html>\n```\n\nNote that `css-inline` automatically adds missing `html` and `body` tags, so the output is a valid HTML document.\n\nAlternatively, you can inline CSS into an HTML fragment, preserving the original structure:\n\n```python\nFRAGMENT = \"\"\"<main>\n<h1>Hello</h1>\n<section>\n<p>who am i</p>\n</section>\n</main>\"\"\"\n\nCSS = \"\"\"\np {\n    color: red;\n}\n\nh1 {\n    color: blue;\n}\n\"\"\"\n\ninlined = css_inline.inline_fragment(FRAGMENT, CSS)\n# HTML becomes this:\n# <main>\n# <h1 style=\"color: blue;\">Hello</h1>\n# <section>\n# <p style=\"color: red;\">who am i</p>\n# </section>\n# </main>\n```\n\nWhen there is a need to inline multiple HTML documents simultaneously, `css_inline` offers `inline_many` and `inline_many_fragments` functions.\nThis feature allows for concurrent processing of several inputs, significantly improving performance when dealing with a large number of documents.\n\n```python\nimport css_inline\n\ncss_inline.inline_many([\"<...>\", \"<...>\"])\n```\n\nUnder the hood, `inline_many`, spawns threads at the Rust layer to handle the parallel processing of inputs.\nThis results in faster execution times compared to employing parallel processing techniques at the Python level.\n\n**Note**: To fully benefit from `inline_many`, you should run your application on a multicore machine.\n\n### Configuration\n\nFor configuration options use the `CSSInliner` class:\n\n```python\nimport css_inline\n\ninliner = css_inline.CSSInliner(keep_style_tags=True)\ninliner.inline(\"...\")\n```\n\n- `inline_style_tags`. Specifies whether to inline CSS from \"style\" tags. Default: `True`\n- `keep_style_tags`. Specifies whether to keep \"style\" tags after inlining. Default: `False`\n- `keep_link_tags`. Specifies whether to keep \"link\" tags after inlining. Default: `False`\n- `base_url`. The base URL used to resolve relative URLs. If you'd like to load stylesheets from your filesystem, use the `file://` scheme. Default: `None`\n- `load_remote_stylesheets`. Specifies whether remote stylesheets should be loaded. Default: `True`\n- `cache`. Specifies caching options for external stylesheets (for example, `StylesheetCache(size=5)`). Default: `None`\n- `extra_css`. Extra CSS to be inlined. Default: `None`\n- `preallocate_node_capacity`. **Advanced**. Preallocates capacity for HTML nodes during parsing. This can improve performance when you have an estimate of the number of nodes in your HTML document. Default: `32`\n\nYou can also skip CSS inlining for an HTML tag by adding the `data-css-inline=\"ignore\"` attribute to it:\n\n```html\n<head>\n  <style>h1 { color:blue; }</style>\n</head>\n<body>\n  <!-- The tag below won't receive additional styles -->\n  <h1 data-css-inline=\"ignore\">Big Text</h1>\n</body>\n```\n\nThe `data-css-inline=\"ignore\"` attribute also allows you to skip `link` and `style` tags:\n\n```html\n<head>\n  <!-- Styles below are ignored -->\n  <style data-css-inline=\"ignore\">h1 { color:blue; }</style>\n</head>\n<body>\n  <h1>Big Text</h1>\n</body>\n```\n\nAlternatively, you may keep `style` from being removed by using the `data-css-inline=\"keep\"` attribute.\nThis is useful if you want to keep `@media` queries for responsive emails in separate `style` tags:\n\n```html\n<head>\n  <!-- Styles below are not removed -->\n  <style data-css-inline=\"keep\">h1 { color:blue; }</style>\n</head>\n<body>\n  <h1>Big Text</h1>\n</body>\n```\n\nSuch tags will be kept in the resulting HTML even if the `keep_style_tags` option is set to `false`.\n\nIf you'd like to load stylesheets from your filesystem, use the `file://` scheme:\n\n```python\nimport css_inline\n\n# styles/email is relative to the current directory\ninliner = css_inline.CSSInliner(base_url=\"file://styles/email/\")\ninliner.inline(\"...\")\n```\n\nYou can also cache external stylesheets to avoid excessive network requests:\n\n```python\nimport css_inline\n\ninliner = css_inline.CSSInliner(\n    cache=css_inline.StylesheetCache(size=5)\n)\ninliner.inline(\"...\")\n```\n\nCaching is disabled by default.\n\n## XHTML compatibility\n\nIf you'd like to work around some XHTML compatibility issues like closing empty tags (`<hr>` vs. `<hr/>`), you can use the following snippet that involves `lxml`:\n\n```python\nimport css_inline\nfrom lxml import html, etree\n\ndocument = \"...\"  # Your HTML document\ninlined = css_inline.inline(document)\ntree = html.fromstring(inlined)\ninlined = etree.tostring(tree).decode(encoding=\"utf-8\")\n```\n\n## Performance\n\n`css-inline` is powered by efficient tooling from Mozilla's Servo project and significantly outperforms other Python alternatives in terms of speed.\nMost of the time it achieves over a **10x** speed advantage compared to the next fastest alternative.\n\nHere is the performance comparison:\n\n|             | Size    | `css_inline 0.16.0` | `premailer 3.10.0`     | `toronado 0.1.0`        | `inlinestyler 0.2.5`   | `pynliner 0.8.0`       |\n|-------------|---------|---------------------|------------------------|-------------------------|------------------------|------------------------|\n| Basic       | 230 B   | 4.31 \u00b5s             | 106.94 \u00b5s (**24.77x**) | 602.44 \u00b5s (**139.52x**) | 1.02 ms (**236.65x**)  | 1.13ms (**263.43x**)   |\n| Realistic-1 | 8.58 KB | 83.37 \u00b5s           | 1.20 ms (**14.42x**)   | 13.66 ms (**163.85x**)  | 26.37 ms (**316.30x**) | 44.76 ms (**536.88x**) |\n| Realistic-2 | 4.3 KB  | 57.60 \u00b5s            | 1.73 ms (**30.04x**)   | ERROR                   | 17.71 ms (**307.46x**) | ERROR                  |\n| GitHub page | 1.81 MB | 139.57 ms           | 13.94 s (**99.90x**)  | ERROR                   | ERROR                  | ERROR                  |\n\nThe \"Basic\" case was obtained by benchmarking the example from the Usage section.\nNote that the `toronado`, `inlinestyler`, and `pynliner` libraries both encountered errors when used to inline CSS in the last scenario.\n\nThe benchmarking code is available in the `benches/bench.py` file. The benchmarks were conducted using the stable `rustc 1.87`, Python `3.12.5` on Ryzen 9 9950X.\n\n## Comparison with other libraries\n\nBesides performance, `css-inline` differs from other Python libraries for CSS inlining.\n\n- Generally supports more CSS features than other libraries (for example, `toronado` and `pynliner` do not support pseudo-elements);\n- It has fewer configuration options and is not as flexible as `premailer`;\n- Works on fewer platforms than LXML-based libraries (`premailer`, `inlinestyler`, `toronado`, and optionally `pynliner`);\n- Does not have debug logs yet;\n- Supports only HTML 5.\n\n## Further reading\n\nIf you want to know how this library was created & how it works internally, you could take a look at these articles:\n\n- [Rust crate](https://dygalo.dev/blog/rust-for-a-pythonista-2/)\n- [Python bindings](https://dygalo.dev/blog/rust-for-a-pythonista-3/)\n\n## License\n\nThis project is licensed under the terms of the [MIT license](https://opensource.org/licenses/MIT).\n\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "High-performance library for inlining CSS into HTML 'style' attributes",
    "version": "0.16.0",
    "project_urls": {
        "homepage": "https://github.com/Stranger6667/css-inline/tree/master/bindings/python",
        "repository": "https://github.com/Stranger6667/css-inline"
    },
    "split_keywords": [
        "css",
        " html",
        " email",
        " stylesheet",
        " inlining"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a03d16052a8a9ad85ad932639ecdaace8b9bc10f16b84c17f954d3fae06b05e6",
                "md5": "ffee61f6ee8304a5cafaf92b74d10667",
                "sha256": "caa0dedf975f3d7b3cf16b030234d30097469e20924a68d9d0e2b337a2937dd4"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl",
            "has_sig": false,
            "md5_digest": "ffee61f6ee8304a5cafaf92b74d10667",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 3475398,
            "upload_time": "2025-07-16T21:54:13",
            "upload_time_iso_8601": "2025-07-16T21:54:13.050515Z",
            "url": "https://files.pythonhosted.org/packages/a0/3d/16052a8a9ad85ad932639ecdaace8b9bc10f16b84c17f954d3fae06b05e6/css_inline-0.16.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0cc31a5605bf0cdaf86a8f4964ff7726fed9e6bf4be31d18c7425ef6fe13f645",
                "md5": "339270bcc65e190d476859b6c3abea0f",
                "sha256": "55e35a55541e795e081129183e5aeeec7f7e0002b81326bb0db4c7df18a62f90"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-cp39-abi3-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "339270bcc65e190d476859b6c3abea0f",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1796290,
            "upload_time": "2025-07-16T21:54:15",
            "upload_time_iso_8601": "2025-07-16T21:54:15.110352Z",
            "url": "https://files.pythonhosted.org/packages/0c/c3/1a5605bf0cdaf86a8f4964ff7726fed9e6bf4be31d18c7425ef6fe13f645/css_inline-0.16.0-cp39-abi3-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "095fe8ec5acd59aac0a35373c013ad840ea042628e4d6ce579193b1887cd1c6a",
                "md5": "9da6f28aa5788a947ec182d67e1f80bb",
                "sha256": "6e16c7a66d9d9cfc3bee05a25df8ed575e48190c6983e576e752f9f4eb8f8c30"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-cp39-abi3-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "9da6f28aa5788a947ec182d67e1f80bb",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1783687,
            "upload_time": "2025-07-16T21:54:16",
            "upload_time_iso_8601": "2025-07-16T21:54:16.853150Z",
            "url": "https://files.pythonhosted.org/packages/09/5f/e8ec5acd59aac0a35373c013ad840ea042628e4d6ce579193b1887cd1c6a/css_inline-0.16.0-cp39-abi3-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5139f7f3c0a46af6a269a8f3535162d434e98af1cdaa74638b141e02857b5202",
                "md5": "8c019e58cfb6d6bcb2b5e081af02644f",
                "sha256": "8640bd2709266abc6d472a7df4820cfadf823e00ecce629f00f2993c73d9dc17"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "8c019e58cfb6d6bcb2b5e081af02644f",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1914669,
            "upload_time": "2025-07-16T21:54:18",
            "upload_time_iso_8601": "2025-07-16T21:54:18.295449Z",
            "url": "https://files.pythonhosted.org/packages/51/39/f7f3c0a46af6a269a8f3535162d434e98af1cdaa74638b141e02857b5202/css_inline-0.16.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a4bdf3580543f3abf4341169aee4de92d19be2d240a183795d91c6568265b350",
                "md5": "0cc9404c4060678dca4020b0faeab173",
                "sha256": "9299f46db90448592adabca1232a2d89187d10cac4f2ce51123545d17c4ddf4a"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-cp39-abi3-manylinux_2_24_aarch64.whl",
            "has_sig": false,
            "md5_digest": "0cc9404c4060678dca4020b0faeab173",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1798182,
            "upload_time": "2025-07-16T21:54:19",
            "upload_time_iso_8601": "2025-07-16T21:54:19.575887Z",
            "url": "https://files.pythonhosted.org/packages/a4/bd/f3580543f3abf4341169aee4de92d19be2d240a183795d91c6568265b350/css_inline-0.16.0-cp39-abi3-manylinux_2_24_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "01586868c0a73c6a8c585235288602f69071a642eb008a3ccdbf14d4ccf11051",
                "md5": "fc5e08699d9f7ed47712ef7ec2dc54d4",
                "sha256": "5298071b00016f4e47e253c74a3f3c3a26d36e448603320a9f94c32efc645962"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-cp39-abi3-manylinux_2_24_armv7l.whl",
            "has_sig": false,
            "md5_digest": "fc5e08699d9f7ed47712ef7ec2dc54d4",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1690894,
            "upload_time": "2025-07-16T21:54:20",
            "upload_time_iso_8601": "2025-07-16T21:54:20.961284Z",
            "url": "https://files.pythonhosted.org/packages/01/58/6868c0a73c6a8c585235288602f69071a642eb008a3ccdbf14d4ccf11051/css_inline-0.16.0-cp39-abi3-manylinux_2_24_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5186ddb9178366746fddecb7f4145ab21037a2fda6a1cf2fe1626c9bcd4e5396",
                "md5": "96320b0677436269c96c8002301981a2",
                "sha256": "07a8828089bf8faa7daa5fd33359d749906730768548f8e782fe8dc8b93e6c0b"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-cp39-abi3-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "96320b0677436269c96c8002301981a2",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1988567,
            "upload_time": "2025-07-16T21:54:23",
            "upload_time_iso_8601": "2025-07-16T21:54:23.032999Z",
            "url": "https://files.pythonhosted.org/packages/51/86/ddb9178366746fddecb7f4145ab21037a2fda6a1cf2fe1626c9bcd4e5396/css_inline-0.16.0-cp39-abi3-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ae2b1febb35b823d119e229d370daf0305206e22f258bdbbf865c4ef8b4c25f3",
                "md5": "7d7a512f932e6096bf05f641ff27b22a",
                "sha256": "f196bed010cbe7308c30ebc0d368bb7e7410af9dda417d05524a2b1cd7935c83"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-cp39-abi3-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "7d7a512f932e6096bf05f641ff27b22a",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1910849,
            "upload_time": "2025-07-16T21:54:24",
            "upload_time_iso_8601": "2025-07-16T21:54:24.577516Z",
            "url": "https://files.pythonhosted.org/packages/ae/2b/1febb35b823d119e229d370daf0305206e22f258bdbbf865c4ef8b4c25f3/css_inline-0.16.0-cp39-abi3-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7d3c5a85e14cdc261c0e7bab8a90c511c8f64ec19a6acfdd1b27c67e7ec5e946",
                "md5": "80f08c3ce17c234abfc84bf2b0bb96d2",
                "sha256": "7c4a84700d760aadfe0e73c3c7f0df07931dbd0632276f5f128bd32a56ce4989"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-cp39-abi3-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "80f08c3ce17c234abfc84bf2b0bb96d2",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 2087606,
            "upload_time": "2025-07-16T21:54:26",
            "upload_time_iso_8601": "2025-07-16T21:54:26.067205Z",
            "url": "https://files.pythonhosted.org/packages/7d/3c/5a85e14cdc261c0e7bab8a90c511c8f64ec19a6acfdd1b27c67e7ec5e946/css_inline-0.16.0-cp39-abi3-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "43794771b6cd80d6281369b213c650caac4eeeb08b5a436943fef3c71898b56a",
                "md5": "8482c7cb1dc0c5f98e1f5651aab82043",
                "sha256": "0de2d5f9be3599995acabcdc50d60be8fe41c8fa8db732669d693d375c72b345"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-cp39-abi3-win32.whl",
            "has_sig": false,
            "md5_digest": "8482c7cb1dc0c5f98e1f5651aab82043",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1534728,
            "upload_time": "2025-07-16T21:54:27",
            "upload_time_iso_8601": "2025-07-16T21:54:27.704782Z",
            "url": "https://files.pythonhosted.org/packages/43/79/4771b6cd80d6281369b213c650caac4eeeb08b5a436943fef3c71898b56a/css_inline-0.16.0-cp39-abi3-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4d652dfd530160cefc2db78d11906384ef12cacd0cab060839f9ce047ce02453",
                "md5": "59ebfb86fd55e4616fbeb75503bc1600",
                "sha256": "6b1919aef6a4498bb34fb89a56a79c84bab5ea68fdf673b01965bb07e5d18261"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-cp39-abi3-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "59ebfb86fd55e4616fbeb75503bc1600",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1811201,
            "upload_time": "2025-07-16T21:54:29",
            "upload_time_iso_8601": "2025-07-16T21:54:29.465419Z",
            "url": "https://files.pythonhosted.org/packages/4d/65/2dfd530160cefc2db78d11906384ef12cacd0cab060839f9ce047ce02453/css_inline-0.16.0-cp39-abi3-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "aeea705c3b79e1b70fa4771b58a8e4a798fd3cd3a35c187840ac0b8888a99e71",
                "md5": "454146b5bd857b289936b5f0f07c99f0",
                "sha256": "5924a00bb3b53318ecd410490a8f5e48ca0bababcfedf82fb18371012291bad7"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "454146b5bd857b289936b5f0f07c99f0",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.9",
            "size": 1796307,
            "upload_time": "2025-07-16T21:54:30",
            "upload_time_iso_8601": "2025-07-16T21:54:30.869727Z",
            "url": "https://files.pythonhosted.org/packages/ae/ea/705c3b79e1b70fa4771b58a8e4a798fd3cd3a35c187840ac0b8888a99e71/css_inline-0.16.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "19c6da282fbef5cf8d0e56d554fb7a48eb8e3dceb3a76dc1dc071adc8f634362",
                "md5": "4faea975e947dc320cb3528ff5108001",
                "sha256": "43ca2c18722e238d8e813ad42aa571cb05491aa1ebe90e229645efb2af206ffe"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-pp310-pypy310_pp73-manylinux_2_24_aarch64.whl",
            "has_sig": false,
            "md5_digest": "4faea975e947dc320cb3528ff5108001",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.9",
            "size": 1797017,
            "upload_time": "2025-07-16T21:54:32",
            "upload_time_iso_8601": "2025-07-16T21:54:32.118644Z",
            "url": "https://files.pythonhosted.org/packages/19/c6/da282fbef5cf8d0e56d554fb7a48eb8e3dceb3a76dc1dc071adc8f634362/css_inline-0.16.0-pp310-pypy310_pp73-manylinux_2_24_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dbae609049b5d6c4e2193eb53e6036abf300e4fca3eb98019cc4f28fb44cdcd1",
                "md5": "562f8f4919c9e62314f49a3f666d0ba7",
                "sha256": "27c74e0e3f254d31b2f1a2a451d47f99555edce73e7daac4c0ab847d65e36399"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-pp310-pypy310_pp73-manylinux_2_24_x86_64.whl",
            "has_sig": false,
            "md5_digest": "562f8f4919c9e62314f49a3f666d0ba7",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.9",
            "size": 1914005,
            "upload_time": "2025-07-16T21:54:33",
            "upload_time_iso_8601": "2025-07-16T21:54:33.504116Z",
            "url": "https://files.pythonhosted.org/packages/db/ae/609049b5d6c4e2193eb53e6036abf300e4fca3eb98019cc4f28fb44cdcd1/css_inline-0.16.0-pp310-pypy310_pp73-manylinux_2_24_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a4df3d33f827c66310c8e051f76af835e41badabb4671396dc6ae7fdeaae4c90",
                "md5": "4bee1c8a5efd4b09e3576506fdbaf5a0",
                "sha256": "41d0f9b5bfcf898a2f00e429e9fbc439c5f70dd748284f9f71bd1e5d5a67a933"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4bee1c8a5efd4b09e3576506fdbaf5a0",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.9",
            "size": 1795550,
            "upload_time": "2025-07-16T21:54:34",
            "upload_time_iso_8601": "2025-07-16T21:54:34.876732Z",
            "url": "https://files.pythonhosted.org/packages/a4/df/3d33f827c66310c8e051f76af835e41badabb4671396dc6ae7fdeaae4c90/css_inline-0.16.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "70206f4b9f785231ece3769d5bbd95346caf60b22777a4bec743dde46191b89e",
                "md5": "fe8b209537cc78333a69586d40fcf8be",
                "sha256": "c36f634f2c239e2f212be2b09c82d00281bc64fb1c2ed7265234883d2a0f9f3e"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-pp39-pypy39_pp73-manylinux_2_24_aarch64.whl",
            "has_sig": false,
            "md5_digest": "fe8b209537cc78333a69586d40fcf8be",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.9",
            "size": 1797061,
            "upload_time": "2025-07-16T21:54:36",
            "upload_time_iso_8601": "2025-07-16T21:54:36.233495Z",
            "url": "https://files.pythonhosted.org/packages/70/20/6f4b9f785231ece3769d5bbd95346caf60b22777a4bec743dde46191b89e/css_inline-0.16.0-pp39-pypy39_pp73-manylinux_2_24_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b5a215508111699623752a25a35edda2ac5b7e07b2284c429a6efc6ff2c758a1",
                "md5": "f8c00498fa42bdcbb5fffd39a91f38fb",
                "sha256": "2f6b726dfdfe15cd3eb428c20265015c7d38a27bfe2d86c5043fc64816d8bc7e"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f8c00498fa42bdcbb5fffd39a91f38fb",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.9",
            "size": 1914018,
            "upload_time": "2025-07-16T21:54:37",
            "upload_time_iso_8601": "2025-07-16T21:54:37.914599Z",
            "url": "https://files.pythonhosted.org/packages/b5/a2/15508111699623752a25a35edda2ac5b7e07b2284c429a6efc6ff2c758a1/css_inline-0.16.0-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "31fb8eefb6b32803f8ca0ceefdd2d7cd14686264ec59ccae20205bda8e3b060f",
                "md5": "6cdc857e91843fd584edded6c8a8b088",
                "sha256": "a5aa60ab8825b08fc03254ef944f6de90d60043ac2f30292c4d04405d63c3df0"
            },
            "downloads": -1,
            "filename": "css_inline-0.16.0.tar.gz",
            "has_sig": false,
            "md5_digest": "6cdc857e91843fd584edded6c8a8b088",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 59710,
            "upload_time": "2025-07-16T21:54:38",
            "upload_time_iso_8601": "2025-07-16T21:54:38.909840Z",
            "url": "https://files.pythonhosted.org/packages/31/fb/8eefb6b32803f8ca0ceefdd2d7cd14686264ec59ccae20205bda8e3b060f/css_inline-0.16.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-16 21:54:38",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Stranger6667",
    "github_project": "css-inline",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "css-inline"
}
        
Elapsed time: 1.31061s