mirror of
https://codeberg.org/privacy1st/image-width-limit
synced 2024-12-03 22:15:02 +01:00
init
This commit is contained in:
commit
fc193738a4
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
/pkg/
|
||||
/src/
|
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
1
.idea/.name
generated
Normal file
1
.idea/.name
generated
Normal file
@ -0,0 +1 @@
|
||||
image-width-limit
|
11
.idea/image-width-limit.iml
generated
Normal file
11
.idea/image-width-limit.iml
generated
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/pkg" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/src" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
14
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
14
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@ -0,0 +1,14 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="PyCompatibilityInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ourVersions">
|
||||
<value>
|
||||
<list size="1">
|
||||
<item index="0" class="java.lang.String" itemvalue="3.10" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
4
.idea/misc.xml
generated
Normal file
4
.idea/misc.xml
generated
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (venv39-2)" project-jdk-type="Python SDK" />
|
||||
</project>
|
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/../image-width-limit/.idea/image-width-limit.iml" filepath="$PROJECT_DIR$/../image-width-limit/.idea/image-width-limit.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
17
PKGBUILD
Normal file
17
PKGBUILD
Normal file
@ -0,0 +1,17 @@
|
||||
# Maintainer: Daniel Langbein <daniel@systemli.org>
|
||||
_pkgname=image-width-limit
|
||||
_reponame=arch
|
||||
|
||||
pkgname="de-p1st-$_pkgname"
|
||||
pkgver=1.0.0
|
||||
pkgrel=0
|
||||
pkgdesc="Script to limit HTML image width"
|
||||
arch=('any')
|
||||
license=('MIT')
|
||||
depends=('python3' 'python-beautifulsoup4' 'python-html5lib')
|
||||
source=("${_pkgname}".py)
|
||||
sha256sums=('88b20a75bdfd7f0f0ff6054ff8a6e77783e21488ef3d8ecc5cfadb7fcdf37d6e')
|
||||
|
||||
package() {
|
||||
install -Dm0755 "${_pkgname}".py "$pkgdir"/usr/bin/"${pkgname}"
|
||||
}
|
46
README.md
Normal file
46
README.md
Normal file
@ -0,0 +1,46 @@
|
||||
# (HTML) Image width limit
|
||||
|
||||
From [image-width-limit.py](image-width-limit.py), function `limit_image_width`:
|
||||
|
||||
> When converting HTML5 to other formats, e.g. PDF, it
|
||||
> may happen that too wide images get cropped of.
|
||||
>
|
||||
> If there are HTML5 image tags which do only contain
|
||||
> the 'src' and 'alt' attribute, then this method adds
|
||||
> a style attribute limiting the image width to each of
|
||||
> those image tags.
|
||||
|
||||
## Global Installation - Arch Linux
|
||||
|
||||
To install the script as `de-p1st-image-width-limit` run the following:
|
||||
|
||||
```shell
|
||||
makepkg -fCcsri
|
||||
```
|
||||
|
||||
## Manual Installation
|
||||
|
||||
Install the python3 dependencies, e.g. with pip:
|
||||
|
||||
* `beautifulsoup4` (`pacman -S python-beautifulsoup4`)
|
||||
* `html5lib` (`pacman -S python-html5lib`)
|
||||
|
||||
And make the python script executable:
|
||||
|
||||
```shell
|
||||
chmod +x ./image-width-limit.py
|
||||
```
|
||||
|
||||
## Example
|
||||
|
||||
Global installation:
|
||||
|
||||
```shell
|
||||
de-p1st-image-width-limit example.html modified-example.html
|
||||
```
|
||||
|
||||
Local installation:
|
||||
|
||||
```shell
|
||||
python3 ./image-width-limit.py example.html modified-example.html
|
||||
```
|
3
example.html
Normal file
3
example.html
Normal file
@ -0,0 +1,3 @@
|
||||
<h1>Responsive Images</h1>
|
||||
<h2>Example</h2>
|
||||
<p><img src="image.png" alt="" /></p>
|
82
image-width-limit.py
Normal file
82
image-width-limit.py
Normal file
@ -0,0 +1,82 @@
|
||||
#!/usr/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from pathlib import Path
|
||||
from sys import argv
|
||||
from typing import Dict
|
||||
|
||||
from bs4 import BeautifulSoup, ResultSet
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
Python3 dependencies:
|
||||
-> beautifulsoup4 (pacman -S python-beautifulsoup4)
|
||||
-> html5lib (pacman -S python-html5lib)
|
||||
"""
|
||||
|
||||
if len(argv) < 2 or len(argv) > 3:
|
||||
raise "usage: <input_file> [<output_file>]"
|
||||
input_file = Path(argv[1])
|
||||
|
||||
if len(argv) == 3:
|
||||
output_file = Path(argv[2])
|
||||
else: # len(argv) == 2
|
||||
output_file = input_file
|
||||
|
||||
# Read input file
|
||||
with open(input_file) as f:
|
||||
html_str = f.read()
|
||||
|
||||
modified_html_str = limit_image_width(html_str)
|
||||
|
||||
# Write to new file -> overwrite if already existent!
|
||||
with open(output_file, mode='w') as f:
|
||||
f.write(modified_html_str)
|
||||
|
||||
|
||||
def limit_image_width(html_str) -> str:
|
||||
"""
|
||||
When converting HTML5 to other formats, e.g. PDF, it
|
||||
may happen that too wide images get cropped of.
|
||||
|
||||
If there are HTML5 image tags which do only contain
|
||||
the 'src' and 'alt' attribute, then this method adds
|
||||
a style attribute limiting the image width to each of
|
||||
those image tags.
|
||||
|
||||
:param html_str: HTML5
|
||||
:return: modified HTML5 with max-width attribute added to image tags without size attributes
|
||||
"""
|
||||
|
||||
html_parser = 'html5lib'
|
||||
soup = BeautifulSoup(markup=html_str, features=html_parser)
|
||||
|
||||
tag_name = 'img'
|
||||
img_tags: ResultSet = soup.find_all(name=tag_name, recursive=True)
|
||||
|
||||
for img_tag in img_tags:
|
||||
attrs: Dict = img_tag.attrs
|
||||
if 'src' not in attrs.keys():
|
||||
raise 'src attr missing!'
|
||||
if 'alt' not in attrs.keys():
|
||||
attrs['alt'] = attrs['src']
|
||||
|
||||
# Any other attrs apart from 'src' and 'alt' may specify the image size and position.
|
||||
# If such attrs do already exist, we continue with the next image.
|
||||
# Otherwise: We add an attribute to fit the image to the screen/page.
|
||||
if len(attrs) > 2:
|
||||
continue
|
||||
|
||||
# Prevent too wide images.
|
||||
# Sources:
|
||||
# -> https://www.smashingmagazine.com/2020/03/setting-height-width-images-important-again/
|
||||
# -> https://www.w3schools.com/tags/att_style.asp
|
||||
attrs['style'] = 'max-width:100%;height:auto;'
|
||||
|
||||
# return soup.prettify()
|
||||
return str(soup)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Reference in New Issue
Block a user