# 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-500x 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`
- `keep_at_rules`. Specifies whether to keep "at-rules" (starting with `@`) 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.
Such tags will be kept in the resulting HTML even if the `keep_style_tags` option is set to `false`.
```html
<head>
<!-- Styles below are not removed -->
<style data-css-inline="keep">h1 { color:blue; }</style>
</head>
<body>
<h1>Big Text</h1>
</body>
```
Another possibility is to set `keep_at_rules` option to `true`. At-rules cannot be inlined into HTML therefore they
get removed by default. This is useful if you want to keep at-rules, e.g. `@media` queries for responsive emails in
separate `style` tags but inline any styles which can be inlined.
Such tags will be kept in the resulting HTML even if the `keep_style_tags` option is explicitly set to `false`.
```html
<head>
<!-- With keep_at_rules=true "color:blue" will get inlined into <h1> but @media will be kept in <style> -->
<style>h1 { color: blue; } @media (max-width: 600px) { h1 { font-size: 18px; } }</style>
</head>
<body>
<h1>Big Text</h1>
</body>
```
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.17.0` | `premailer 3.10.0` | `toronado 0.1.0` | `inlinestyler 0.2.5` | `pynliner 0.8.0` |
|-------------|---------|---------------------|------------------------|-------------------------|------------------------|------------------------|
| Basic | 230 B | 4.27 µs | 107.68 µs (**25.17x**) | 603.05 µs (**140.97x**) | 1.02 ms (**238.87x**) | 1.13ms (**264.25x**) |
| Realistic-1 | 8.58 KB | 85.54 µs | 1.20 ms (**14.13x**) | 13.79 ms (**161.32x**) | 26.37 ms (**308.27x**) | 44.94 ms (**525.39x**) |
| Realistic-2 | 4.3 KB | 58.26 µs | 1.74 ms (**29.88x**) | ERROR | 17.71 ms (**303.98x**) | ERROR |
| GitHub page | 1.81 MB | 139.74 ms | 15.02 s (**107.49x**) | 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/78/0c/b18952ddb4c0d05c00d7af94ea047b5e816ec5948d43dc334ddfed6fb3ee/css_inline-0.17.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-500x 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- `keep_at_rules`. Specifies whether to keep \"at-rules\" (starting with `@`) 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.\nSuch tags will be kept in the resulting HTML even if the `keep_style_tags` option is set to `false`.\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\nAnother possibility is to set `keep_at_rules` option to `true`. At-rules cannot be inlined into HTML therefore they\nget removed by default. This is useful if you want to keep at-rules, e.g. `@media` queries for responsive emails in\nseparate `style` tags but inline any styles which can be inlined.\nSuch tags will be kept in the resulting HTML even if the `keep_style_tags` option is explicitly set to `false`.\n\n```html\n<head>\n <!-- With keep_at_rules=true \"color:blue\" will get inlined into <h1> but @media will be kept in <style> -->\n <style>h1 { color: blue; } @media (max-width: 600px) { h1 { font-size: 18px; } }</style>\n</head>\n<body>\n <h1>Big Text</h1>\n</body>\n```\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.17.0` | `premailer 3.10.0` | `toronado 0.1.0` | `inlinestyler 0.2.5` | `pynliner 0.8.0` |\n|-------------|---------|---------------------|------------------------|-------------------------|------------------------|------------------------|\n| Basic | 230 B | 4.27 \u00b5s | 107.68 \u00b5s (**25.17x**) | 603.05 \u00b5s (**140.97x**) | 1.02 ms (**238.87x**) | 1.13ms (**264.25x**) |\n| Realistic-1 | 8.58 KB | 85.54 \u00b5s | 1.20 ms (**14.13x**) | 13.79 ms (**161.32x**) | 26.37 ms (**308.27x**) | 44.94 ms (**525.39x**) |\n| Realistic-2 | 4.3 KB | 58.26 \u00b5s | 1.74 ms (**29.88x**) | ERROR | 17.71 ms (**303.98x**) | ERROR |\n| GitHub page | 1.81 MB | 139.74 ms | 15.02 s (**107.49x**) | 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.17.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": "f0ddfcc350b6bae5e4cd6cbf7903c910afda314da61f6f6c2ad6a8f91feb0fe4",
"md5": "4723e1224afa3de36bfbe4eda67c6d1a",
"sha256": "4f909a06ef707bc2edc20e17d36fb0f15bfcb93958b278b39a52cabfd95ff712"
},
"downloads": -1,
"filename": "css_inline-0.17.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl",
"has_sig": false,
"md5_digest": "4723e1224afa3de36bfbe4eda67c6d1a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3512698,
"upload_time": "2025-07-26T21:30:40",
"upload_time_iso_8601": "2025-07-26T21:30:40.586332Z",
"url": "https://files.pythonhosted.org/packages/f0/dd/fcc350b6bae5e4cd6cbf7903c910afda314da61f6f6c2ad6a8f91feb0fe4/css_inline-0.17.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": "10302b63dea57e846628cd4da84de2fb9b56b21c721c83fa33410e5cd6256363",
"md5": "0cf5b45d7d3a41e5589a17f08244934d",
"sha256": "92a9065b241829f79a7058332a1c3fab014c60ed4bac03eadbe479f3b0085a03"
},
"downloads": -1,
"filename": "css_inline-0.17.0-cp39-abi3-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "0cf5b45d7d3a41e5589a17f08244934d",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1815121,
"upload_time": "2025-07-26T21:30:42",
"upload_time_iso_8601": "2025-07-26T21:30:42.695526Z",
"url": "https://files.pythonhosted.org/packages/10/30/2b63dea57e846628cd4da84de2fb9b56b21c721c83fa33410e5cd6256363/css_inline-0.17.0-cp39-abi3-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1443307a80f5fd70c3924ece8f288cf9fc33eb3bd5593d1806846a147ef54f63",
"md5": "c73d80219834ba56679b751164eb098f",
"sha256": "f4cf11a6c32dec0042ee111ef8fe3bf5fd4da2b93aab13edc07f2fcceda5ef37"
},
"downloads": -1,
"filename": "css_inline-0.17.0-cp39-abi3-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "c73d80219834ba56679b751164eb098f",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1805164,
"upload_time": "2025-07-26T21:30:44",
"upload_time_iso_8601": "2025-07-26T21:30:44.278092Z",
"url": "https://files.pythonhosted.org/packages/14/43/307a80f5fd70c3924ece8f288cf9fc33eb3bd5593d1806846a147ef54f63/css_inline-0.17.0-cp39-abi3-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ba7857f8a96ca9202948c7a655de944b9c57350ab58f7fea6d62a74f2526dd8a",
"md5": "0df911d5d9753a704945812c36981681",
"sha256": "f50819f66bf1ffad267a159b110b9ffc0a800af2901b739ab4a1035fc67c08dd"
},
"downloads": -1,
"filename": "css_inline-0.17.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "0df911d5d9753a704945812c36981681",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1934540,
"upload_time": "2025-07-26T21:30:45",
"upload_time_iso_8601": "2025-07-26T21:30:45.905597Z",
"url": "https://files.pythonhosted.org/packages/ba/78/57f8a96ca9202948c7a655de944b9c57350ab58f7fea6d62a74f2526dd8a/css_inline-0.17.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a43716bb12dc9872d4d09f10791dc1f4fa7876a0e5ceef4fec52f3aca9874d8c",
"md5": "5d7358015baf9ba919ee7e6a08bf2f90",
"sha256": "78e1789a94341b9b04c5517fa989c57d3234bf33f14daf38e4e41c89c957a6ec"
},
"downloads": -1,
"filename": "css_inline-0.17.0-cp39-abi3-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "5d7358015baf9ba919ee7e6a08bf2f90",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1818975,
"upload_time": "2025-07-26T21:30:47",
"upload_time_iso_8601": "2025-07-26T21:30:47.343991Z",
"url": "https://files.pythonhosted.org/packages/a4/37/16bb12dc9872d4d09f10791dc1f4fa7876a0e5ceef4fec52f3aca9874d8c/css_inline-0.17.0-cp39-abi3-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "69d77cd983d1e13f0c8e6267f1c87c71e89b188dd5deb02af864222bc7898ca1",
"md5": "2296baf367f82ed3db1facdca404682d",
"sha256": "868e5299148fc42ae985e8dfd1b747bc88780ddc20ec9d35fa50a65046f42bd7"
},
"downloads": -1,
"filename": "css_inline-0.17.0-cp39-abi3-manylinux_2_24_armv7l.whl",
"has_sig": false,
"md5_digest": "2296baf367f82ed3db1facdca404682d",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1710953,
"upload_time": "2025-07-26T21:30:48",
"upload_time_iso_8601": "2025-07-26T21:30:48.757812Z",
"url": "https://files.pythonhosted.org/packages/69/d7/7cd983d1e13f0c8e6267f1c87c71e89b188dd5deb02af864222bc7898ca1/css_inline-0.17.0-cp39-abi3-manylinux_2_24_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9fc45b21389f1bebf5e7a6ba3b394f85d42c7290e8c4d5f2352f1a79f549d6e7",
"md5": "2aca34f2b69728f2d12778b54a5eb7e0",
"sha256": "f31f2797c5275d1a2707418cbc768894041b569a8a86da5a1116d26d74b27d2f"
},
"downloads": -1,
"filename": "css_inline-0.17.0-cp39-abi3-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "2aca34f2b69728f2d12778b54a5eb7e0",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 2008650,
"upload_time": "2025-07-26T21:30:50",
"upload_time_iso_8601": "2025-07-26T21:30:50.270116Z",
"url": "https://files.pythonhosted.org/packages/9f/c4/5b21389f1bebf5e7a6ba3b394f85d42c7290e8c4d5f2352f1a79f549d6e7/css_inline-0.17.0-cp39-abi3-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3be667ad7da9ca68506acfe12cdbdde8fa4c30ae2834304bd0a363628e8783d5",
"md5": "0eef7a4b9367b923b84f91745559a5c7",
"sha256": "d5df59a076a7252cafb6a66eea23e9451692e45a848c2385ac226dcfaa03bf4b"
},
"downloads": -1,
"filename": "css_inline-0.17.0-cp39-abi3-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "0eef7a4b9367b923b84f91745559a5c7",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1932493,
"upload_time": "2025-07-26T21:30:52",
"upload_time_iso_8601": "2025-07-26T21:30:52.022202Z",
"url": "https://files.pythonhosted.org/packages/3b/e6/67ad7da9ca68506acfe12cdbdde8fa4c30ae2834304bd0a363628e8783d5/css_inline-0.17.0-cp39-abi3-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f08720760e74856087f1026e06fd11d53e4d2c6419e3acf460a1264e8af508dc",
"md5": "7455d2b06ac967028f42ea5fb9559719",
"sha256": "5239923d2e6cca2b370d42b482a823731fc01e1fe2d0a263110a5e1f46f34b1c"
},
"downloads": -1,
"filename": "css_inline-0.17.0-cp39-abi3-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "7455d2b06ac967028f42ea5fb9559719",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 2107415,
"upload_time": "2025-07-26T21:30:53",
"upload_time_iso_8601": "2025-07-26T21:30:53.429573Z",
"url": "https://files.pythonhosted.org/packages/f0/87/20760e74856087f1026e06fd11d53e4d2c6419e3acf460a1264e8af508dc/css_inline-0.17.0-cp39-abi3-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2aa5af8c77d1a6d404fe4b9fd0e0879dca3c295ce9f410c686c7d5be0da45cb4",
"md5": "91094d833c6525e5e4fc1a14e454ed99",
"sha256": "17fd92473a39ae879611ee1a9fd64bd7d484298d98ec3e2308170ed307b2c6c1"
},
"downloads": -1,
"filename": "css_inline-0.17.0-cp39-abi3-win32.whl",
"has_sig": false,
"md5_digest": "91094d833c6525e5e4fc1a14e454ed99",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1550958,
"upload_time": "2025-07-26T21:30:54",
"upload_time_iso_8601": "2025-07-26T21:30:54.946580Z",
"url": "https://files.pythonhosted.org/packages/2a/a5/af8c77d1a6d404fe4b9fd0e0879dca3c295ce9f410c686c7d5be0da45cb4/css_inline-0.17.0-cp39-abi3-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1abbf36d3bfa1a7bf9fbb25c852ded26ef527f1e93de71cc31b01da4c9ff4c58",
"md5": "2f14bc8b241dc6c1dead2ac95a5052e5",
"sha256": "8efb4bd09af80286d6ffd015966125c4fbd37fdc46ca04b061cc62c82d9aa4f0"
},
"downloads": -1,
"filename": "css_inline-0.17.0-cp39-abi3-win_amd64.whl",
"has_sig": false,
"md5_digest": "2f14bc8b241dc6c1dead2ac95a5052e5",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1830741,
"upload_time": "2025-07-26T21:30:55",
"upload_time_iso_8601": "2025-07-26T21:30:55.973885Z",
"url": "https://files.pythonhosted.org/packages/1a/bb/f36d3bfa1a7bf9fbb25c852ded26ef527f1e93de71cc31b01da4c9ff4c58/css_inline-0.17.0-cp39-abi3-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "eaa2efbdfe0015c6b9c9e1dcc792cfe005cdce898b10726d72c549454ee0e5c2",
"md5": "65e28ca9823f4d21cc9ee2979f4e2fbc",
"sha256": "4cc6d90c9d0cec3232d398c5219ce96866dc8b45a715c2b4f78381bf01a52dbc"
},
"downloads": -1,
"filename": "css_inline-0.17.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "65e28ca9823f4d21cc9ee2979f4e2fbc",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.9",
"size": 1814061,
"upload_time": "2025-07-26T21:30:57",
"upload_time_iso_8601": "2025-07-26T21:30:57.019025Z",
"url": "https://files.pythonhosted.org/packages/ea/a2/efbdfe0015c6b9c9e1dcc792cfe005cdce898b10726d72c549454ee0e5c2/css_inline-0.17.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c5f9c4ee24b5c490479973f0d60e3cfa2840cf4cefb8ff0fd016ab66d36e64dd",
"md5": "161d67d1376ed78e58615f6313fbcce6",
"sha256": "b158771fa97f48c63294c89f1b5e533c789cea5e2bfd908571887aead22cd673"
},
"downloads": -1,
"filename": "css_inline-0.17.0-pp310-pypy310_pp73-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "161d67d1376ed78e58615f6313fbcce6",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.9",
"size": 1818025,
"upload_time": "2025-07-26T21:30:58",
"upload_time_iso_8601": "2025-07-26T21:30:58.302650Z",
"url": "https://files.pythonhosted.org/packages/c5/f9/c4ee24b5c490479973f0d60e3cfa2840cf4cefb8ff0fd016ab66d36e64dd/css_inline-0.17.0-pp310-pypy310_pp73-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1abcdb9fbcb5d5d1c4550855158816b889b42e72a2facd91ad73a3c4f7c40c1c",
"md5": "2176bc4a25b4a38bfa4b0f12c9a64668",
"sha256": "5dd73260258eed4d8f3e7f4ff04f36d47f1f9b92cd9cae01e3861452eb21a6fe"
},
"downloads": -1,
"filename": "css_inline-0.17.0-pp310-pypy310_pp73-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "2176bc4a25b4a38bfa4b0f12c9a64668",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.9",
"size": 1934466,
"upload_time": "2025-07-26T21:30:59",
"upload_time_iso_8601": "2025-07-26T21:30:59.936395Z",
"url": "https://files.pythonhosted.org/packages/1a/bc/db9fbcb5d5d1c4550855158816b889b42e72a2facd91ad73a3c4f7c40c1c/css_inline-0.17.0-pp310-pypy310_pp73-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "21d2a55f5d18cb84bb57f643c34f23b6e3e3068440f35343b38868bc81f8ae91",
"md5": "d45d4d2506b9474b326019dacdd57100",
"sha256": "171593b651654c0e95b6448dfcb2f79a6ab7a9f9821622ab18095cf3e625868e"
},
"downloads": -1,
"filename": "css_inline-0.17.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "d45d4d2506b9474b326019dacdd57100",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.9",
"size": 1813957,
"upload_time": "2025-07-26T21:31:01",
"upload_time_iso_8601": "2025-07-26T21:31:01.115515Z",
"url": "https://files.pythonhosted.org/packages/21/d2/a55f5d18cb84bb57f643c34f23b6e3e3068440f35343b38868bc81f8ae91/css_inline-0.17.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3eef0ed1d0fd32fb03125cedd6b3ecdb145de47ff307f673653cec838b276408",
"md5": "0821a9c73087cd522233a942a4bdd70b",
"sha256": "5d013d9f078b390ad994d4b7b433f5d84054111c1bd782a852359e0e887c9839"
},
"downloads": -1,
"filename": "css_inline-0.17.0-pp39-pypy39_pp73-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "0821a9c73087cd522233a942a4bdd70b",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.9",
"size": 1818143,
"upload_time": "2025-07-26T21:31:02",
"upload_time_iso_8601": "2025-07-26T21:31:02.654717Z",
"url": "https://files.pythonhosted.org/packages/3e/ef/0ed1d0fd32fb03125cedd6b3ecdb145de47ff307f673653cec838b276408/css_inline-0.17.0-pp39-pypy39_pp73-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "562d1ecfcd88d31006224a4814468d518ae1ab1fcd77f65b2306eef03c87977e",
"md5": "b0e50a12e2702a1b9d15c7ed98c4bc4b",
"sha256": "0987e9c1a9b0b2fcb40b52cbb506c57c0d86737810cc53963ce6a95995148469"
},
"downloads": -1,
"filename": "css_inline-0.17.0-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "b0e50a12e2702a1b9d15c7ed98c4bc4b",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.9",
"size": 1934673,
"upload_time": "2025-07-26T21:31:03",
"upload_time_iso_8601": "2025-07-26T21:31:03.740894Z",
"url": "https://files.pythonhosted.org/packages/56/2d/1ecfcd88d31006224a4814468d518ae1ab1fcd77f65b2306eef03c87977e/css_inline-0.17.0-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "780cb18952ddb4c0d05c00d7af94ea047b5e816ec5948d43dc334ddfed6fb3ee",
"md5": "0a5375827399241c21971027972c095d",
"sha256": "f0f3c59fd793d53595910faca14b5bf5b86ff692c1d7f664f86028ee24d8eb2f"
},
"downloads": -1,
"filename": "css_inline-0.17.0.tar.gz",
"has_sig": false,
"md5_digest": "0a5375827399241c21971027972c095d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 64094,
"upload_time": "2025-07-26T21:31:04",
"upload_time_iso_8601": "2025-07-26T21:31:04.794385Z",
"url": "https://files.pythonhosted.org/packages/78/0c/b18952ddb4c0d05c00d7af94ea047b5e816ec5948d43dc334ddfed6fb3ee/css_inline-0.17.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-26 21:31:04",
"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"
}