2022-02-20 15:15:38 +01:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< meta http-equiv = "X-UA-Compatible" content = "ie=edge" >
2022-02-23 01:34:48 +01:00
< link rel = "stylesheet" href = "../../static/styles.css?h=ca3aba42" >
2022-02-20 15:15:38 +01:00
< link rel = "stylesheet" href = "../../static/pygments.css" >
< link rel = "shortcut icon" href = "../../static/favicon.png?h=fa09bedd" >
< title > | Lektor Static Content Management System< / title >
< / head >
< body class = "default" >
< nav class = "navbar navbar-inverse navbar-static-top" >
< div class = "container" >
< div class = "navbar-header" >
< button type = "button" class = "navbar-toggle collapsed"
data-toggle="collapse" data-target="#navbar"
aria-expanded="false" aria-controls="navbar">
< span class = "sr-only" > Toggle navigation< / span >
< span class = "icon-bar" > < / span >
< span class = "icon-bar" > < / span >
< span class = "icon-bar" > < / span >
< / button >
< a class = "navbar-brand" href = "../../" > Lektor< / a >
< / div >
< div id = "navbar" class = "collapse navbar-collapse" >
< ul class = "nav navbar-nav" >
< li > < a href = "../../downloads/" > Download< / a > < / li >
< li > < a href = "../../docs/" > Documentation< / a > < / li >
< li > < a href = "../../showcase/" > Showcase< / a > < / li >
< li class = "active" > < a href = "../" > Plugins< / a > < / li >
< li > < a href = "../../community/" > Community< / a > < / li >
< li > < a href = "../../blog/" > Blog< / a > < / li >
< / ul >
< / div >
< / div >
< / nav >
< div class = "body-wrapper" >
< div class = "page-banner page-banner-300" style = "background-image: url(../header.jpg)" > < / div >
< div class = "container" >
<!-- Place this tag in your head or just before your close body tag. -->
< div class = "plugin" >
< div class = "row" >
< div class = "col-sm-12" >
< h1 > Plugin – lektor-webdav 0.1.1.post5< / h1 >
< / div >
< / div >
< div class = "row" >
< div class = "col-sm-1" > < / div >
< div class = "col-sm-11" >
< p > Lektor plugin to get a list of files from a WebDAV server< p >
< / div >
< / div >
< div class = "row" >
< div class = "col-sm-3 plugin-margin" >
< h4 > Project links< / h4 >
< ul class = "tree-nav" >
< li > < a href = "https://github.com/mesbahamin/lektor-webdav" class = "ext" > Homepage< / a > < / li >
< / ul >
< div class = "separator" >
< h4 > GitHub Statistics< / h4 >
< / div >
< ul class = "button-nav" >
< li > < p > < a class = "github-button" href = "https://github.com/mesbahamin/lektor-webdav" data-icon = "octicon-star" data-size = "large" data-show-count = "true" aria-label = "Star lektor-webdav on GitHub" target = "_blank" > Star< / a > < / p > < / li >
< li > < p > < a class = "github-button" href = "https://github.com/mesbahamin/lektor-webdav/fork" data-icon = "octicon-repo-forked" data-show-count = "true" data-size = "large" data-show = "true" aria-label = "Open Issues" target = "_blank" > Fork< / a > < / p > < / li >
< li > < p > < a class = "github-button" href = "https://github.com/mesbahamin/lektor-webdav/issues" data-icon = "octicon-issue-opened" data-show-count = "true" data-size = "large" data-show = "true" aria-label = "Open Issues" target = "_blank" > Open Issues< / a > < / p > < / li >
< / ul >
< div class = "separator" >
< h4 > Meta< / h4 >
< / div >
< p > < strong > Version:< / strong > 0.1.1.post5< / p >
< p > < strong > Author:< / strong >
< a href = "mailto:dev@aminmesbah.com" > Amin Mesbah< / a >
< / p >
< div class = "separator" >
< h4 > Tags< / h4 >
< / div >
< a href = "../tag/content/" > content< / a > ,
< a href = "../tag/Jinja-filters/" > Jinja filters< / a > ,
< a href = "../tag/Jinja-globals/" > Jinja globals< / a > ,
< a href = "../tag/remote-content/" > remote content< / a > ,
< a href = "../tag/setup-env/" > setup-env< / a > ,
and
< a href = "../tag/WebDAV/" > WebDAV< / a >
2022-02-23 01:34:48 +01:00
< p >
View < a href = "../tags/" class = "ref" > all tags< / a > .
< / p >
2022-02-20 15:15:38 +01:00
< / div >
< div class = "col-sm-9 doc-styling" >
< h2 > Project Description< / h2 >
< h1 > Lektor WebDAV Plugin< / h1 >
< p > < a href = "https://pypi.python.org/pypi/lektor-webdav/" rel = "nofollow" > < img alt = "PyPI version shields.io" src = "https://img.shields.io/pypi/v/lektor-webdav.svg" > < / a > < / p >
< p > Get a list of files hosted on a WebDAV server for use in your
< a href = "https://www.getlektor.com/" rel = "nofollow" > Lektor< / a > templates.< / p >
< h2 > Installation< / h2 >
< pre > < code > mkdir packages
cd packages
git clone https://github.com/mesbahamin/lektor-webdav
< / code > < / pre >
< p > I'll try to set this up soon so it can be installed properly with < code > lektor plugins add< / code > .< / p >
< h2 > Configuration< / h2 >
< p > For each WebDAV server you want to use, add a section in < code > configs/webdav.ini< / code > :< / p >
< pre > < code > [photos]
url = https://my.webdav.domain/photography/
username = my_user@example.com
passcmd = pass my_webdav_server
< / code > < / pre >
< p > Replace 'photos' with whatever label you want for this particular webdav server.< / p >
< h3 > Options< / h3 >
< table >
< thead >
< tr >
< th > Option< / th >
< th > Description< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td > url< / td >
< td > URL of your WebDAV folder< / td >
< / tr >
< tr >
< td > username< / td >
< td > Username with which to authenticate with the WebDAV server< / td >
< / tr >
< tr >
< td > passcmd< / td >
< td > A command that will return your WebDAV password as a UTF-8 string< / td >
< / tr >
< / tbody >
< / table >
< h2 > Use In Templates< / h2 >
< p > This plugin exposes the following for use in Jinja2 templates:< / p >
< h3 > Functions< / h3 >
< ul >
< li > < code > webdav_ls_files< / code >
< ul >
< li > Return a list of all files (not folders) in a WebDAV directory. The files
are returned in the form of a list of < code > WebdavFile< / code > instances.< / li >
< li > Parameters:
< ul >
< li > < code > webdav_id< / code > . This is the name you chose as the section title in
< code > webdav.ini< / code > ('photos' in the above snippet).< / li >
< li > < code > path< / code > (optional). If you want to look in a subfolder of your WebDAV
folder, pass its name in here.< / li >
< / ul >
< / li >
< / ul >
< / li >
< li > < code > webdav_ls_file_names< / code >
< ul >
< li > Same as < code > webdav_ls_files< / code > , but only return the names.< / li >
< / ul >
< / li >
< li > < code > webdav_ls_file_paths< / code >
< ul >
< li > Same as < code > webdav_ls_files< / code > , but only return the paths.< / li >
< / ul >
< / li >
< / ul >
< h3 > Tuples< / h3 >
< ul >
< li > < code > WebdavFile< / code > : A named tuple that holds information about a file.
< ul >
< li > < code > path< / code >
< ul >
< li > The full path of the file with the WebDAV server's URL as its root.< / li >
< li > Example: < code > '/photographs/my_photograph_of_a_wall.jpg'< / code > < / li >
< / ul >
< / li >
< li > < code > name< / code >
< ul >
< li > Just the name of the file itself.< / li >
< li > Example: < code > 'my_photograph_of_a_wall.jpg'< / code > < / li >
< / ul >
< / li >
< li > < code > content_type< / code >
< ul >
< li > Filetype metadata supplied by the WebDAV server.< / li >
< li > Example: < code > 'images/jpeg'< / code > < / li >
< / ul >
< / li >
< / ul >
< / li >
< / ul >
< h3 > Filters< / h3 >
< ul >
< li > < code > webdav_zip< / code >
< ul >
< li > Jinja2 doesn't have a < code > zip< / code > filter, so I included one here since I needed
to pair up my photos with generated thumbnails (see example below).< / li >
< li > Usage: < code > {{ zipped_iterator_ab = iterator_a|zip(iterator_b) }}< / code > < / li >
< / ul >
< / li >
< / ul >
< h2 > Example< / h2 >
< p > I made this because I wanted to make a photo gallery on my blog. I already had
a webDAV server through my Fastmail account, and I wanted to host the images
there.< / p >
< p > My full site configuration can be found
< a href = "https://github.com/mesbahamin/amin.space" rel = "nofollow" > here< / a > , but here are the main bits:< / p >
< h3 > Config< / h3 >
< p > My < code > webdav.ini< / code > looks like this:< / p >
< pre > < code > [photography]
url = https://myfiles.fastmail.com/photography/
username = me@mydomain.com
passcmd = pass sync/fastmail_webdav
< / code > < / pre >
< p > I using < a href = "https://www.passwordstore.org/" rel = "nofollow" > pass< / a > to manage my passwords, so
I invoke it in < code > passcmd< / code > .< / p >
< h3 > Template< / h3 >
< p > The template for my photography page looks like this:< / p >
< pre > < code > {% extends " layout.html" %}
{% block body %}
< h2> Photography< /h2>
< section class=" photos" >
< div class=" photo-list" >
{% set photo_host_url = bag('photo_list', 'host_url') %}
{% set thumb_dimension = bag('photo_list', 'thumb_dimension') %}
{%
for photo_file_name, thumbnail_file_name
in (
webdav_ls_file_names('photography')
|webdav_zip(webdav_ls_file_names('photography', 'thumbnails')
)
|sort(reverse=True))
%}
{% set photo_url = photo_host_url + photo_file_name %}
{% set thumb_url = photo_host_url + 'thumbnails/' + thumbnail_file_name %}
< div class=" photo" >
< a href=" {{ photo_url }}" >
< img src=" {{ thumb_url }}" width=" {{ thumb_dimension }}" height=" {{ thumb_dimension }}" />
< /a>
< /div>
{% endfor %}
< /div>
< /section>
{% endblock %}
< / code > < / pre >
< p > I get a list of my WebDAV hosted photos and a list of pre-generated thumbnails.
Then I zip them together with < code > webdav_zip< / code > and iterate through them
simultaneously.< / p >
< h3 > Result< / h3 >
< p > My gallery page looks like < a href = "https://www.amin.space/photography/" rel = "nofollow" > this< / a > .< / p >
< p > When I want to add more photos, I simply upload them to my WebDAV server, then
run < code > lektor build< / code > .< / p >
< div class = "comment-box" >
< h2 > Comments< / h2 >
< div id = "disqus_thread" > < / div >
< script >
var disqus_config = function() { this.page.identifier = "/plugins/lektor-webdav"; this.page.url = "https://www.getlektor.com/plugins/lektor-webdav/"; };
(function() {
var d = document, s = d.createElement('script');
s.src = '//lektordocumentation.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
< / script >
< noscript >
Please enable JavaScript to view the < a href = "https://disqus.com/?ref_noscript"
rel="nofollow">comments powered by Disqus.< / a >
< / noscript >
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "bottomsummary" >
< div class = "container" >
< / div >
< / div >
< footer >
< div class = "container" >
< div class = "row" >
< div class = "col-sm-4 icon-bar" >
< a href = "https://github.com/lektor/lektor/" title = "Lektor on GitHub"
>< i class = "fa fa-github" > < / i > < / a >
< a href = "https://github.com/lektor/lektor/issues/" title = "Report Issues for Lektor"
>< i class = "fa fa-bug" > < / i > < / a >
< a href = "https://twitter.com/getlektor" title = "Find Lektor on Twitter"
>< i class = "fa fa-twitter" > < / i > < / a >
< a href = "https://gitter.im/lektor/lektor" title = "Chat on Gitter"
>< i class = "fa fa-comment" > < / i > < / a >
< a href = "https://github.com/lektor/lektor-website/tree/master/content/plugins/lektor-webdav/contents.lr" title = "View source for this page" > < i class = "fa fa-code" > < / i > < / a >
< / div >
< div class = "col-sm-8" >
< a href = "../../license/" > License & Copyright< / a > •
< a href = "../../contact/" > Contact< / a > •
Made with < i class = "fa fa-fw fa-heart" title = "Heart" > < span hidden > Heart< / span > < / i > in Carinthia
< / div >
< / div >
< / div >
< / footer >
2022-02-23 01:34:48 +01:00
< script type = text/javascript src = "../../static/app.js?h=bb1b933a" charset = "utf-8" > < / script >
2022-02-20 15:15:38 +01:00
< script >
((window.gitter = {}).chat = {}).options = {
room: 'lektor/lektor',
activationElement: null
};
document.write('< button class = "js-gitter-toggle-chat-button" > Toggle Chat< / button > ');
var dnt = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
if (dnt != "1" & & dnt != "yes") {
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-70822533-1', 'auto');
ga('set', 'anonymizeIp', true);
ga('send', 'pageview');
} else {
console.debug("Respecting Do-Not-Track, not running analytics.");
}
< / script >
< script async src = 'https://www.google-analytics.com/analytics.js' > < / script >
< script async defer id = "github-bjs" src = "https://buttons.github.io/buttons.js" > < / script >
< script > ! function ( d , s , id ) { var js , fjs = d . getElementsByTagName ( s ) [ 0 ] , p = /^http:/ . test ( d . location ) ? 'http' : 'https' ; if ( ! d . getElementById ( id ) ) { js = d . createElement ( s ) ; js . id = id ; js . src = p + '://platform.twitter.com/widgets.js' ; fjs . parentNode . insertBefore ( js , fjs ) ; } } ( document , 'script' , 'twitter-wjs' ) ; < / script >
< script src = "https://sidecar.gitter.im/dist/sidecar.v1.js" async defer > < / script >
< / body >
< / html >