Initial Commit
This commit is contained in:
345
.gitignore
vendored
Normal file
345
.gitignore
vendored
Normal file
@@ -0,0 +1,345 @@
|
||||
/nbproject/
|
||||
/system/IECache/**/*
|
||||
/multiCMS/updateFramework.php
|
||||
*.epub
|
||||
#/multiCMS/system/DBData/Installation.pfdb.php
|
||||
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/phpstorm+all,python,visualstudiocode,pycharm+all
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=phpstorm+all,python,visualstudiocode,pycharm+all
|
||||
|
||||
### PhpStorm+all ###
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# AWS User-specific
|
||||
.idea/**/aws.xml
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/artifacts
|
||||
# .idea/compiler.xml
|
||||
# .idea/jarRepositories.xml
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
# *.iml
|
||||
# *.ipr
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# SonarLint plugin
|
||||
.idea/sonarlint/
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
### PhpStorm+all Patch ###
|
||||
# Ignore everything but code style settings and run configurations
|
||||
# that are supposed to be shared within teams.
|
||||
|
||||
.idea/*
|
||||
|
||||
!.idea/codeStyles
|
||||
!.idea/runConfigurations
|
||||
|
||||
### PyCharm+all ###
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff
|
||||
|
||||
# AWS User-specific
|
||||
|
||||
# Generated files
|
||||
|
||||
# Sensitive or high-churn files
|
||||
|
||||
# Gradle
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/artifacts
|
||||
# .idea/compiler.xml
|
||||
# .idea/jarRepositories.xml
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
# *.iml
|
||||
# *.ipr
|
||||
|
||||
# CMake
|
||||
|
||||
# Mongo Explorer plugin
|
||||
|
||||
# File-based project format
|
||||
|
||||
# IntelliJ
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
|
||||
# JIRA plugin
|
||||
|
||||
# Cursive Clojure plugin
|
||||
|
||||
# SonarLint plugin
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
|
||||
# Editor-based Rest Client
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
|
||||
### PyCharm+all Patch ###
|
||||
# Ignore everything but code style settings and run configurations
|
||||
# that are supposed to be shared within teams.
|
||||
|
||||
|
||||
|
||||
### Python ###
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
cover/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
.pybuilder/
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
# For a library or package, you might want to ignore these files since the code is
|
||||
# intended to run in multiple environments; otherwise, check them in:
|
||||
# .python-version
|
||||
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
#Pipfile.lock
|
||||
|
||||
# poetry
|
||||
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||
#poetry.lock
|
||||
|
||||
# pdm
|
||||
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||
#pdm.lock
|
||||
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
||||
# in version control.
|
||||
# https://pdm.fming.dev/#use-with-ide
|
||||
.pdm.toml
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# pytype static type analyzer
|
||||
.pytype/
|
||||
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
# PyCharm
|
||||
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
#.idea/
|
||||
|
||||
### Python Patch ###
|
||||
# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
|
||||
poetry.toml
|
||||
|
||||
# ruff
|
||||
.ruff_cache/
|
||||
|
||||
# LSP config files
|
||||
pyrightconfig.json
|
||||
|
||||
### VisualStudioCode ###
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
!.vscode/*.code-snippets
|
||||
|
||||
# Local History for Visual Studio Code
|
||||
.history/
|
||||
|
||||
# Built Visual Studio Code Extensions
|
||||
*.vsix
|
||||
|
||||
### VisualStudioCode Patch ###
|
||||
# Ignore all local history of files
|
||||
.history
|
||||
.ionide
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/phpstorm+all,python,visualstudiocode,pycharm+all
|
||||
|
||||
10
blocklist.txt
Normal file
10
blocklist.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
html body div.navi-gb
|
||||
html body h5
|
||||
html body div.dropdown
|
||||
html body div.anzeige-chap
|
||||
html body a
|
||||
html body hr
|
||||
html body h3.author
|
||||
html body h2.title
|
||||
html body div.bottomnavi-gb
|
||||
html head
|
||||
84
convert.py
Normal file
84
convert.py
Normal file
@@ -0,0 +1,84 @@
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
from urllib.parse import urljoin
|
||||
from urllib.request import urlopen, urlparse
|
||||
|
||||
import os, sys
|
||||
from pathlib import Path
|
||||
class GBConvert():
|
||||
#TODO fix toc / headings
|
||||
def __init__(self
|
||||
, url:str
|
||||
):
|
||||
self.root = os.path.dirname(url)
|
||||
self.url = urlparse(self.root)
|
||||
self.output = self.url.netloc + self.url.path
|
||||
self.blocklist = open('blocklist.txt', 'r').read().splitlines()
|
||||
|
||||
def get_meta(self):
|
||||
response = requests.get(self.root)
|
||||
response.raise_for_status()
|
||||
soup = BeautifulSoup(response.content, 'html.parser')
|
||||
self.author = soup.find('meta', {'name': 'author'})['content']
|
||||
self.title = soup.find('meta', {'name': 'title'})['content']
|
||||
self.toc = soup.find('ul').find_all('a')
|
||||
|
||||
def save_page(self, url):
|
||||
# https://superuser.com/questions/970323/using-wget-to-copy-website-with-proper-layout-for-offline-browsing
|
||||
command = f'''wget \
|
||||
--page-requisites \
|
||||
--convert-links \
|
||||
--execute \
|
||||
--tries=5 \
|
||||
--quiet \
|
||||
{url}'''
|
||||
os.system(command)
|
||||
|
||||
def clean_page(self,file_path):
|
||||
f = open(file_path, 'r').read()
|
||||
soup = BeautifulSoup(f, 'html.parser')
|
||||
for blocker in self.blocklist:
|
||||
for item in soup.select(blocker):
|
||||
item.decompose()
|
||||
open(file_path, 'w').write(str(soup))
|
||||
|
||||
|
||||
def create_epub(self, filename='out.epub'):
|
||||
os.chdir(self.output)
|
||||
command = f'''pandoc -f html -t epub \
|
||||
-o "{filename}" \
|
||||
--reference-location=section \
|
||||
--css=../../../drama.css \
|
||||
--metadata title="{self.title}" \
|
||||
--metadata author="{self.author}" \
|
||||
--epub-title-page=false \
|
||||
{" ".join(self.chapters)} '''#TODO --epub-cover-image
|
||||
os.system(command)
|
||||
|
||||
def run(self):
|
||||
#TODO include images flag
|
||||
|
||||
self.get_meta()
|
||||
|
||||
map(lambda x: self.save_page(os.path.join(self.root, x['href'])), self.toc)
|
||||
self.chapters = []
|
||||
for item in self.toc:
|
||||
item_title= item.get_text()
|
||||
item_url = os.path.join(self.root, item['href'])
|
||||
self.save_page(url=item_url)
|
||||
parsed_url = urlparse(item_url)
|
||||
filepath = parsed_url.netloc + parsed_url.path
|
||||
self.clean_page(filepath)
|
||||
self.chapters.append(item['href'])
|
||||
|
||||
self.create_epub(f'{self.title} - {self.author}.epub')
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
g = GBConvert(sys.argv[1])
|
||||
g.run()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
464
drama.css
Normal file
464
drama.css
Normal file
@@ -0,0 +1,464 @@
|
||||
/* drama.css - Stand März 2024 */
|
||||
body {
|
||||
margin-right: 10%;
|
||||
margin-left: 10%;
|
||||
margin-top: 0%;
|
||||
margin-bottom: 1%;
|
||||
}
|
||||
.toc {
|
||||
display: none;
|
||||
}
|
||||
a:link {
|
||||
color: #039;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:visited {
|
||||
color: #039;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover {
|
||||
color: #039;
|
||||
text-decoration: none;
|
||||
background-color: #e0e0e0;
|
||||
}
|
||||
a:active {
|
||||
color: #039;
|
||||
text-decoration: none;
|
||||
}
|
||||
td {
|
||||
font-family: "Arial", sans-serif;
|
||||
}
|
||||
.mainnav {
|
||||
font-family: "Arial", sans-serif;
|
||||
font-variant: small-caps;
|
||||
background-color: #fff;
|
||||
text-align: center;
|
||||
border-top: 1px #d26402 solid;
|
||||
border-bottom: 1px #d26402 solid;
|
||||
}
|
||||
.mainnav-ed {
|
||||
font-family: "Arial", sans-serif;
|
||||
background-color: #fff;
|
||||
text-align: center;
|
||||
border-top: 1px #cc6060 solid;
|
||||
border-bottom: 1px #cc6060 solid;
|
||||
}
|
||||
.autalpha {
|
||||
font-family: "Arial", sans-serif;
|
||||
text-align: center;
|
||||
}
|
||||
.trenner {
|
||||
font-size: 10pt;
|
||||
font-weight: bold;
|
||||
color: #d26402;
|
||||
}
|
||||
.right {
|
||||
text-align: right;
|
||||
}
|
||||
.left {
|
||||
text-align: left;
|
||||
}
|
||||
.authorlist {
|
||||
text-align: left;
|
||||
}
|
||||
.author {
|
||||
color: gray;
|
||||
}
|
||||
.box {
|
||||
margin: 1.5em 15%;
|
||||
border: 1px solid #666;
|
||||
padding: 1em;
|
||||
}
|
||||
.dedication {
|
||||
text-indent: 0;
|
||||
text-align: center;
|
||||
font-size: 1.5em;
|
||||
margin-top: 2em;
|
||||
margin-bottom: 2em;
|
||||
margin-left: 20%;
|
||||
margin-right: 20%;
|
||||
}
|
||||
.figcaption {
|
||||
text-indent: 0;
|
||||
text-align: center;
|
||||
font-style: italic;
|
||||
}
|
||||
.figure {
|
||||
text-indent: 0;
|
||||
text-align: center;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
.fraktur {
|
||||
font-family: "Frankenstein", "Times", serif;
|
||||
}
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
.lektorat {
|
||||
color: red;
|
||||
}
|
||||
.motto {
|
||||
text-indent: 0;
|
||||
margin-right: 5em;
|
||||
margin-left: 50%;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
.note {
|
||||
line-height: 90%;
|
||||
font-size: 90%;
|
||||
}
|
||||
.online {
|
||||
display: none;
|
||||
}
|
||||
.recipient {
|
||||
margin-left: -1em;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
.regie, .action {
|
||||
font-size: 90%;
|
||||
font-style: italic;
|
||||
}
|
||||
.sender {
|
||||
margin-left: 2em;
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
color: darkblue;
|
||||
}
|
||||
.signatur, .signature {
|
||||
text-align: right;
|
||||
margin-right: 2em;
|
||||
}
|
||||
.smallcaps {
|
||||
font-variant: small-caps;
|
||||
}
|
||||
.speaker {
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
}
|
||||
.subtitle {
|
||||
color: darkgray;
|
||||
}
|
||||
.title {
|
||||
font-size: 2em;
|
||||
}
|
||||
.upper {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.wide, .spaced {
|
||||
letter-spacing: 0.15em;
|
||||
}
|
||||
h1, h2, h3, h4, h6 {
|
||||
text-align: center;
|
||||
}
|
||||
h5 {
|
||||
text-align: center;
|
||||
font-size: 90%;
|
||||
color: #808080;
|
||||
font-weight: normal;
|
||||
}
|
||||
p {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
margin-left: 2em;
|
||||
text-indent: -2em;
|
||||
}
|
||||
p.abstract, p.stage {
|
||||
font-size: 90%;
|
||||
font-style: italic;
|
||||
margin-left: 3em;
|
||||
margin-right: 3em;
|
||||
text-indent: 0;
|
||||
text-align: justify;
|
||||
}
|
||||
p.address {
|
||||
text-align: right;
|
||||
text-indent: 0;
|
||||
font-style: italic;
|
||||
}
|
||||
p.center {
|
||||
text-indent: 0;
|
||||
margin-left: 0;
|
||||
text-align: center;
|
||||
}
|
||||
p.centerbig {
|
||||
margin-left: 0;
|
||||
margin-bottom: 0.6em;
|
||||
margin-top: 0.6em;
|
||||
text-indent: 0;
|
||||
text-align: center;
|
||||
font-size: 115%;
|
||||
}
|
||||
p.centersml {
|
||||
margin-left: 0;
|
||||
text-indent: 0;
|
||||
text-align: center;
|
||||
font-size: 90%;
|
||||
margin-bottom: 0.3em;
|
||||
margin-top: 0.3em;
|
||||
}
|
||||
p.date {
|
||||
text-align: right;
|
||||
font-style: italic;
|
||||
}
|
||||
p.dblmarg {
|
||||
text-indent: 0;
|
||||
margin-left: 10%;
|
||||
margin-right: 10%;
|
||||
}
|
||||
p.epigraph {
|
||||
text-indent: 0;
|
||||
text-align: right;
|
||||
margin-right: 5%;
|
||||
font-style: italic;
|
||||
}
|
||||
p.initial {
|
||||
text-indent: 0;
|
||||
margin-left: 0;
|
||||
text-align: justify;
|
||||
}
|
||||
p.initial:first-letter {
|
||||
font-size: 180%;
|
||||
}
|
||||
p.left {
|
||||
margin-left: 0;
|
||||
text-indent: 0;
|
||||
text-align: left;
|
||||
}
|
||||
p.leftjust {
|
||||
text-indent: 0;
|
||||
margin-left: 0;
|
||||
text-align: justify;
|
||||
}
|
||||
p.leftmarg {
|
||||
text-indent: 0;
|
||||
text-align: left;
|
||||
margin-left: 2em;
|
||||
}
|
||||
p.line {
|
||||
text-align: left;
|
||||
text-indent: 0;
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
p.poem, p.vers {
|
||||
text-indent: 0;
|
||||
text-align: left;
|
||||
margin-left: 2em;
|
||||
}
|
||||
p.prosa {
|
||||
margin-left: 0;
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
text-indent: 0.8em;
|
||||
text-align: justify;
|
||||
}
|
||||
p.right {
|
||||
margin-left: 0;
|
||||
text-indent: 0;
|
||||
text-align: right;
|
||||
}
|
||||
p.scene {
|
||||
text-align: center;
|
||||
margin-left: 0;
|
||||
text-indent: 0;
|
||||
font-style: italic;
|
||||
}
|
||||
hr {
|
||||
border: 1px solid;
|
||||
text-align: center;
|
||||
color: #999;
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
hr.short {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
margin-left: 40%;
|
||||
width: 20%;
|
||||
text-align: center;
|
||||
}
|
||||
hr.star {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
width: 20%;
|
||||
}
|
||||
span.tooltip {
|
||||
color: #800000;
|
||||
}
|
||||
/* span.footnote { display:inline }
|
||||
span.footnote a:hover { background-color: #2B2E21; color:#fff }
|
||||
span.footnote a:link span, span.footnote a:visited span { display: none }
|
||||
span.footnote a:hover span.fntext { position: absolute; margin:20px; background-color: beige;
|
||||
max-width:400px; padding: 5px 10px 5px 10px; border: 1px solid #C0C0C0;
|
||||
font: normal 12px/14px arial; color: #000; text-align:left;
|
||||
display: block; text-decoration:none; left:10px } */
|
||||
span.footnote:before {
|
||||
content: " [Fußnote: ";
|
||||
color: #505050;
|
||||
}
|
||||
span.footnote:after {
|
||||
content: "] ";
|
||||
color: #505050;
|
||||
}
|
||||
span.footnote {
|
||||
color: #505050;
|
||||
font-size: 90%;
|
||||
}
|
||||
div.epigraph {
|
||||
margin-left: 50%;
|
||||
margin-right: 5%;
|
||||
font-style: italic;
|
||||
}
|
||||
div.motto p {
|
||||
text-align: left;
|
||||
text-indent: 0;
|
||||
margin-right: 5em;
|
||||
}
|
||||
div.titlepage {
|
||||
text-align: center;
|
||||
}
|
||||
.bottomnavi-gb {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
table.left {
|
||||
margin-left: 0;
|
||||
margin-right: auto;
|
||||
}
|
||||
table.poem {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: left;
|
||||
}
|
||||
table.right {
|
||||
margin-left: auto;
|
||||
margin-right: 0;
|
||||
}
|
||||
table.toc {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
margin-top: 0.3em;
|
||||
text-align: center;
|
||||
}
|
||||
table.toc td {
|
||||
padding: 0 0.25em;
|
||||
text-align: left;
|
||||
}
|
||||
table.true {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
margin-top: 0.3em;
|
||||
margin-bottom: 0.3em;
|
||||
text-align: left;
|
||||
}
|
||||
img.left {
|
||||
float: left;
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
margin-right: 0.5em;
|
||||
}
|
||||
img.right {
|
||||
float: right;
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
div.letter {
|
||||
text-align: left;
|
||||
margin-left: 1.5em;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
div.letter p {
|
||||
text-indent: 0;
|
||||
}
|
||||
a.pageref {
|
||||
display: none;
|
||||
}
|
||||
a.pageref:before {
|
||||
content: "[";
|
||||
}
|
||||
a.pageref:after {
|
||||
content: "]";
|
||||
}
|
||||
dd {
|
||||
margin-left: 2em;
|
||||
}
|
||||
dl {
|
||||
margin-left: 1.5em;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
dt {
|
||||
font-weight: bold;
|
||||
margin-top: 4pt;
|
||||
}
|
||||
del {
|
||||
color: red;
|
||||
}
|
||||
ins {
|
||||
color: blue;
|
||||
}
|
||||
p.stars {
|
||||
text-indent: 0;
|
||||
text-align: center;
|
||||
font-size: 200%;
|
||||
letter-spacing: 0.3em;
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
sup {
|
||||
font-size: 70%;
|
||||
vertical-align: text-top;
|
||||
}
|
||||
sup.fract {
|
||||
font-size: 70%;
|
||||
vertical-align: text-top;
|
||||
}
|
||||
sub.fract {
|
||||
font-size: 70%;
|
||||
vertical-align: text-bottom;
|
||||
}
|
||||
tt {
|
||||
font-family: "Courier", monospace;
|
||||
}
|
||||
ul {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
div.poem {
|
||||
text-align: left;
|
||||
margin: 1em 2em;
|
||||
}
|
||||
div.poem blockquote {
|
||||
text-align: left;
|
||||
text-indent: 0;
|
||||
margin-left: 1em;
|
||||
}
|
||||
div.poem blockquote p {
|
||||
text-align: left;
|
||||
text-indent: 0;
|
||||
margin-left: 1em;
|
||||
}
|
||||
div.vers {
|
||||
text-indent: 0;
|
||||
text-align: left;
|
||||
margin: 1em 2em;
|
||||
}
|
||||
div.vers p {
|
||||
text-indent: 0;
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
div.anzeige-chap {
|
||||
background-color: #eeeeee;
|
||||
padding-top: 0.5em;
|
||||
padding-left: 2.5em;
|
||||
padding-right: 2.5em;
|
||||
padding-bottom: 1em;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
requests==2.32.3
|
||||
beautifulsoup4==4.12.3
|
||||
urllib3==2.2.2
|
||||
25
test.py
Normal file
25
test.py
Normal file
@@ -0,0 +1,25 @@
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
import os
|
||||
|
||||
from convert import GBConvert
|
||||
|
||||
def main():
|
||||
allbooks_relative_url ='/info/texte/allworka.html'
|
||||
root_url = 'https://www.projekt-gutenberg.org'
|
||||
allbooks_url = root_url + allbooks_relative_url
|
||||
response = requests.get(allbooks_url)
|
||||
if (response.status_code != 200): raise Exception(f'Couldnt fetch root page {self.root}')
|
||||
soup = BeautifulSoup(response.content, 'html.parser')
|
||||
books = soup.find('dl').find_all('a')
|
||||
for book in books:
|
||||
book_title = book.get_text()
|
||||
book_url_relative = book.get('href')
|
||||
if book_url_relative is not None:
|
||||
book_url = root_url + os.path.dirname(book_url_relative)[5:]
|
||||
gb = GBConvert(book_url)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user