Browse Source

here we go :)

master
manetta 3 years ago
commit
ca04c97fff
  1. 13
      Makefile
  2. 180
      css/interface.css
  3. 128
      css/print.css
  4. 31061
      js/paged.js
  5. 31107
      js/paged.polyfill.js
  6. 12
      template.debug.html
  7. 15
      template.html
  8. 151
      update.py

13
Makefile

@ -0,0 +1,13 @@
all: run
run:
python3 -m http.server
update:
python3 update.py
upload:
scp -r Unfolded.html css js fonts varia:public_html/volumetric-regimes/
uploadimages:
scp -r images varia:public_html/volumetric-regimes/

180
css/interface.css

@ -0,0 +1,180 @@
/* CSS for Paged.js interface – v0.2 */
/* Change the look */
:root {
--color-background: whitesmoke;
--color-pageSheet: #cfcfcf;
--color-pageBox: violet;
--color-paper: white;
--color-marginBox: transparent;
--pagedjs-crop-color: black;
--pagedjs-crop-shadow: white;
--pagedjs-crop-stroke: 1px;
}
/* To define how the book look on the screen: */
@media screen {
body {
background-color: var(--color-background);
}
.pagedjs_pages {
display: flex;
width: calc(var(--pagedjs-width) * 2);
flex: 0;
flex-wrap: wrap;
margin: 0 auto;
}
.pagedjs_page {
background-color: var(--color-paper);
box-shadow: 0 0 0 1px var(--color-pageSheet);
margin: 0;
flex-shrink: 0;
flex-grow: 0;
margin-top: 10mm;
}
.pagedjs_first_page {
margin-left: var(--pagedjs-width);
}
.pagedjs_page:last-of-type {
margin-bottom: 10mm;
}
.pagedjs_pagebox{
box-shadow: 0 0 0 1px var(--color-pageBox);
}
.pagedjs_left_page{
z-index: 20;
width: calc(var(--pagedjs-bleed-left) + var(--pagedjs-pagebox-width))!important;
}
.pagedjs_left_page .pagedjs_bleed-right .pagedjs_marks-crop {
border-color: transparent;
}
.pagedjs_left_page .pagedjs_bleed-right .pagedjs_marks-middle{
width: 0;
}
.pagedjs_right_page{
z-index: 10;
position: relative;
left: calc(var(--pagedjs-bleed-left)*-1);
}
/* show the margin-box */
.pagedjs_margin-top-left-corner-holder,
.pagedjs_margin-top,
.pagedjs_margin-top-left,
.pagedjs_margin-top-center,
.pagedjs_margin-top-right,
.pagedjs_margin-top-right-corner-holder,
.pagedjs_margin-bottom-left-corner-holder,
.pagedjs_margin-bottom,
.pagedjs_margin-bottom-left,
.pagedjs_margin-bottom-center,
.pagedjs_margin-bottom-right,
.pagedjs_margin-bottom-right-corner-holder,
.pagedjs_margin-right,
.pagedjs_margin-right-top,
.pagedjs_margin-right-middle,
.pagedjs_margin-right-bottom,
.pagedjs_margin-left,
.pagedjs_margin-left-top,
.pagedjs_margin-left-middle,
.pagedjs_margin-left-bottom {
box-shadow: 0 0 0 1px inset var(--color-marginBox);
}
/* uncomment this part for recto/verso book : ------------------------------------ */
/*
.pagedjs_pages {
flex-direction: column;
width: 100%;
}
.pagedjs_first_page {
margin-left: 0;
}
.pagedjs_page {
margin: 0 auto;
margin-top: 10mm;
}
.pagedjs_left_page{
width: calc(var(--pagedjs-bleed-left) + var(--pagedjs-pagebox-width) + var(--pagedjs-bleed-left))!important;
}
.pagedjs_left_page .pagedjs_bleed-right .pagedjs_marks-crop{
border-color: var(--pagedjs-crop-color);
}
.pagedjs_left_page .pagedjs_bleed-right .pagedjs_marks-middle{
width: var(--pagedjs-cross-size)!important;
}
.pagedjs_right_page{
left: 0;
}
*/
/*--------------------------------------------------------------------------------------*/
/* uncomment this par to see the baseline : -------------------------------------------*/
/*
.pagedjs_pagebox {
--pagedjs-baseline: 22px;
--pagedjs-baseline-position: 5px;
--pagedjs-baseline-color: cyan;
background: linear-gradient(transparent 0%, transparent calc(var(--pagedjs-baseline) - 1px), var(--pagedjs-baseline-color) calc(var(--pagedjs-baseline) - 1px), var(--pagedjs-baseline-color) var(--pagedjs-baseline)), transparent;
background-size: 100% var(--pagedjs-baseline);
background-repeat: repeat-y;
background-position-y: var(--pagedjs-baseline-position);
} */
/*--------------------------------------------------------------------------------------*/
}
/* Marks (to delete when merge in paged.js) */
.pagedjs_marks-crop{
z-index: 999999999999;
}
.pagedjs_bleed-top .pagedjs_marks-crop,
.pagedjs_bleed-bottom .pagedjs_marks-crop{
box-shadow: 1px 0px 0px 0px var(--pagedjs-crop-shadow);
}
.pagedjs_bleed-top .pagedjs_marks-crop:last-child,
.pagedjs_bleed-bottom .pagedjs_marks-crop:last-child{
box-shadow: -1px 0px 0px 0px var(--pagedjs-crop-shadow);
}
.pagedjs_bleed-left .pagedjs_marks-crop,
.pagedjs_bleed-right .pagedjs_marks-crop{
box-shadow: 0px 1px 0px 0px var(--pagedjs-crop-shadow);
}
.pagedjs_bleed-left .pagedjs_marks-crop:last-child,
.pagedjs_bleed-right .pagedjs_marks-crop:last-child{
box-shadow: 0px -1px 0px 0px var(--pagedjs-crop-shadow);
}

128
css/print.css

@ -0,0 +1,128 @@
/* Paged.js variables that can be used:
var(--pagedjs-pagebox-width) for the width of your page
var(--pagedjs-pagebox-height) for the height of your page
*/
@page{
size: 152.4mm 228.6mm;
margin: 15mm 20mm 10mm 20mm;
@top-left{
content: string(sectionTitle);
width: 100%;
position: absolute;
top: 2mm;
text-align: center;
font-family: monospace;
font-size: 8pt;
color: green;
}
@top-center{
/* copying a h1 to a running element */
content: string(contributionTitle);
position: absolute;
top: 7mm;
left: 0;
width: 100%;
text-align: center;
font-family: monospace;
font-size: 8pt;
color: magenta;
}
@bottom-center{
bottom-top:5mm;
font-family: monospace;
font-size: 8pt;
content: counter(page);
}
}
body{
font-size: 12pt;
line-height: 16pt;
}
/* running headers */
h1{
string-set: sectionTitle content(text);
page-break-before: always;
}
h2{
string-set: contributionTitle content(text);
/*position: running content(text); */ /* This "moves" the H2 out of the flow */
}
div.section{
break-before: left; /* makes sure the new section always starts on the right page */
}
/* section title */
div.section > h2{
}
div.introduction,
div.contribution{
break-before: left; /* makes sure the new section always starts on the right page */
}
/* general elements*/
h1{
font-size: 37pt;
line-height: 1.4;
margin: 0;
color: green;
word-break: normal;
}
h2{
margin: 0 0 32pt 0;
page-break-before: always;
color: magenta;
text-align: center;
}
h3, h4, h5, h6{
margin: 0 0 16pt 0;
}
p{
margin: 0 0 16pt 0;
}
.thumb{
/* image caption */
font-size: 10pt;
line-height: 1.25;
margin: 24pt 16pt 16pt 16pt;
page-break-inside: avoid;
}
img{
position: relative;
display: block;
max-width: 100mm;
height: auto;
margin: 0 0 8pt 0;
}
pre{
font-size: 8pt;
line-height: 1.8;
white-space: normal;
margin: 16pt 16pt;
}
table{
width: 100%;
}
sup{
line-height: 0;
}
a,
a:visited,
a:active,
a:hover{
color: inherit;
text-decoration: none;
font-weight: bold;
}
/* specific details */
a.external{
word-break: break-all;
}

31061
js/paged.js

File diff suppressed because it is too large

31107
js/paged.polyfill.js

File diff suppressed because it is too large

12
template.debug.html

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link href="css/print.css" rel="stylesheet" type="text/css" media="print">
</head>
<body>
<div id="wrapper">
{{ publication_unfolded }}
</div>
</body>
</html>

15
template.html

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="js/paged.js" type="text/javascript"></script>
<script src="js/paged.polyfill.js" type="text/javascript"></script>
<link href="css/interface.css" rel="stylesheet" type="text/css">
<link href="css/print.css" rel="stylesheet" type="text/css" media="print">
</head>
<body>
<div id="wrapper">
{{ publication_unfolded }}
</div>
</body>
</html>

151
update.py

@ -0,0 +1,151 @@
import urllib.request
import os
import re
import json
import jinja2
def API_request(url):
"""
url = API request url (string)
data = { 'query':
'pages' :
pageid : {
'links' : {
'?' : '?'
'title' : 'pagename'
}
}
}
}
"""
response = urllib.request.urlopen(url).read()
data = json.loads(response)
# Save response as JSON to be able to inspect API call
json_file = f'{ pagename }.json'
print('Saving JSON:', json_file)
with open(json_file, 'w') as out:
out.write(json.dumps(data, indent=4))
out.close()
return data
def download_media(html, images):
"""
html = string (HTML)
images = list of filenames (str)
"""
# check if 'images/' already exists
if not os.path.exists('images'):
os.makedirs('images')
# download media files
for filename in images:
filename = filename.replace(' ', '_') # safe filenames
# check if the image is already downloaded
# if not, then download the file
if not os.path.isfile(f'images/{ filename }'):
# first we search for the full filename of the image
url = f'{ wiki }/api.php?action=query&list=allimages&aifrom={ filename }&format=json'
response = urllib.request.urlopen(url).read()
data = json.loads(response)
# we select the first search result
# (assuming that this is the image we are looking for)
image = data['query']['allimages'][0]
# then we download the image
image_url = image['url']
image_filename = image['name']
print('Downloading:', image_filename)
image_response = urllib.request.urlopen(image_url).read()
# and we save it as a file
image_path = f'images/{ image_filename }'
out = open(image_path, 'wb')
out.write(image_response)
out.close()
import time
time.sleep(3) # do not overload the server
# replace src link
image_path = f'images/{ filename }'
html = re.sub(rf'src="/book/images/.*{ filename }"', f'src="{ image_path }"', html)
return html
def clean_up(html):
"""
html = string (HTML)
"""
html = re.sub(r'\[.*edit.*\]', '', html) # remove the [edit]
html = re.sub(r'href="/book/index.php?title=.*?"', 'href="#"', html) # remove the internal links
return html
def parse_page(pagename):
"""
pagename = string
html = string (HTML)
"""
parse = f'{ wiki }/api.php?action=parse&page={ pagename }&pst=True&format=json'
data = API_request(parse)
# print(json.dumps(data, indent=4))
if 'parse' in data:
html = data['parse']['text']['*']
images = data['parse']['images']
html = download_media(html, images)
html = clean_up(html)
else:
html = None
return html
def save(html, pagename):
"""
html = string (HTML)
pagename = string
"""
if html:
# save final page that will be used with PagedJS
template_file = open('template.html').read()
template = jinja2.Template(template_file)
html = template.render(publication_unfolded=publication_unfolded, title=pagename)
html_file = f'{ pagename }.html'
print('Saving HTML:', html_file)
with open(html_file, 'w') as out:
out.write(html)
out.close()
# save extra html page for debugging
template_file = open('template.debug.html').read()
template = jinja2.Template(template_file)
html = template.render(publication_unfolded=publication_unfolded, title=pagename)
html_file = f'{ pagename }.debug.html'
print('Saving HTML:', html_file)
with open(html_file, 'w') as out:
out.write(html)
out.close()
def update_material_now(pagename):
"""
pagename = string
publication_unfolded = string (HTML)
"""
publication_unfolded = parse_page(pagename)
return publication_unfolded
# ---
wiki = 'https://possiblebodies.constantvzw.org/book' # remove tail slash '/'
pagename = 'Unfolded'
publication_unfolded = update_material_now(pagename) # download the latest version of the page
save(publication_unfolded, pagename) # save the page to file
Loading…
Cancel
Save