# 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, and macOS
- Supports HTML5 & CSS3
- Tested on CPython 3.7, 3.8, 3.9, 3.10, 3.11, 3.12 and PyPy 3.7, 3.8, 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.14.1` | `premailer 3.10.0` | `toronado 0.1.0` | `inlinestyler 0.2.5` | `pynliner 0.8.0` |
|-------------|---------|---------------------|------------------------|-------------------------|------------------------|------------------------|
| Basic | 230 B | 6.54 µs | 127.62 µs (**19.51x**) | 657.50 µs (**100.52x**) | 1.02 ms (**157.01x**) | 1.17ms (**179.64x**) |
| Realistic-1 | 8.58 KB | 134.54 µs | 1.40 ms (**10.42x**) | 15.81 ms (**117.54x**) | 26.37 ms (**196.04x**) | 52.77 ms (**392.29x**) |
| Realistic-2 | 4.3 KB | 82.37 µs | 2.78 ms (**33.80x**) | ERROR | 17.71 ms (**215.01x**) | ERROR |
| GitHub page | 1.81 MB | 223.85 ms | 25.04 s (**111.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.78`, Python `3.11.7` on M1 Max.
## 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.7",
"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/2a/18/75d6ec563fa7a82e6979075bce6efe64e50e7a8c02c823e0623db10411d0/css_inline-0.14.3.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, and macOS\n- Supports HTML5 & CSS3\n- Tested on CPython 3.7, 3.8, 3.9, 3.10, 3.11, 3.12 and PyPy 3.7, 3.8, 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.14.1` | `premailer 3.10.0` | `toronado 0.1.0` | `inlinestyler 0.2.5` | `pynliner 0.8.0` |\n|-------------|---------|---------------------|------------------------|-------------------------|------------------------|------------------------|\n| Basic | 230 B | 6.54 \u00b5s | 127.62 \u00b5s (**19.51x**) | 657.50 \u00b5s (**100.52x**) | 1.02 ms (**157.01x**) | 1.17ms (**179.64x**) |\n| Realistic-1 | 8.58 KB | 134.54 \u00b5s | 1.40 ms (**10.42x**) | 15.81 ms (**117.54x**) | 26.37 ms (**196.04x**) | 52.77 ms (**392.29x**) |\n| Realistic-2 | 4.3 KB | 82.37 \u00b5s | 2.78 ms (**33.80x**) | ERROR | 17.71 ms (**215.01x**) | ERROR |\n| GitHub page | 1.81 MB | 223.85 ms | 25.04 s (**111.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.78`, Python `3.11.7` on M1 Max.\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.14.3",
"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": "",
"digests": {
"blake2b_256": "0cab3b2df2f99e4ec92260de7e19e67fec871b2643fcbf4f3d93fa0132037b4e",
"md5": "e32f4988c177dda59d2effed0f99d9f6",
"sha256": "591cb22a453815552bae0fb5f78d324e0b8dd0303987b3941e41922b7ba7cd7f"
},
"downloads": -1,
"filename": "css_inline-0.14.3-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl",
"has_sig": false,
"md5_digest": "e32f4988c177dda59d2effed0f99d9f6",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 3493165,
"upload_time": "2024-11-14T07:59:32",
"upload_time_iso_8601": "2024-11-14T07:59:32.439659Z",
"url": "https://files.pythonhosted.org/packages/0c/ab/3b2df2f99e4ec92260de7e19e67fec871b2643fcbf4f3d93fa0132037b4e/css_inline-0.14.3-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4cbf3e751d9ca6f1fdce8de7802e0719031916cf6113821fcb1d488d4354e385",
"md5": "13a5b01bcb73b9109efd23bd6619cd30",
"sha256": "1e567cdc3f0f9aba8117323b24ac4e122d311f0ef02a1138f478fd274f41e690"
},
"downloads": -1,
"filename": "css_inline-0.14.3-cp37-abi3-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "13a5b01bcb73b9109efd23bd6619cd30",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1798027,
"upload_time": "2024-11-14T07:59:34",
"upload_time_iso_8601": "2024-11-14T07:59:34.511453Z",
"url": "https://files.pythonhosted.org/packages/4c/bf/3e751d9ca6f1fdce8de7802e0719031916cf6113821fcb1d488d4354e385/css_inline-0.14.3-cp37-abi3-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a69c942866479e26f500cc5b483ac5570b24a1c990e4141c40c747657e320025",
"md5": "931f70d999e14ebb10bfebc600c535f3",
"sha256": "8a9a677817f4a4ec121df3ded7f85fb3af3102e7cde8e4875822090fc575113f"
},
"downloads": -1,
"filename": "css_inline-0.14.3-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "931f70d999e14ebb10bfebc600c535f3",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1784947,
"upload_time": "2024-11-14T07:59:36",
"upload_time_iso_8601": "2024-11-14T07:59:36.811191Z",
"url": "https://files.pythonhosted.org/packages/a6/9c/942866479e26f500cc5b483ac5570b24a1c990e4141c40c747657e320025/css_inline-0.14.3-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "618cf60167d72c9a40d49e2ca82f65fd19e0b3d0aa3fe1fd92477f396f2eb48c",
"md5": "5fd7825d49aa0a1619afdf1348c6a5aa",
"sha256": "064afe93854e95636adf1e91483b82da6a9544d1ec1a6fe29694c718f755923a"
},
"downloads": -1,
"filename": "css_inline-0.14.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "5fd7825d49aa0a1619afdf1348c6a5aa",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1931573,
"upload_time": "2024-11-14T07:59:38",
"upload_time_iso_8601": "2024-11-14T07:59:38.804231Z",
"url": "https://files.pythonhosted.org/packages/61/8c/f60167d72c9a40d49e2ca82f65fd19e0b3d0aa3fe1fd92477f396f2eb48c/css_inline-0.14.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "079817af0c3f94366c6184295292d3683d9f776aa0f56a2016bc487034c40a1f",
"md5": "c95b16b0447315e4f89d9d06901750ae",
"sha256": "d255a4d4c3948e22ec741af88707e1371b54b63993cd52da54296a383373c60b"
},
"downloads": -1,
"filename": "css_inline-0.14.3-cp37-abi3-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "c95b16b0447315e4f89d9d06901750ae",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1878790,
"upload_time": "2024-11-14T07:59:40",
"upload_time_iso_8601": "2024-11-14T07:59:40.143482Z",
"url": "https://files.pythonhosted.org/packages/07/98/17af0c3f94366c6184295292d3683d9f776aa0f56a2016bc487034c40a1f/css_inline-0.14.3-cp37-abi3-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "384107b4e200a3d418a81d9d3610e2fd7f84954ae964191807ae49ea4ff3c7a0",
"md5": "57379fb2002bd911e1d8584a815d5114",
"sha256": "8f65695b5efac1089bacca252e975829939aa0e074ee4847d4dfe3f85add5d77"
},
"downloads": -1,
"filename": "css_inline-0.14.3-cp37-abi3-manylinux_2_24_armv7l.whl",
"has_sig": false,
"md5_digest": "57379fb2002bd911e1d8584a815d5114",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1782357,
"upload_time": "2024-11-14T07:59:42",
"upload_time_iso_8601": "2024-11-14T07:59:42.524583Z",
"url": "https://files.pythonhosted.org/packages/38/41/07b4e200a3d418a81d9d3610e2fd7f84954ae964191807ae49ea4ff3c7a0/css_inline-0.14.3-cp37-abi3-manylinux_2_24_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8186230ac6c423158204c62625f30bf076aacd3a63ae38927843f460edaa5379",
"md5": "84d4ea1dde7a8f36ae4fa9f90fc55a3c",
"sha256": "d6895b673439e0e40181ebd05cfce52ca3650f8aa56d0d378b169c1c1639407d"
},
"downloads": -1,
"filename": "css_inline-0.14.3-cp37-abi3-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "84d4ea1dde7a8f36ae4fa9f90fc55a3c",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 2145062,
"upload_time": "2024-11-14T07:59:44",
"upload_time_iso_8601": "2024-11-14T07:59:44.815949Z",
"url": "https://files.pythonhosted.org/packages/81/86/230ac6c423158204c62625f30bf076aacd3a63ae38927843f460edaa5379/css_inline-0.14.3-cp37-abi3-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a3cf66facc1eeeea8b873563492905fc3cab5e6e5bc62550c49b7b4d91a91430",
"md5": "1762ad83799271f9e4fcb774bf75ae32",
"sha256": "ac5ff1a5d24213ef4f6a008452fd6965d68147ebd6081ca64929ea22e5a81e7f"
},
"downloads": -1,
"filename": "css_inline-0.14.3-cp37-abi3-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "1762ad83799271f9e4fcb774bf75ae32",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 2009558,
"upload_time": "2024-11-14T07:59:47",
"upload_time_iso_8601": "2024-11-14T07:59:47.156426Z",
"url": "https://files.pythonhosted.org/packages/a3/cf/66facc1eeeea8b873563492905fc3cab5e6e5bc62550c49b7b4d91a91430/css_inline-0.14.3-cp37-abi3-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "175f9a9ea23f75b1c937c1bca75b686ae2e76ba8fa7ddf3fbcf4c471fd596546",
"md5": "c9e67c06445db24c814e4802836e7e1d",
"sha256": "7300cccd424dd7fcffadc5c104d1ccb257e00e7086c64b7472663c4f9e67d504"
},
"downloads": -1,
"filename": "css_inline-0.14.3-cp37-abi3-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "c9e67c06445db24c814e4802836e7e1d",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 2093046,
"upload_time": "2024-11-14T07:59:48",
"upload_time_iso_8601": "2024-11-14T07:59:48.927768Z",
"url": "https://files.pythonhosted.org/packages/17/5f/9a9ea23f75b1c937c1bca75b686ae2e76ba8fa7ddf3fbcf4c471fd596546/css_inline-0.14.3-cp37-abi3-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ca35958b013b4e943c9e7fdf106312912ac23cc80b20c777118c28dffd29ee84",
"md5": "f9b070ca24559fc40a8b75ba239d716c",
"sha256": "05e0f299c9f7d5b2821363bcb196de4d7adf5c71c42a98eb102660a0f8f483ea"
},
"downloads": -1,
"filename": "css_inline-0.14.3-cp37-abi3-win32.whl",
"has_sig": false,
"md5_digest": "f9b070ca24559fc40a8b75ba239d716c",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1440970,
"upload_time": "2024-11-14T07:59:50",
"upload_time_iso_8601": "2024-11-14T07:59:50.294276Z",
"url": "https://files.pythonhosted.org/packages/ca/35/958b013b4e943c9e7fdf106312912ac23cc80b20c777118c28dffd29ee84/css_inline-0.14.3-cp37-abi3-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "deee6998fe263633c044843b925d941ae31e45a8ecdc0457df87633e476ceda3",
"md5": "c37ea6bc06af7b1841474effd5642b25",
"sha256": "7e3722d259e0b54bce323f4c7a73226237a3c067760b02d09ca5a25a7af1d678"
},
"downloads": -1,
"filename": "css_inline-0.14.3-cp37-abi3-win_amd64.whl",
"has_sig": false,
"md5_digest": "c37ea6bc06af7b1841474effd5642b25",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1708078,
"upload_time": "2024-11-14T07:59:51",
"upload_time_iso_8601": "2024-11-14T07:59:51.661009Z",
"url": "https://files.pythonhosted.org/packages/de/ee/6998fe263633c044843b925d941ae31e45a8ecdc0457df87633e476ceda3/css_inline-0.14.3-cp37-abi3-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "af52a6e2859bfacf7047b7ac23104741dd9161427b7f13608a385ecf018ccafb",
"md5": "01ac19031dbffbc791fed7b6dd8d4689",
"sha256": "e0444eebbf09bd40e6e6b880a82cd3a9828a0d185535f01f16d716bdc8322a74"
},
"downloads": -1,
"filename": "css_inline-0.14.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "01ac19031dbffbc791fed7b6dd8d4689",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.7",
"size": 1791531,
"upload_time": "2024-11-14T07:59:53",
"upload_time_iso_8601": "2024-11-14T07:59:53.149359Z",
"url": "https://files.pythonhosted.org/packages/af/52/a6e2859bfacf7047b7ac23104741dd9161427b7f13608a385ecf018ccafb/css_inline-0.14.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5a50fe28358906acfe7f521c68b1fbf816ff2912f8db14cbe805d1478072454d",
"md5": "e18206968220ddb4170b353e9f9c363a",
"sha256": "fab7e280327dd1b10b1ee62ee43a338ca45f7a3e104c7d52d93c4f187bcced55"
},
"downloads": -1,
"filename": "css_inline-0.14.3-pp310-pypy310_pp73-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "e18206968220ddb4170b353e9f9c363a",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.7",
"size": 1876639,
"upload_time": "2024-11-14T07:59:55",
"upload_time_iso_8601": "2024-11-14T07:59:55.394473Z",
"url": "https://files.pythonhosted.org/packages/5a/50/fe28358906acfe7f521c68b1fbf816ff2912f8db14cbe805d1478072454d/css_inline-0.14.3-pp310-pypy310_pp73-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "21a1e9a2bd5749b375b229d8497d5601980b21ad5c9577d834dce711dd7eb65a",
"md5": "460afc854dce1b06dbe622e953a1154c",
"sha256": "d68929e9c25c81fc6aafd6503e67ea055f9aeaa63c2fb52c679d688091b92ea0"
},
"downloads": -1,
"filename": "css_inline-0.14.3-pp310-pypy310_pp73-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "460afc854dce1b06dbe622e953a1154c",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.7",
"size": 1929617,
"upload_time": "2024-11-14T07:59:56",
"upload_time_iso_8601": "2024-11-14T07:59:56.755132Z",
"url": "https://files.pythonhosted.org/packages/21/a1/e9a2bd5749b375b229d8497d5601980b21ad5c9577d834dce711dd7eb65a/css_inline-0.14.3-pp310-pypy310_pp73-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2e32730730ec7d9bfcdf3dce492be96db8daee4344a6bb42d9fd151cfff7499d",
"md5": "9fae717eb555c9cd27193e9cde33254a",
"sha256": "c1150308e5a5856b89fa6a62f584e3f6764c742be930347513f9128ee93b2bdf"
},
"downloads": -1,
"filename": "css_inline-0.14.3-pp37-pypy37_pp73-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "9fae717eb555c9cd27193e9cde33254a",
"packagetype": "bdist_wheel",
"python_version": "pp37",
"requires_python": ">=3.7",
"size": 1796676,
"upload_time": "2024-11-14T07:59:58",
"upload_time_iso_8601": "2024-11-14T07:59:58.149405Z",
"url": "https://files.pythonhosted.org/packages/2e/32/730730ec7d9bfcdf3dce492be96db8daee4344a6bb42d9fd151cfff7499d/css_inline-0.14.3-pp37-pypy37_pp73-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b56b6b0efc14258565b897b49e2d32de68e956437c7ece79d39a2a4aa7111e8f",
"md5": "a3302dc53da89dcb576e9954df4bb6fe",
"sha256": "9a1a446a9ccd84900a2c0e0811cd28aca5bb9d0e27ef4109cbf2948eb6a11379"
},
"downloads": -1,
"filename": "css_inline-0.14.3-pp37-pypy37_pp73-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "a3302dc53da89dcb576e9954df4bb6fe",
"packagetype": "bdist_wheel",
"python_version": "pp37",
"requires_python": ">=3.7",
"size": 1878179,
"upload_time": "2024-11-14T08:00:00",
"upload_time_iso_8601": "2024-11-14T08:00:00.384803Z",
"url": "https://files.pythonhosted.org/packages/b5/6b/6b0efc14258565b897b49e2d32de68e956437c7ece79d39a2a4aa7111e8f/css_inline-0.14.3-pp37-pypy37_pp73-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "dbf5c7fc7ccb984166dc766159e105261b784ee96cb85acd29683fd4140dc88e",
"md5": "eb7a68386cf3adb9111dc24a3de28813",
"sha256": "61460fc4b551fe551818100d1ecaf7c041adb7bb386edafe99c36b103fde99e7"
},
"downloads": -1,
"filename": "css_inline-0.14.3-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "eb7a68386cf3adb9111dc24a3de28813",
"packagetype": "bdist_wheel",
"python_version": "pp37",
"requires_python": ">=3.7",
"size": 1929686,
"upload_time": "2024-11-14T08:00:02",
"upload_time_iso_8601": "2024-11-14T08:00:02.068257Z",
"url": "https://files.pythonhosted.org/packages/db/f5/c7fc7ccb984166dc766159e105261b784ee96cb85acd29683fd4140dc88e/css_inline-0.14.3-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cb4ced13471b23b535c508d223e4206d7f6cccb3da584023b5d2ecd9b2a1d50b",
"md5": "7ae7990b980bac21377762223d8256c0",
"sha256": "263e85d9e0d47702cce3eeaccef8ab34e24dc0697d27d950261ec69f368ab5b3"
},
"downloads": -1,
"filename": "css_inline-0.14.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "7ae7990b980bac21377762223d8256c0",
"packagetype": "bdist_wheel",
"python_version": "pp38",
"requires_python": ">=3.7",
"size": 1794764,
"upload_time": "2024-11-14T08:00:04",
"upload_time_iso_8601": "2024-11-14T08:00:04.391897Z",
"url": "https://files.pythonhosted.org/packages/cb/4c/ed13471b23b535c508d223e4206d7f6cccb3da584023b5d2ecd9b2a1d50b/css_inline-0.14.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0c243dbd299ef2e10fb851b65a89eb89614653958518b83bdd9275b0cdf7b2db",
"md5": "c809fbfce4fa3d6fa1fda840718956cf",
"sha256": "ca865a4691830f3dbd86691192f6064cb25f7f05c91a9a824ea846076b3f3867"
},
"downloads": -1,
"filename": "css_inline-0.14.3-pp38-pypy38_pp73-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "c809fbfce4fa3d6fa1fda840718956cf",
"packagetype": "bdist_wheel",
"python_version": "pp38",
"requires_python": ">=3.7",
"size": 1876737,
"upload_time": "2024-11-14T08:00:06",
"upload_time_iso_8601": "2024-11-14T08:00:06.671333Z",
"url": "https://files.pythonhosted.org/packages/0c/24/3dbd299ef2e10fb851b65a89eb89614653958518b83bdd9275b0cdf7b2db/css_inline-0.14.3-pp38-pypy38_pp73-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6112c5f92e0597c99f87f10c2042fecd99319d03d1811923452dd5a105b22085",
"md5": "135fbf2876fb64b3d5ae07760b08ab8c",
"sha256": "d4a6808a6a2ea33c4ba3c19f5ff6f82cccebca9cda199eb9c4e234f6b98bac62"
},
"downloads": -1,
"filename": "css_inline-0.14.3-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "135fbf2876fb64b3d5ae07760b08ab8c",
"packagetype": "bdist_wheel",
"python_version": "pp38",
"requires_python": ">=3.7",
"size": 1927832,
"upload_time": "2024-11-14T08:00:08",
"upload_time_iso_8601": "2024-11-14T08:00:08.981866Z",
"url": "https://files.pythonhosted.org/packages/61/12/c5f92e0597c99f87f10c2042fecd99319d03d1811923452dd5a105b22085/css_inline-0.14.3-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "abc99ea71107e23363065ac125e847787f1e72e6bfe1fb21133e864bbd2c25fe",
"md5": "be6170107f746a7dcd0577b780bf7e48",
"sha256": "e3ef9f7a808b00e79c58db5c2942da50fc4ffb60f9457025ddaaa8f0df520f96"
},
"downloads": -1,
"filename": "css_inline-0.14.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "be6170107f746a7dcd0577b780bf7e48",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.7",
"size": 1794793,
"upload_time": "2024-11-14T08:00:10",
"upload_time_iso_8601": "2024-11-14T08:00:10.300276Z",
"url": "https://files.pythonhosted.org/packages/ab/c9/9ea71107e23363065ac125e847787f1e72e6bfe1fb21133e864bbd2c25fe/css_inline-0.14.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "05a5a7480c6eae61dfc6ca5b9f5890e32887984e2b318f2d4cbe56becba7b9aa",
"md5": "09b4e286d2d381f59a2a1da733764656",
"sha256": "8b3e9066bf83cbc033f9ec09721f32ea5abf7b7041f6182456855f43b74984ca"
},
"downloads": -1,
"filename": "css_inline-0.14.3-pp39-pypy39_pp73-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "09b4e286d2d381f59a2a1da733764656",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.7",
"size": 1876620,
"upload_time": "2024-11-14T08:00:12",
"upload_time_iso_8601": "2024-11-14T08:00:12.661061Z",
"url": "https://files.pythonhosted.org/packages/05/a5/a7480c6eae61dfc6ca5b9f5890e32887984e2b318f2d4cbe56becba7b9aa/css_inline-0.14.3-pp39-pypy39_pp73-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "45a8ebabf062f949e700c15e1cca8019c2c9fd0e1844846b3c8d54b56c65094b",
"md5": "accda4c84bcd77239dbef86754362a7e",
"sha256": "c74eee416a0dd5d4ae318abf68c55b1fc43ba2449b4fb6a9dd2a13cc181e0b6a"
},
"downloads": -1,
"filename": "css_inline-0.14.3-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "accda4c84bcd77239dbef86754362a7e",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.7",
"size": 1927957,
"upload_time": "2024-11-14T08:00:15",
"upload_time_iso_8601": "2024-11-14T08:00:15.469875Z",
"url": "https://files.pythonhosted.org/packages/45/a8/ebabf062f949e700c15e1cca8019c2c9fd0e1844846b3c8d54b56c65094b/css_inline-0.14.3-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2a1875d6ec563fa7a82e6979075bce6efe64e50e7a8c02c823e0623db10411d0",
"md5": "299b36dcdad203e34508da46354c996e",
"sha256": "6cc37e956d6c44ad2e0c230d0d111c7f61a47117bab179f6ab59f23bf33b1caa"
},
"downloads": -1,
"filename": "css_inline-0.14.3.tar.gz",
"has_sig": false,
"md5_digest": "299b36dcdad203e34508da46354c996e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 60476,
"upload_time": "2024-11-14T08:00:17",
"upload_time_iso_8601": "2024-11-14T08:00:17.413132Z",
"url": "https://files.pythonhosted.org/packages/2a/18/75d6ec563fa7a82e6979075bce6efe64e50e7a8c02c823e0623db10411d0/css_inline-0.14.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-14 08:00:17",
"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"
}