# 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.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/7c/2f/4558f2e6a2f1e60fb066c2415189f18d5191f00eeacb82168203565f284a/css_inline-0.14.6.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.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.6",
"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": "9c4939397ea390c7c53dff88b4fd5929a032414d3baf14f7a96aadffc24e7617",
"md5": "3e8763bbacf43795f337273e5398e55f",
"sha256": "cefbf6320b27f8c0dddb753fcf9c3babdf29f3cbbcc9b7b6175dd065017b9716"
},
"downloads": -1,
"filename": "css_inline-0.14.6-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl",
"has_sig": false,
"md5_digest": "3e8763bbacf43795f337273e5398e55f",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 3483480,
"upload_time": "2024-12-27T15:27:41",
"upload_time_iso_8601": "2024-12-27T15:27:41.763345Z",
"url": "https://files.pythonhosted.org/packages/9c/49/39397ea390c7c53dff88b4fd5929a032414d3baf14f7a96aadffc24e7617/css_inline-0.14.6-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": "55a2daa8af141f62fec88846fbb79b9c642a8d8aca03b701538313b50c622261",
"md5": "b44c7ef5ef1b99842fcf52ff92e1207c",
"sha256": "8480013f5e4d089cf9339822520fb4dfe7855975739134608477c906eb94c511"
},
"downloads": -1,
"filename": "css_inline-0.14.6-cp37-abi3-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "b44c7ef5ef1b99842fcf52ff92e1207c",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1789400,
"upload_time": "2024-12-27T15:27:44",
"upload_time_iso_8601": "2024-12-27T15:27:44.859455Z",
"url": "https://files.pythonhosted.org/packages/55/a2/daa8af141f62fec88846fbb79b9c642a8d8aca03b701538313b50c622261/css_inline-0.14.6-cp37-abi3-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e74bcd8e6c951622e4f3a812531d8c7822da54295fdd1006a0ba4ae81aa4066c",
"md5": "49556e9776d949c179419f668ebe8b6d",
"sha256": "22afe654a2fcaccfccaf49cae561c7e09711051e60150aa7fcab87fdee80c72e"
},
"downloads": -1,
"filename": "css_inline-0.14.6-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "49556e9776d949c179419f668ebe8b6d",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1782893,
"upload_time": "2024-12-27T15:27:47",
"upload_time_iso_8601": "2024-12-27T15:27:47.538513Z",
"url": "https://files.pythonhosted.org/packages/e7/4b/cd8e6c951622e4f3a812531d8c7822da54295fdd1006a0ba4ae81aa4066c/css_inline-0.14.6-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bf92392fa9709a3382168e852252ce480bb3c2df38f6439e73ee117987009042",
"md5": "c9f93090d4112ab7eba72365dc9445a1",
"sha256": "fa62ff057edbc9f6fe05871f0ec8abbc13aa344ccfefefca1f252efca816e242"
},
"downloads": -1,
"filename": "css_inline-0.14.6-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "c9f93090d4112ab7eba72365dc9445a1",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1929307,
"upload_time": "2024-12-27T15:27:50",
"upload_time_iso_8601": "2024-12-27T15:27:50.725728Z",
"url": "https://files.pythonhosted.org/packages/bf/92/392fa9709a3382168e852252ce480bb3c2df38f6439e73ee117987009042/css_inline-0.14.6-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d0460d051197a5339f65581964b8b04d05185933e81dc580bfea34b4b8849cfd",
"md5": "58412cad83a5a8bf0b72fd2292796c4c",
"sha256": "e6f081528993f5f518bb5f2fe0bdaac8aa4ab704bebb41e02fb89866fd7d1c82"
},
"downloads": -1,
"filename": "css_inline-0.14.6-cp37-abi3-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "58412cad83a5a8bf0b72fd2292796c4c",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1878021,
"upload_time": "2024-12-27T15:27:52",
"upload_time_iso_8601": "2024-12-27T15:27:52.348491Z",
"url": "https://files.pythonhosted.org/packages/d0/46/0d051197a5339f65581964b8b04d05185933e81dc580bfea34b4b8849cfd/css_inline-0.14.6-cp37-abi3-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0b3f000aa14d338bec4df2f16948a514c01d5fe76d2ba32b87f88d10f63c837d",
"md5": "cac5416affeac2d22658856cc51ed506",
"sha256": "e4660adaef5cd0d3c44adcb2f48f46643b66ae69251b1f073b0d923827b9f113"
},
"downloads": -1,
"filename": "css_inline-0.14.6-cp37-abi3-manylinux_2_24_armv7l.whl",
"has_sig": false,
"md5_digest": "cac5416affeac2d22658856cc51ed506",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1780786,
"upload_time": "2024-12-27T15:27:54",
"upload_time_iso_8601": "2024-12-27T15:27:54.021275Z",
"url": "https://files.pythonhosted.org/packages/0b/3f/000aa14d338bec4df2f16948a514c01d5fe76d2ba32b87f88d10f63c837d/css_inline-0.14.6-cp37-abi3-manylinux_2_24_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e432425ed49ffdb7fd937f035e1f72fbe03ec2e894a4a9434d0b573b8c5116c3",
"md5": "fa30cc1ada35b7963314efc9fd8cdc81",
"sha256": "f5195b19c6376a23fc6de6f70689c632cdc4fc185e6807822409dc884922d0e1"
},
"downloads": -1,
"filename": "css_inline-0.14.6-cp37-abi3-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "fa30cc1ada35b7963314efc9fd8cdc81",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 2061416,
"upload_time": "2024-12-27T15:27:56",
"upload_time_iso_8601": "2024-12-27T15:27:56.858907Z",
"url": "https://files.pythonhosted.org/packages/e4/32/425ed49ffdb7fd937f035e1f72fbe03ec2e894a4a9434d0b573b8c5116c3/css_inline-0.14.6-cp37-abi3-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "636d74bf0e8ae6f579005b1535b1b673e59b857d6f29688632ec8a8eb3b1da6f",
"md5": "3dbddecaf1aae369dc3a73cdd0860437",
"sha256": "eb55fa5069d50e2b63a63a2d4e223965dd5f032544dc1d47bfad6e5c2bef71dc"
},
"downloads": -1,
"filename": "css_inline-0.14.6-cp37-abi3-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "3dbddecaf1aae369dc3a73cdd0860437",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1999739,
"upload_time": "2024-12-27T15:27:59",
"upload_time_iso_8601": "2024-12-27T15:27:59.855763Z",
"url": "https://files.pythonhosted.org/packages/63/6d/74bf0e8ae6f579005b1535b1b673e59b857d6f29688632ec8a8eb3b1da6f/css_inline-0.14.6-cp37-abi3-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bc0526269c38e0045321c8c81e12749ca7c0ff791ded5681a958c05494c8f937",
"md5": "ec43c714545bf6d009e5021adf93ee07",
"sha256": "d0012aa2b61e0ac6667b64dbd45df35edab8db86c623dd20c746344f5e3bceec"
},
"downloads": -1,
"filename": "css_inline-0.14.6-cp37-abi3-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "ec43c714545bf6d009e5021adf93ee07",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 2102975,
"upload_time": "2024-12-27T15:28:03",
"upload_time_iso_8601": "2024-12-27T15:28:03.217773Z",
"url": "https://files.pythonhosted.org/packages/bc/05/26269c38e0045321c8c81e12749ca7c0ff791ded5681a958c05494c8f937/css_inline-0.14.6-cp37-abi3-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "be9b0ce3b4bde725f3e5905163bdeb2cee1317e04219ebfa384e5013e1733108",
"md5": "00f983424e0ca4d8287c7eefe8ca3bcc",
"sha256": "0633c5bce98e36f90f3377d146640c3738826d465681373ce8368e9a6dad563e"
},
"downloads": -1,
"filename": "css_inline-0.14.6-cp37-abi3-win32.whl",
"has_sig": false,
"md5_digest": "00f983424e0ca4d8287c7eefe8ca3bcc",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1442891,
"upload_time": "2024-12-27T15:28:05",
"upload_time_iso_8601": "2024-12-27T15:28:05.987091Z",
"url": "https://files.pythonhosted.org/packages/be/9b/0ce3b4bde725f3e5905163bdeb2cee1317e04219ebfa384e5013e1733108/css_inline-0.14.6-cp37-abi3-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "86de044c637f505dd0f6c5eda4e296bf4fdcf1c042b2ec095e11339e2aaaf155",
"md5": "3bce395f389c625d23662960558ecf6c",
"sha256": "c32f07918dbfb21ed935d2187d1c8e086db06da7c33d91db2e33591c78a501b8"
},
"downloads": -1,
"filename": "css_inline-0.14.6-cp37-abi3-win_amd64.whl",
"has_sig": false,
"md5_digest": "3bce395f389c625d23662960558ecf6c",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 1708394,
"upload_time": "2024-12-27T15:28:07",
"upload_time_iso_8601": "2024-12-27T15:28:07.672127Z",
"url": "https://files.pythonhosted.org/packages/86/de/044c637f505dd0f6c5eda4e296bf4fdcf1c042b2ec095e11339e2aaaf155/css_inline-0.14.6-cp37-abi3-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "91582f487d06e6243026b85c6c815142f183cb6c0bf6a9144b876875e13f32da",
"md5": "de0876905a7dbbf4f49c6852335b2564",
"sha256": "d48b5f87eba43c426146d3e3a5810338ac0466b5b46b7a4062a29d5051ce1214"
},
"downloads": -1,
"filename": "css_inline-0.14.6-pp310-pypy310_pp73-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "de0876905a7dbbf4f49c6852335b2564",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.7",
"size": 1787911,
"upload_time": "2024-12-27T15:28:09",
"upload_time_iso_8601": "2024-12-27T15:28:09.285108Z",
"url": "https://files.pythonhosted.org/packages/91/58/2f487d06e6243026b85c6c815142f183cb6c0bf6a9144b876875e13f32da/css_inline-0.14.6-pp310-pypy310_pp73-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bc0a4dd4dcf3f93cec65f80f9b1946c4bc9e269d55efa55d6cd4aa941156d222",
"md5": "e51f4a9f37b48c5c61d119f52a9b40c1",
"sha256": "54a9110bbad71a201eaa8d7f29809610f5bf301638c556e3aca84b193c9931a6"
},
"downloads": -1,
"filename": "css_inline-0.14.6-pp310-pypy310_pp73-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "e51f4a9f37b48c5c61d119f52a9b40c1",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.7",
"size": 1877835,
"upload_time": "2024-12-27T15:28:12",
"upload_time_iso_8601": "2024-12-27T15:28:12.176343Z",
"url": "https://files.pythonhosted.org/packages/bc/0a/4dd4dcf3f93cec65f80f9b1946c4bc9e269d55efa55d6cd4aa941156d222/css_inline-0.14.6-pp310-pypy310_pp73-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e1f6dfefd29b4ff96e5d55b446d845bb4bf0ebe4453460e3b2efb1f0ddd92ea1",
"md5": "054359007a4b4bc752a3c9a684b8033d",
"sha256": "411b1e4c6857a55c3f7b3f85687d056c37fc0666e22b2dc81a420ae73b8f9a85"
},
"downloads": -1,
"filename": "css_inline-0.14.6-pp310-pypy310_pp73-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "054359007a4b4bc752a3c9a684b8033d",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.7",
"size": 1930324,
"upload_time": "2024-12-27T15:28:13",
"upload_time_iso_8601": "2024-12-27T15:28:13.824350Z",
"url": "https://files.pythonhosted.org/packages/e1/f6/dfefd29b4ff96e5d55b446d845bb4bf0ebe4453460e3b2efb1f0ddd92ea1/css_inline-0.14.6-pp310-pypy310_pp73-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b044faac613fbddb6f738235083db41694bbda56d9f4a83b062fa82dd14b9232",
"md5": "5590c3f7d400cb9c71a4c5cf67cf0084",
"sha256": "4066871324fe3e807ac937bed1475de7887fc4e9e50b1c01e3d919882ec96b76"
},
"downloads": -1,
"filename": "css_inline-0.14.6-pp37-pypy37_pp73-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "5590c3f7d400cb9c71a4c5cf67cf0084",
"packagetype": "bdist_wheel",
"python_version": "pp37",
"requires_python": ">=3.7",
"size": 1795164,
"upload_time": "2024-12-27T15:28:15",
"upload_time_iso_8601": "2024-12-27T15:28:15.853244Z",
"url": "https://files.pythonhosted.org/packages/b0/44/faac613fbddb6f738235083db41694bbda56d9f4a83b062fa82dd14b9232/css_inline-0.14.6-pp37-pypy37_pp73-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ba24ccd39eb28c59e38fcd6db079f217ef45fc3fda1d0b6e045a17c06e3470df",
"md5": "09de66f6a978a5f6809803f8a7caf58c",
"sha256": "c4f4d0d2b9a57c9e0ec26e5b408019b880e2bb6d28c1795bc7520f901f7b84f9"
},
"downloads": -1,
"filename": "css_inline-0.14.6-pp37-pypy37_pp73-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "09de66f6a978a5f6809803f8a7caf58c",
"packagetype": "bdist_wheel",
"python_version": "pp37",
"requires_python": ">=3.7",
"size": 1879316,
"upload_time": "2024-12-27T15:28:17",
"upload_time_iso_8601": "2024-12-27T15:28:17.400405Z",
"url": "https://files.pythonhosted.org/packages/ba/24/ccd39eb28c59e38fcd6db079f217ef45fc3fda1d0b6e045a17c06e3470df/css_inline-0.14.6-pp37-pypy37_pp73-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f5793866a2a53d16c56b90c5cb1065e771cbc14dedc63406b8135d497e99441e",
"md5": "97b179a3ebea119c8b0d58110b38e656",
"sha256": "04c75f4e162e68ca5dfe29deb3fcbb8ff15049a12fe785fa3d93d286db447ecd"
},
"downloads": -1,
"filename": "css_inline-0.14.6-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "97b179a3ebea119c8b0d58110b38e656",
"packagetype": "bdist_wheel",
"python_version": "pp37",
"requires_python": ">=3.7",
"size": 1930871,
"upload_time": "2024-12-27T15:28:20",
"upload_time_iso_8601": "2024-12-27T15:28:20.246238Z",
"url": "https://files.pythonhosted.org/packages/f5/79/3866a2a53d16c56b90c5cb1065e771cbc14dedc63406b8135d497e99441e/css_inline-0.14.6-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2b59598db2f43a9ee9a0c8bfcad863d1687b8b180771f47f985e9d56425b45da",
"md5": "1ac539e292e688234a698ce21d9fbadf",
"sha256": "204f7c000a9b85057ae3f75f4f8f302480007a73cb74fd97a0f9f2301abca6fe"
},
"downloads": -1,
"filename": "css_inline-0.14.6-pp38-pypy38_pp73-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "1ac539e292e688234a698ce21d9fbadf",
"packagetype": "bdist_wheel",
"python_version": "pp38",
"requires_python": ">=3.7",
"size": 1793392,
"upload_time": "2024-12-27T15:28:22",
"upload_time_iso_8601": "2024-12-27T15:28:22.385152Z",
"url": "https://files.pythonhosted.org/packages/2b/59/598db2f43a9ee9a0c8bfcad863d1687b8b180771f47f985e9d56425b45da/css_inline-0.14.6-pp38-pypy38_pp73-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "fb1d283080b4a002d1cd5d76e8a2cd9442a7000683699bdc558383f24cc60d72",
"md5": "d0d81790c1d81c909255cdc3ab2262fe",
"sha256": "ec62a1f3097dd6608adba9cdfceafaf5e83051072cf1bf02a6bb97149f436061"
},
"downloads": -1,
"filename": "css_inline-0.14.6-pp38-pypy38_pp73-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "d0d81790c1d81c909255cdc3ab2262fe",
"packagetype": "bdist_wheel",
"python_version": "pp38",
"requires_python": ">=3.7",
"size": 1878079,
"upload_time": "2024-12-27T15:28:24",
"upload_time_iso_8601": "2024-12-27T15:28:24.955564Z",
"url": "https://files.pythonhosted.org/packages/fb/1d/283080b4a002d1cd5d76e8a2cd9442a7000683699bdc558383f24cc60d72/css_inline-0.14.6-pp38-pypy38_pp73-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "04c1efeb0cfee45ef24658e4cf48d84e778c1d85d1fc7192f634d99ee3c073c1",
"md5": "ede337fee934df087c5e6b9373575039",
"sha256": "36f5002ffde1145f8150e71e67209a66a08a95cea152c03b4b71766f412eedc8"
},
"downloads": -1,
"filename": "css_inline-0.14.6-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "ede337fee934df087c5e6b9373575039",
"packagetype": "bdist_wheel",
"python_version": "pp38",
"requires_python": ">=3.7",
"size": 1929048,
"upload_time": "2024-12-27T15:28:28",
"upload_time_iso_8601": "2024-12-27T15:28:28.231070Z",
"url": "https://files.pythonhosted.org/packages/04/c1/efeb0cfee45ef24658e4cf48d84e778c1d85d1fc7192f634d99ee3c073c1/css_inline-0.14.6-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "eac036ecbeeb5249ac3b00c2904ea86ed4b76c8116d8fc0b2aadb2f6bb4ea337",
"md5": "b075596a76776d7e98dbac4f9a52d937",
"sha256": "8794799fc2672c7c53e5df958db3bd6fc2f39cae914626ded671b02e59aaadc7"
},
"downloads": -1,
"filename": "css_inline-0.14.6-pp39-pypy39_pp73-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "b075596a76776d7e98dbac4f9a52d937",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.7",
"size": 1793224,
"upload_time": "2024-12-27T15:28:29",
"upload_time_iso_8601": "2024-12-27T15:28:29.783419Z",
"url": "https://files.pythonhosted.org/packages/ea/c0/36ecbeeb5249ac3b00c2904ea86ed4b76c8116d8fc0b2aadb2f6bb4ea337/css_inline-0.14.6-pp39-pypy39_pp73-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "38991b9616a58e1a47a7b6f5a2373e9920d8706c6f4c2c3941073cf3b6b9b753",
"md5": "5545c0029154003131009151afb2fd2d",
"sha256": "b4b32dd4d85e4d279a71731e0b811ae8bad76ce8ad3d8faf01e2c2560f7bbdc9"
},
"downloads": -1,
"filename": "css_inline-0.14.6-pp39-pypy39_pp73-manylinux_2_24_aarch64.whl",
"has_sig": false,
"md5_digest": "5545c0029154003131009151afb2fd2d",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.7",
"size": 1877841,
"upload_time": "2024-12-27T15:28:31",
"upload_time_iso_8601": "2024-12-27T15:28:31.313910Z",
"url": "https://files.pythonhosted.org/packages/38/99/1b9616a58e1a47a7b6f5a2373e9920d8706c6f4c2c3941073cf3b6b9b753/css_inline-0.14.6-pp39-pypy39_pp73-manylinux_2_24_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c3e77b202cb9a0cf7297de2669354ac1edad7cbf91bcf73f41be492b100974d7",
"md5": "6a247064ce4a45f9a0698f86ca04f7c4",
"sha256": "6d26158b8e07da92b128df6add77528b54824019f819553d0e61b67e00e585d7"
},
"downloads": -1,
"filename": "css_inline-0.14.6-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "6a247064ce4a45f9a0698f86ca04f7c4",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.7",
"size": 1929301,
"upload_time": "2024-12-27T15:28:34",
"upload_time_iso_8601": "2024-12-27T15:28:34.156415Z",
"url": "https://files.pythonhosted.org/packages/c3/e7/7b202cb9a0cf7297de2669354ac1edad7cbf91bcf73f41be492b100974d7/css_inline-0.14.6-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7c2f4558f2e6a2f1e60fb066c2415189f18d5191f00eeacb82168203565f284a",
"md5": "0f450b08e4b61c46927db52a4cfd69df",
"sha256": "a6ac1411bc9524cab0de59fe87bf1779c822fd6f38d789a037879ebcbcc3e14b"
},
"downloads": -1,
"filename": "css_inline-0.14.6.tar.gz",
"has_sig": false,
"md5_digest": "0f450b08e4b61c46927db52a4cfd69df",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 60589,
"upload_time": "2024-12-27T15:28:37",
"upload_time_iso_8601": "2024-12-27T15:28:37.938213Z",
"url": "https://files.pythonhosted.org/packages/7c/2f/4558f2e6a2f1e60fb066c2415189f18d5191f00eeacb82168203565f284a/css_inline-0.14.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-27 15:28:37",
"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"
}