You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

253 lines
7.8 KiB

import logging
from pelican import signals
from pelican.generators import ArticlesGenerator
from pelican.generators import PagesGenerator
from pathlib import Path
logger = logging.getLogger(__name__)
_MAIN_SETTINGS = None # settings dict of the main Pelican instance
def process_content(article):
"""
Substitute the citations and add a bibliography for an article or
page, using the local bib file if specified or the global one otherwise.
"""
content = article._content
content = "" + content
i = content.count("[lightgallery")
if (i <= 0):
pass
j = content.count("lightgalleryend]")
if (j != i):
pass
for i in range(0, i):
m = find_between(content, '[lightgallery', 'lightgalleryend]')
imgs = m.split(';')
logger.debug("" + article.title + "\n")
imgs_text = ""
for i in imgs:
cont = i.split(',')
img_url = cont[0].strip()
if img_url == "":
continue
img_url = img_url
img_text = ""
if (len(cont) > 1):
img_text = "<h4>" + cont[1] + "</h4>"
zoom_url = "/theme/images/zoom.png"
imgs_text += "<li "
imgs_text += "class=\"col-xs-3 mx-auto\" "
imgs_text += "data-responsive=\""
for i in [375, 480, 800, 1600]:
imgs_text += "" + _MAIN_SETTINGS['SITEURL'] + str(Path(img_url).parent)
imgs_text += "/" + str(i) + "/" + str(Path(img_url).name)
imgs_text += " " + str(i) + ", "
imgs_text += "\" "
imgs_text += "data-src=\""
imgs_text += _MAIN_SETTINGS['SITEURL'] + img_url
imgs_text += "\" "
imgs_text += "data-sub-html=\""
imgs_text += img_text
imgs_text += "<p>"
imgs_text += create_exif_print("./content/" + img_url)
imgs_text += "</p>"
imgs_text += "\"> "
imgs_text += "<a href=\"\">"
imgs_text += "<img height=150 max-width=200 max-height=200 class=\"img-responsive\" src=\""
imgs_text += "" + str(Path(img_url).parent) + "/" + str(200) + "/" + str(Path(img_url).name)
imgs_text += "\" > "
imgs_text += " <div class=\"demo-gallery-poster\"> "
imgs_text += " <img width=26 src=\"" + zoom_url + "\"> "
imgs_text += " </div>"
imgs_text += "</a>"
imgs_text += "</li>\n"
replace_text = " <div class=\"demo-gallery\"> "
replace_text += " <ul id=\"lightgallery\" class=\"list-unstyled row\">"
replace_text += imgs_text
replace_text += "</ul>"
replace_text += "</div>"
content = content.replace('[lightgallery' + m + 'lightgalleryend]', replace_text)
article._content = content
article._content += """
<script type="text/javascript">
function getElementsById(elementID){
var elementCollection = new Array();
var allElements = document.getElementsByTagName("*");
for(i = 0; i < allElements.length; i++){
if(allElements[i].id == elementID)
elementCollection.push(allElements[i]);
}
return elementCollection;
}
var elements = getElementsById('lightgallery');
for(var i=0; i<elements.length; i++) {
lightGallery(elements[i], {
thumbnail:true,
animateThumb: true,
showThumbByDefault: false,
});
}
</script>
</html>
"""
logger.debug("end\n\n")
pass
def replace_right(source, target, replacement, replacements=None):
return replacement.join(source.rsplit(target, replacements))
def find_between(s, first, last):
try:
start = s.rindex(first) + len(first)
end = s.rindex(last, start)
return s[start:end]
except ValueError:
return ""
def add_gallery(generators):
# Process the articles and pages
for generator in generators:
if isinstance(generator, ArticlesGenerator):
for article in (generator.articles + generator.translations + generator.drafts):
process_content(article)
elif isinstance(generator, PagesGenerator):
for page in generator.pages:
process_content(page)
pass
def create_scaled_image(org_path, new_path, resize_width):
import PIL.Image
from resizeimage import resizeimage
import os
logger.debug("gen " + new_path + "from " + org_path + " size " + str(resize_width) + "\n")
exists = os.path.isfile(new_path)
if exists:
return ""
dir_path = str(Path(new_path).parent)
exists = os.path.isdir(dir_path)
if not exists:
os.mkdir(dir_path)
img = PIL.Image.open(org_path)
width, height = img.size
if (width > resize_width):
img = resizeimage.resize_width(img, resize_width)
img.save(new_path, img.format)
img.close()
def create_exif_print(img_path):
try:
import PIL.Image
import os
exists = os.path.isfile(img_path)
if not exists:
return ""
img = PIL.Image.open(img_path)
exif = img._getexif()
img.close()
logger.debug("######### exif " + img_path + "\n")
if exif is None:
return ""
programm_dic = {0: "N", # "Not defined",
1: "M", # "Manual",
2: "N", # "Normal program",
3: "A", # "Aperture priority",
4: "S", # "Shutter priority",
5: "C", # "Creative program",
6: "A", # "Action program",
7: "P", # "Portrait mode",
8: "L", # "Landscape mode",
}
ret = ""
if 272 in exif:
ret += "" + exif[272]
if 42036 in exif:
ret += " with " + exif[42036]
ret += "<br>"
if 37386 in exif:
ret += "at" + str(exif[37386][0] / exif[37386][1]) + "mm "
if 37378 in exif:
ret += "f" + str(exif[37378][0] / exif[37378][1]) + " "
if 34855 in exif:
ret += " iso" + str(exif[34855]) + " "
if 33434 in exif:
ret += " " + str(exif[33434][0])
if exif[33434][1] != 1:
ret += "/" + str(exif[33434][1])
ret += "sec "
if 34850 in exif:
ret += " <bolt>" + programm_dic[exif[34850]] + "</bolt>"
if 315 in exif:
ret += " " + exif[315]
if 33432 in exif:
ret += " (c) " + exif[33432]
return ret
except ValueError:
return ""
def initialize_plugin(pelican_obj):
'''Initialize plugin variables and Pelican settings'''
global _MAIN_SETTINGS
if _MAIN_SETTINGS is None:
_MAIN_SETTINGS = pelican_obj.settings
_SIGNAL_HANDLERS_DB = {
'get_generators': initialize_plugin,
'all_generators_finalized': add_gallery,
}
def register():
for sig_name in _SIGNAL_HANDLERS_DB.keys():
if not hasattr(signals, sig_name):
logger.error((
'The i18n_subsites plugin requires the {} '
'signal available for sure in Pelican 3.4.0 and later, '
'plugin will not be used.').format(sig_name))
return
for sig_name, handler in _SIGNAL_HANDLERS_DB.items():
sig = getattr(signals, sig_name)
sig.connect(handler)