%global _empty_manifest_terminate_build 0 Name: python-amp-renderer Version: 2.0.1 Release: 1 Summary: Unofficial Python port of server-side rendering from AMP Optimizer License: Apache Software License URL: https://github.com/chasefinch/amp-renderer Source0: https://mirrors.nju.edu.cn/pypi/web/packages/41/2c/ce83e3d26362d83113ace1ebd74c3834f728c266bc7a9a5803d47b229963/amp-renderer-2.0.1.tar.gz BuildArch: noarch %description # AMP Renderer ![Python 3.6+](https://img.shields.io/badge/python-3.6%2B-blue) [![Build Status](https://travis-ci.com/chasefinch/amp-renderer.svg?branch=main)](https://travis-ci.com/chasefinch/amp-renderer) ![Coverage](https://img.shields.io/badge/coverage-90%25-brightgreen) Unofficial Python port of [server-side rendering](https://amp.dev/documentation/guides-and-tutorials/optimize-and-measure/amp-optimizer-guide/explainer/?format=websites) from [AMP Optimizer](https://github.com/ampproject/amp-toolbox/tree/main/packages/optimizer). Supports Python 3.6 and above. AMP Renderer performs the following optimizations: 1. Inject the specific layout markup into each AMP element 2. Insert the AMP runtime styles into the document 3. Remove the AMP boilerplate styles, if possible 4. Mark the document as “transformed” with the appropriate tags on the `html` element 5. Insert `img` tags for images with the data-hero attribute It also makes these formatting updates: 1. Remove empty `class` and `style` tags for AMP HTML elements 2. Convert tag names and attribute names to lowercase 3. Convert numerical attribute values to strings 4. Use double quotes ("") for attributes, and escape double quotes inside attribute values 5. Remove whitespace between html attributes 6. If desired, removes comments (disabled by default) 7. If desired, trims whitespace around HTML attribute values (disabled by default, and not always a good idea) AMPRenderer can be used on a block of arbitrary HTML, but when used on a full document, it will insert the AMP runtime styles and, if possible, remove the AMP boilerplate styles. Boilerplate styles can be removed except in these cases: - An AMP element uses an unsupported value for the `layout` attribute - `amp-audio` is used - There is at least one `amp-experiment` active - Transformation fails for one or more elements due to an invalid attribute value for `media`, `sizes`, or `heights` - Any render-delaying extension is used. Currently this means: - `amp-dynamic-css-classes` - `amp-story` If boilerplate styles can’t be removed, the attribute `no_boilerplate` will be set to `True` after calling `render`; otherwise it will be `False`. Until `render` runs, the `no_boilerplate` attribute isn’t set at all. ## Usage If using Django, you can use the [Django AMP Renderer middleware](https://github.com/chasefinch/django-amp-renderer). Otherwise, install via PyPI: pip install amp-renderer Minimal usage: from amp_renderer import AMPRenderer ... RUNTIME_VERSION = "012345678" /* Current AMP runtime version number */ RUNTIME_STYLES = "..." /* Current contents of https://cdn.ampproject.org/v0.css */ renderer = AMPRenderer( runtime_version=RUNTIME_VERSION, runtime_styles=RUNTIME_STYLES) original_html = """ ... """ result = renderer.render(original_html) print(result) Remove comments and/or trim attributes: renderer.should_strip_comments = True renderer.should_trim_attributes = True result = renderer.render(original_html) print(result) The AMPRenderer class inherits from [HTMLParser](https://docs.python.org/3/library/html.parser.html), and can be similarly extended. ## Testing, etc. Install requrements: make install Sort imports (Requires Python >= 3.8): make format Lint (Requires Python >= 3.8): make lint Test: make test ## Discussion There are still some aspects of the official AMP Optimizer implementation that haven’t been addressed yet. PRs welcome. ### General - [x] ~Tested against AMP Optimizer’s ServerSideRendering spec~ - [ ] Automatic runtime version management ### Dynamic attributes - [x] ~Support `sizes`, `media`, and `heights` via CSS injection~ - [x] ~Group CSS injections for `media` attributes by shared media queries to reduce necessary bytes~ - [ ] Support percent values in `heights` - [ ] Warn or fail if CSS injection puts the `amp-custom` element over the byte limit ### Hero Images - [x] ~Inject `img` tag for `amp-img`s with the `data-hero` attribute~ - [ ] Enforce 2-image limit on `data-hero` - [ ] Autodetect hero images - [ ] Support hero image functionality for `amp-iframe`, `amp-video`, and `amp-video-iframe` ### Performance The Python AMP Renderer does not insert `preload` links into the `head` of the DOM object for hero images; This can be done by hand for more control over the critical path. %package -n python3-amp-renderer Summary: Unofficial Python port of server-side rendering from AMP Optimizer Provides: python-amp-renderer BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-amp-renderer # AMP Renderer ![Python 3.6+](https://img.shields.io/badge/python-3.6%2B-blue) [![Build Status](https://travis-ci.com/chasefinch/amp-renderer.svg?branch=main)](https://travis-ci.com/chasefinch/amp-renderer) ![Coverage](https://img.shields.io/badge/coverage-90%25-brightgreen) Unofficial Python port of [server-side rendering](https://amp.dev/documentation/guides-and-tutorials/optimize-and-measure/amp-optimizer-guide/explainer/?format=websites) from [AMP Optimizer](https://github.com/ampproject/amp-toolbox/tree/main/packages/optimizer). Supports Python 3.6 and above. AMP Renderer performs the following optimizations: 1. Inject the specific layout markup into each AMP element 2. Insert the AMP runtime styles into the document 3. Remove the AMP boilerplate styles, if possible 4. Mark the document as “transformed” with the appropriate tags on the `html` element 5. Insert `img` tags for images with the data-hero attribute It also makes these formatting updates: 1. Remove empty `class` and `style` tags for AMP HTML elements 2. Convert tag names and attribute names to lowercase 3. Convert numerical attribute values to strings 4. Use double quotes ("") for attributes, and escape double quotes inside attribute values 5. Remove whitespace between html attributes 6. If desired, removes comments (disabled by default) 7. If desired, trims whitespace around HTML attribute values (disabled by default, and not always a good idea) AMPRenderer can be used on a block of arbitrary HTML, but when used on a full document, it will insert the AMP runtime styles and, if possible, remove the AMP boilerplate styles. Boilerplate styles can be removed except in these cases: - An AMP element uses an unsupported value for the `layout` attribute - `amp-audio` is used - There is at least one `amp-experiment` active - Transformation fails for one or more elements due to an invalid attribute value for `media`, `sizes`, or `heights` - Any render-delaying extension is used. Currently this means: - `amp-dynamic-css-classes` - `amp-story` If boilerplate styles can’t be removed, the attribute `no_boilerplate` will be set to `True` after calling `render`; otherwise it will be `False`. Until `render` runs, the `no_boilerplate` attribute isn’t set at all. ## Usage If using Django, you can use the [Django AMP Renderer middleware](https://github.com/chasefinch/django-amp-renderer). Otherwise, install via PyPI: pip install amp-renderer Minimal usage: from amp_renderer import AMPRenderer ... RUNTIME_VERSION = "012345678" /* Current AMP runtime version number */ RUNTIME_STYLES = "..." /* Current contents of https://cdn.ampproject.org/v0.css */ renderer = AMPRenderer( runtime_version=RUNTIME_VERSION, runtime_styles=RUNTIME_STYLES) original_html = """ ... """ result = renderer.render(original_html) print(result) Remove comments and/or trim attributes: renderer.should_strip_comments = True renderer.should_trim_attributes = True result = renderer.render(original_html) print(result) The AMPRenderer class inherits from [HTMLParser](https://docs.python.org/3/library/html.parser.html), and can be similarly extended. ## Testing, etc. Install requrements: make install Sort imports (Requires Python >= 3.8): make format Lint (Requires Python >= 3.8): make lint Test: make test ## Discussion There are still some aspects of the official AMP Optimizer implementation that haven’t been addressed yet. PRs welcome. ### General - [x] ~Tested against AMP Optimizer’s ServerSideRendering spec~ - [ ] Automatic runtime version management ### Dynamic attributes - [x] ~Support `sizes`, `media`, and `heights` via CSS injection~ - [x] ~Group CSS injections for `media` attributes by shared media queries to reduce necessary bytes~ - [ ] Support percent values in `heights` - [ ] Warn or fail if CSS injection puts the `amp-custom` element over the byte limit ### Hero Images - [x] ~Inject `img` tag for `amp-img`s with the `data-hero` attribute~ - [ ] Enforce 2-image limit on `data-hero` - [ ] Autodetect hero images - [ ] Support hero image functionality for `amp-iframe`, `amp-video`, and `amp-video-iframe` ### Performance The Python AMP Renderer does not insert `preload` links into the `head` of the DOM object for hero images; This can be done by hand for more control over the critical path. %package help Summary: Development documents and examples for amp-renderer Provides: python3-amp-renderer-doc %description help # AMP Renderer ![Python 3.6+](https://img.shields.io/badge/python-3.6%2B-blue) [![Build Status](https://travis-ci.com/chasefinch/amp-renderer.svg?branch=main)](https://travis-ci.com/chasefinch/amp-renderer) ![Coverage](https://img.shields.io/badge/coverage-90%25-brightgreen) Unofficial Python port of [server-side rendering](https://amp.dev/documentation/guides-and-tutorials/optimize-and-measure/amp-optimizer-guide/explainer/?format=websites) from [AMP Optimizer](https://github.com/ampproject/amp-toolbox/tree/main/packages/optimizer). Supports Python 3.6 and above. AMP Renderer performs the following optimizations: 1. Inject the specific layout markup into each AMP element 2. Insert the AMP runtime styles into the document 3. Remove the AMP boilerplate styles, if possible 4. Mark the document as “transformed” with the appropriate tags on the `html` element 5. Insert `img` tags for images with the data-hero attribute It also makes these formatting updates: 1. Remove empty `class` and `style` tags for AMP HTML elements 2. Convert tag names and attribute names to lowercase 3. Convert numerical attribute values to strings 4. Use double quotes ("") for attributes, and escape double quotes inside attribute values 5. Remove whitespace between html attributes 6. If desired, removes comments (disabled by default) 7. If desired, trims whitespace around HTML attribute values (disabled by default, and not always a good idea) AMPRenderer can be used on a block of arbitrary HTML, but when used on a full document, it will insert the AMP runtime styles and, if possible, remove the AMP boilerplate styles. Boilerplate styles can be removed except in these cases: - An AMP element uses an unsupported value for the `layout` attribute - `amp-audio` is used - There is at least one `amp-experiment` active - Transformation fails for one or more elements due to an invalid attribute value for `media`, `sizes`, or `heights` - Any render-delaying extension is used. Currently this means: - `amp-dynamic-css-classes` - `amp-story` If boilerplate styles can’t be removed, the attribute `no_boilerplate` will be set to `True` after calling `render`; otherwise it will be `False`. Until `render` runs, the `no_boilerplate` attribute isn’t set at all. ## Usage If using Django, you can use the [Django AMP Renderer middleware](https://github.com/chasefinch/django-amp-renderer). Otherwise, install via PyPI: pip install amp-renderer Minimal usage: from amp_renderer import AMPRenderer ... RUNTIME_VERSION = "012345678" /* Current AMP runtime version number */ RUNTIME_STYLES = "..." /* Current contents of https://cdn.ampproject.org/v0.css */ renderer = AMPRenderer( runtime_version=RUNTIME_VERSION, runtime_styles=RUNTIME_STYLES) original_html = """ ... """ result = renderer.render(original_html) print(result) Remove comments and/or trim attributes: renderer.should_strip_comments = True renderer.should_trim_attributes = True result = renderer.render(original_html) print(result) The AMPRenderer class inherits from [HTMLParser](https://docs.python.org/3/library/html.parser.html), and can be similarly extended. ## Testing, etc. Install requrements: make install Sort imports (Requires Python >= 3.8): make format Lint (Requires Python >= 3.8): make lint Test: make test ## Discussion There are still some aspects of the official AMP Optimizer implementation that haven’t been addressed yet. PRs welcome. ### General - [x] ~Tested against AMP Optimizer’s ServerSideRendering spec~ - [ ] Automatic runtime version management ### Dynamic attributes - [x] ~Support `sizes`, `media`, and `heights` via CSS injection~ - [x] ~Group CSS injections for `media` attributes by shared media queries to reduce necessary bytes~ - [ ] Support percent values in `heights` - [ ] Warn or fail if CSS injection puts the `amp-custom` element over the byte limit ### Hero Images - [x] ~Inject `img` tag for `amp-img`s with the `data-hero` attribute~ - [ ] Enforce 2-image limit on `data-hero` - [ ] Autodetect hero images - [ ] Support hero image functionality for `amp-iframe`, `amp-video`, and `amp-video-iframe` ### Performance The Python AMP Renderer does not insert `preload` links into the `head` of the DOM object for hero images; This can be done by hand for more control over the critical path. %prep %autosetup -n amp-renderer-2.0.1 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-amp-renderer -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Fri May 05 2023 Python_Bot - 2.0.1-1 - Package Spec generated