The lektor static file content management system

Overview

Lektor

Tests master Code Coverage PyPI version PyPI - Python Version Code Style: Black node:? Join the chat at https://gitter.im/lektor/lektor

Lektor is a static website generator. It builds out an entire project from static files into many individual HTML pages and has a built-in admin UI and minimal desktop app.

To see how it works look at the top-level example/ folder, which contains a showcase of the wide variety of Lektor's features.

For a more complete example look at the lektor/lektor-website repository, which contains the sourcecode for the official lektor website.

How do I use this?

For installation instructions head to the official documentation:

Want to develop on Lektor?

This gets you started (assuming you have Python, pip, Make and pre-commit installed):

$ git clone https://github.com/lektor/lektor
$ cd lektor
$ virtualenv venv
$ . venv/bin/activate
$ pip install --editable .
$ make build-js
$ pre-commit install
$ export LEKTOR_DEV=1
$ cp -r example example-project
$ lektor --project example-project server

If you want to run the test suite (you'll need tox installed):

$ tox
Comments
  • Video thumbnailing support using ffmpeg

    Video thumbnailing support using ffmpeg

    I'm using short video clips quite a bit with Lektor and sometimes I want to thumbnail them. This PR adds both thumbnailing and some basic metadata support.

    Example

    {% set video = this.attachments.videos.first() %}
    <img src="{{ video.thumbnail(250, 250)|url }}">
    <img src="{{ video.thumbnail(250, 250, crop=True)|url }}">
    

    The full function signature is:

    .thumbnail(width, height=None, seek=None, crop=False, quality=None)
    

    The parameters are the same as for images, but the seek parameter is new. seek is a timedelta offset for when image should be captured (default is halfway in).

    I've also added some basic metadata support:

    {{ video.width }}
    {{ video.height }}
    {{ video.duration }} (timedelta)
    

    (I haven't made the test cases yet, as I wanted some initial feedback)

    opened by runfalk 33
  • PR: Move to github actions

    PR: Move to github actions

    Todo

    • [x] Add caching for pip -> https://github.com/actions/cache/blob/master/examples.md#python---pip
    • [x] Add caching for node

    Issue(s) Resolved

    Fixes #733

    Related Issues / Links

    opened by goanpeca 32
  • PR: Themes

    PR: Themes

    #226

    Hi, This is a POC of themes support, I follow the advice in https://github.com/lektor/lektor/issues/226#issuecomment-226142885 and implement it in a way very similar to Hugo themes.

    Themes could be installed in the themes directory, It will look like this:

    project
    ├── assets
    ├── models
    ├── content
    ...
    └── themes
        └── lektor-theme-nix
            ├── assets
            ├── models
            └── templates
    

    Many themes could be added and the variable theme in .lektorprojectwill define the theme to be loaded:

    [project]
      theme = lektor-theme-nix
    

    Themes could provide templates, assets, and models (also flowdocks)

    And atheme_settings section in .lektorproject file could be used for parametrize themes:

    [theme_settings]
      name = "Rafael Laverde
      email = "[email protected]"
      about = ""
      profilepicture = "img/image.jpg"
    

    And those settings will be accessed in templates through the config env variable:

    {{ config.theme_settings.name }}


    This is working? Yep, I'm using it to build my personal website, you could take a look at how the structure look like: https://github.com/rlaverde/rlaverde

    I also did a theme https://github.com/rlaverde/lektor-theme-nix (based in an Hugo theme )

    I think this PR is only missing tests, but there's a lot of stuff to do to:

    • Documentation of how to create a theme
    • A better way to create index.html and 404.html pages
    • A repo to track all themes
    • A site for displaying themes previous
    • A more complete example project that will be used for themes as a guide
    • A command to generate the basic structure of a theme (lektor new theme)
    • Define a file (theme.ini) to contain metadata of the theme: name, author, version, lektor-required-version, keywords...
    • ...
    opened by rlaverde 30
  • Installer broken with virtualenv 20.x

    Installer broken with virtualenv 20.x

    I tried installing Lektor on Linux via the installer script at https://www.getlektor.com/install.sh. This resulted in the following error messages:

    /usr/bin/python: can't open file './src/virtualenv.py': [Errno 2] No such file or directory
    /usr/bin/python: can't open file './virtualenv.py': [Errno 2] No such file or directory
    

    It seems the internal structure of the virtualenv package changed again. If I modify the installer script to force an older version of virtualenv, it works again:

    VENV_URL = "https://pypi.org/pypi/virtualenv/16.7.9/json"
    
    opened by mthuurne 29
  • Problem installing Lektor v2.0 dmg

    Problem installing Lektor v2.0 dmg

    I've downloaded the dmg from the lektor website and tried the following:

    1. Open Finder and navigate to Downloads
    2. Open OS X Console, clear it and insert marker
    3. Double-click Lektor.dmg
    4. Drag to Applications (progress bar appears, no errors)
    5. Open Applications in Finder
    6. Double-click Lektor.app
    7. OS X errors appears saying “Lektor.app” is damaged and can’t be opened. You should move it to the Trash.

    Console shows the following log messages right after the marker.

    11/04/16 16:42:16,148 CoreServicesUIAgent[353]: Error -60005 creating authorization
    11/04/16 16:42:18,382 diskimages-helper[1004]: *** -[NSMachPort handlePortMessage:]: dropping incoming DO message because the connection is invalid
    11/04/16 16:42:23,334 lsd[235]: LaunchServices: Could not store lsd-identifiers file at /private/var/db/lsd/com.apple.lsdschemes.plist
    11/04/16 16:42:27,297 lsd[235]: LaunchServices: Could not store lsd-identifiers file at /private/var/db/lsd/com.apple.lsdschemes.plist
    11/04/16 16:42:27,326 CoreServicesUIAgent[353]: Error -60005 creating authorization
    11/04/16 16:42:29,133 CoreServicesUIAgent[353]: Error SecAssessmentCreate: The operation couldn’t be completed. (OSStatus error -67061.)
    11/04/16 16:42:32,947 com.apple.xpc.launchd[1]: (com.apple.xpc.launchd.oneshot.0x1000001b.Electron[1006]) Service exited due to signal: Killed: 9
    11/04/16 16:42:32,953 lsd[235]: LaunchServices: Could not store lsd-identifiers file at /private/var/db/lsd/com.apple.lsdschemes.plist
    11/04/16 16:42:32,978 lsd[235]: LaunchServices: Could not store lsd-identifiers file at /private/var/db/lsd/com.apple.lsdschemes.plist
    
    opened by hackebrot 25
  • Add black/isort to the CI and codebase

    Add black/isort to the CI and codebase

    What does everyone think about adding pre-commit with black/isort/flake8 to the codebase? It would make everything look more consistent and would enforce the style at the CI level. flake8 would also get rid of some common bugs.

    opened by skorokithakis 19
  • Allow process_image to accept extra parameters to ImageMagick

    Allow process_image to accept extra parameters to ImageMagick

    I have found that I can halve my image size if I pass -strip to ImageMagick. Due to my thumbnail plugin being what it is, I would greatly benefit by process_image being able to accept a list of extra parameters to pass to ImageMagick.

    It would not be appropriate to include these parameters in process_image in mainline because not everybody wants thumbnail-quality, but for my plugin they're ideal. Would this be a desirable PR to open? If so, I can submit it ASAP.

    What do you think, @nixjdm?

    opened by skorokithakis 19
  • Admin broken on master

    Admin broken on master

    I get this on master:

    Uncaught (in promise) TypeError: Cannot read property 'props' of undefined
        at Object.isActive (http://localhost:5000/admin/static/gen/app.js:9182:27)
        at http://localhost:5000/admin/static/gen/app.js:9241:29
        at Array.map (native)
        at Object.render (http://localhost:5000/admin/static/gen/app.js:9232:44)
        at http://localhost:5000/admin/static/gen/vendor.js:16301:22
        at measureLifeCyclePerf (http://localhost:5000/admin/static/gen/vendor.js:15581:13)
        at ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext (http://localhost:5000/admin/static/gen/vendor.js:16300:26)
        at ReactCompositeComponentWrapper._renderValidatedComponent (http://localhost:5000/admin/static/gen/vendor.js:16327:33)
        at ReactCompositeComponentWrapper.performInitialMount (http://localhost:5000/admin/static/gen/vendor.js:15867:31)
        at ReactCompositeComponentWrapper.mountComponent (http://localhost:5000/admin/static/gen/vendor.js:15763:22)
    

    Oddly enough the generated code seems completely wrong:

    	  isActive: function isActive(field) {
    	    var value = undefined.props.value;
    	    if (value == null) {
    	      value = undefined.props.placeholder;
    	      if (value == null) {
    	        return false;
    	      }
    	    }
    

    Not sure why this is undefined.props; the source says this.props.

    bug 
    opened by mitsuhiko 19
  • Ubuntu 20.04

    Ubuntu 20.04 "error: invalid command 'bdist_wheel'"

    I followed the procedure on Lektor's webpage, and despite having installed all prerequisites, I get the following errors:

    Building wheel for inifile (setup.py) ... error
      ERROR: Command errored out with exit status 1:
       command: /usr/local/lib/lektor/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-af6y5v9m/inifile/setup.py'"'"'; __file__='"'"'/tmp/pip-install-af6y5v9m/inifile/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-ayl9hhi2
           cwd: /tmp/pip-install-af6y5v9m/inifile/
      Complete output (6 lines):
      usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
         or: setup.py --help [cmd1 cmd2 ...]
         or: setup.py --help-commands
         or: setup.py cmd --help
    
      error: invalid command 'bdist_wheel'
      ----------------------------------------
      ERROR: Failed building wheel for inifile
      Running setup.py clean for inifile
      Building wheel for EXIFRead (setup.py) ... error
      ERROR: Command errored out with exit status 1:
       command: /usr/local/lib/lektor/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-af6y5v9m/EXIFRead/setup.py'"'"'; __file__='"'"'/tmp/pip-install-af6y5v9m/EXIFRead/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-mxtpmzko
           cwd: /tmp/pip-install-af6y5v9m/EXIFRead/
      Complete output (7 lines):
      Warning: 'classifiers' should be a list, got type 'tuple'
      usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
         or: setup.py --help [cmd1 cmd2 ...]
         or: setup.py --help-commands
         or: setup.py cmd --help
    
      error: invalid command 'bdist_wheel'
      ----------------------------------------
      ERROR: Failed building wheel for EXIFRead
      Running setup.py clean for EXIFRead
      Building wheel for watchdog (setup.py) ... error
      ERROR: Command errored out with exit status 1:
       command: /usr/local/lib/lektor/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-af6y5v9m/watchdog/setup.py'"'"'; __file__='"'"'/tmp/pip-install-af6y5v9m/watchdog/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-5pxag3tc
           cwd: /tmp/pip-install-af6y5v9m/watchdog/
      Complete output (6 lines):
      usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
         or: setup.py --help [cmd1 cmd2 ...]
         or: setup.py --help-commands
         or: setup.py cmd --help
    
      error: invalid command 'bdist_wheel'
      ----------------------------------------
      ERROR: Failed building wheel for watchdog
      Running setup.py clean for watchdog
      Building wheel for pathtools (setup.py) ... error
      ERROR: Command errored out with exit status 1:
       command: /usr/local/lib/lektor/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-af6y5v9m/pathtools/setup.py'"'"'; __file__='"'"'/tmp/pip-install-af6y5v9m/pathtools/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-xurhnhnp
           cwd: /tmp/pip-install-af6y5v9m/pathtools/
      Complete output (8 lines):
      /tmp/pip-install-af6y5v9m/pathtools/setup.py:25: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
        import imp
      usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
         or: setup.py --help [cmd1 cmd2 ...]
         or: setup.py --help-commands
         or: setup.py cmd --help
    
      error: invalid command 'bdist_wheel'
      ----------------------------------------
      ERROR: Failed building wheel for pathtools
    

    Any sugestions? It installed without issue in windows, so I suppose it is something related to Ubuntu 20.04.

    installation 
    opened by andresperezcera 18
  • Relative URLs, fixes #713

    Relative URLs, fixes #713

    Issue(s) Resolved

    Fixes #713

    Description of Changes

    • [x] Wrote at least one-line docstrings (for any new functions)
    • [x] Added unit test(s) covering the changes (if testable)
    • [ ] Included a screenshot or animation (if affecting the UI, see Licecap)
    • [ ] Link to corresponding documentation pull request for getlektor.com

    Actual relative URLs that omit unnecessary folder traversing.

    Example: /articles/2019/07/brownies -> link to -> /articles/2019/07/brownies/image-gallery

    Previous output: ../../../../articles/2019/07/brownies/image-gallery/ Ouput with this PR: image-gallery/

    Note: Resources in the same directory are linked without ./ in front. With the only exception if the link target is the same. /blog/ -> link to /blog/ will result in ./ -> link to /blog/a.jpg will result in a.jpg

    Tiny URLs for all :)

    opened by relikd 18
  • Release Schedule

    Release Schedule

    Is there any documentation or thoughts around a release schedule for Lektor?

    There have been quite a few changes since the last release in May of 2016. If assistance is needed for preparing a release, I'd be willing to contribute some time towards doing so.

    opened by coreygrunewald 18
  • Fix: order_by to respect alt

    Fix: order_by to respect alt

    Add missing alt in pad query.

    Issue(s) Resolved

    Fixes #1092

    Description of Changes

    • [x] Wrote at least one-line docstrings (for any new functions)
    • [ ] Added unit test(s) covering the changes (if testable)
    opened by relikd 0
  • `query` with alternative records dependency on different alt

    `query` with alternative records dependency on different alt

    Lets say, I use site.query('/path', this.alt)|list in a template. This will not only include the records of the provided alt, but also the records for the default alt.

    Assuming the default alt is EN:

    • layout-en.html with query('/pages', alt='en') tracks dependency on page1-en.html and page2-en.html.
    • layout-de.html with query('/pages', alt='de') tracks dependency on page1-en.html, page2-en.html, page1-de.html, and page2-de.html.
    opened by relikd 9
  • support alternative jinja environments

    support alternative jinja environments

    In a plugin I'm writing, I wanted to change the jinja env, like so:

    self.env.jinja_env.variable_start_string = r"\VAR{"
    self.env.jinja_env.variable_end_string = "}"
    

    in on_setup_env.

    This seemed to work fine at first, but eventually I bumped into trouble at strange and (for me) unexpected places. For example, the field type select stopped working.

    Eventually I figured out that Lektor is assuming in multiple locations in its source that the variable start and end strings are the default {{ and }}, for example in line 4 of https://github.com/lektor/lektor/blob/master/lektor/environment/expressions.py.

    A quick test revealed to me that, at least at that particular spot, Lektor has access to the updated jinja environment settings, making this an easy fix.

    Would there be an interest to support this case of alternative jinja settings in Lektor?

    opened by bbbart 3
  • Plugins, & getting Lektor out of the package management business

    Plugins, & getting Lektor out of the package management business

    For a long time now, it has become clearer that having Lektor manage the installation of a project's Python plugins is a significant pain point for maintainers and users. There are a lot of issues that have popped up over the years, from bugs, to missing features. I and some other maintainers are leaning toward minimizing Lektor's role in installing and managing a project's plugin Python packages. @mitsuhiko do we have your go-ahead? Thoughts or concerns?

    Regardless of the exact goal chosen, there are the normal concerns about breakages and deprecations in order to prepare users for the changes and not make things unnecessarily hard.

    We need to decided what exactly this looks like. For example, this could mean:

    Rough option 1) - minimize plugin management:

    • Removing the lektor plugins command, and it's sub-commands
    • Removing the use of the [packages] section from project files
    • Remove the automated use of packages/ subdirectory
    • Give specific and simple guidelines for installing packages in the docs, such as how to use a very basic Poetry setup, or requirements.txt.
    • Possibly leave in the ability run a similar command to lektor dev new-plugin, though this would likely be modified, at least to match the changed docs instructions. I don't see this, isolated, to be very burdensome, and is potentially very helpful.

    In my opinion this option is the best, because

    • At presents everyone with a clear demarcation of responsibility, and lets a dedicated package manager do what it was made for
    • It reduces maintenance burden to the minimum on this issue.

    This plan has the con of potentially removing some convenience features for users, such as only having to understand and use a single program (Lektor) instead of a minimum of two (Lektor and pip/poetry/etc). The burden of choice at least can be minimized by clear instructions in our docs.

    Rough option 2) - do some level of wrapping of a preferred packaging tool

    Should we try to keep some pieces of lektor plugins, such as add, remove, and list, and adapt them to match or wrap a chosen tool like Poetry? Should we leave in [packages] and somehow translate that to invoke a tool like Poetry? Should we auto-install things from packages/? These goals are somewhat independent, and they may offload some maintenance burden, but they clearly add some too. Choosing this path could mitigate some of the drawbacks of the option 1). In my opinion, that is not a good enough tradeoff.

    N.B. there are also several discussions about using a different package management strategy internally to maintain this repo. This wouldn't matter much if we choose option 1), above, but the less we approach option 1), the more it might reduce mental overhead to use the same tool for integrations for projects and to manage this repo itself.

    enhancement plugin-related design breaking-change 
    opened by nixjdm 13
  • Packaging: Convert from setuptools to hatch

    Packaging: Convert from setuptools to hatch

    I started working on packaging Lektor using hatch a few weeks ago.

    The use of hatch allows for:

    • Building the frontend javascript and css as part of the PEP517 build process using a build hook. In addition to simplifying the distribution building process by eliminating the make build-js step, this allows Lektor to be installed directly from a git repo.
    • Management of development (and, potentially, test) virtual environments.

    Issue(s) Resolved

    Fixes #1081 Fixes #1057

    Related Issues / Links

    Description of Changes

    • [ ] Wrote at least one-line docstrings (for any new functions)
    • [ ] Added unit test(s) covering the changes (if testable)
    • [ ] Link to corresponding documentation pull request for getlektor.com

    (This work probably needs a bit of freshening. I'm creating this PR now since it relates to the newly created #1081.)

    All or most of our tox tests could probably be converted to hatch scripts. At present, however, hatch does not support running scripts in parallel (e.g. there is no equivalent of tox -p) so running the full set of tests via hatch is painfully slow.

    opened by dairiki 0
  • [Build] Missing frontend assets when building from the source

    [Build] Missing frontend assets when building from the source

    Currently, the frontend assets are missing if we install from a Git URL or zipball provided by GitHub. This is because we build the frontend files in a Makefile and it is called when publishing to PyPI.

    ~~Plus, are you open to switching to hatch as the build backend?~~ Oh, you are already doing it!

    opened by frostming 1
Releases(v3.4.0b4)
  • v3.4.0b4(Nov 5, 2022)

    What's Changed

    • Test under python 3.11 by @dairiki in https://github.com/lektor/lektor/pull/1084
    • Be more careful about handling TypeError from plugin hook method calls by @dairiki in https://github.com/lektor/lektor/pull/1086
    • Support livereloading on dev server by @frostming in https://github.com/lektor/lektor/pull/1027

    New Contributors

    • @frostming made their first contribution in https://github.com/lektor/lektor/pull/1027

    Full Changelog: https://github.com/lektor/lektor/compare/v3.4.0b3...v3.4.0b4

    Source code(tar.gz)
    Source code(zip)
  • v3.4.0b3(Oct 20, 2022)

    What's Changed

    • Remove the deprecated --build-flag option by @dairiki in https://github.com/lektor/lektor/pull/1062
    • Disuse pkg_resources in favor of importlib.metadata by @dairiki in https://github.com/lektor/lektor/pull/1061
    • update frontend dependencies by @yagebu in https://github.com/lektor/lektor/pull/1063
    • Admin preview view fails to track links with anchors by @dairiki in https://github.com/lektor/lektor/pull/1053
    • ci: use generic lts/* and current specifiers by @yagebu in https://github.com/lektor/lektor/pull/1064
    • cleanup manifest by @yagebu in https://github.com/lektor/lektor/pull/1066
    • Fix lektor server with LEKTOR_DEV when frontend source missing by @dairiki in https://github.com/lektor/lektor/pull/1072
    • Clean up handling of plugin distribution metadata by @dairiki in https://github.com/lektor/lektor/pull/1073
    • Enable a default set of mistune2 plugins for feature parity with mistune0 by @dairiki in https://github.com/lektor/lektor/pull/1074

    Full Changelog: https://github.com/lektor/lektor/compare/v3.4.0b2...v3.4.0b3

    Source code(tar.gz)
    Source code(zip)
  • v3.3.7(Sep 21, 2022)

    This release fixes the lektor server command when the LEKTOR_DEV environment variable is set.

    Full Changelog: https://github.com/lektor/lektor/compare/v3.3.6...v3.3.7

    Source code(tar.gz)
    Source code(zip)
  • v3.4.0b2(Aug 31, 2022)

  • v3.4.0b1(Aug 3, 2022)

    There have been a lot of incremental improvements in the master branch of Lektor that have not been backported to the 3.3.x stable branch. We'd like to make a new 3.4 release fairly soon to get this all out there.

    Here's a pre-release of the current master head. Hopefully, this will make it easy for users to test it, find (& report bugs), and suggest improvements.

    Note that since this is a pre-release, you'll have to give pip the --pre option (or specify an explicit version) to get pip to install it.

    What's Changed

    • Delete unused cruft by @dairiki in https://github.com/lektor/lektor/pull/1009
    • drop support for Python 3.6 by @yagebu in https://github.com/lektor/lektor/pull/1004
    • Fixes for werkzeug 2.1.0 by @dairiki in https://github.com/lektor/lektor/pull/1019
    • Refactor the admin Flask app by @dairiki in https://github.com/lektor/lektor/pull/987
    • Bump minimist from 1.2.5 to 1.2.6 in /frontend by @dependabot in https://github.com/lektor/lektor/pull/1021
    • Use esbuild as a build tool and build frontend with prod React build by @yagebu in https://github.com/lektor/lektor/pull/1012
    • Deps by @yagebu in https://github.com/lektor/lektor/pull/1025
    • Resolve links in Markdown text. Support mistune 2.x by @dairiki in https://github.com/lektor/lektor/pull/992
    • Fix for #1031: "multiple not valid with is_flag" from click 8.1.3 by @dairiki in https://github.com/lektor/lektor/pull/1033
    • Add missing implicit requires, remove dropped extras & unneeded wheel build dep by @CAM-Gerlach in https://github.com/lektor/lektor/pull/1036
    • Fix extra_flag crash by @bockstaller in https://github.com/lektor/lektor/pull/1042
    • admin server: pass requests for /admin on to frontend app by @dairiki in https://github.com/lektor/lektor/pull/1044
    • Fix static file service from admin server with relative output directory by @dairiki in https://github.com/lektor/lektor/pull/1047
    • docs: Fix a few typos by @timgates42 in https://github.com/lektor/lektor/pull/1049
    • Fixes for newly released Werkzeug 2.2.0 by @dairiki in https://github.com/lektor/lektor/pull/1051
    • Fixes for #203: visible children of hidden parents by @dairiki in https://github.com/lektor/lektor/pull/1048
    • GithubPagesPublisher refactor by @dairiki in https://github.com/lektor/lektor/pull/995
    • Remove deprecated thumbnailing features by @dairiki in https://github.com/lektor/lektor/pull/960
    • Yet another possible fix for annoying admin page scrolling by @dairiki in https://github.com/lektor/lektor/pull/1050

    New Contributors

    • @dependabot made their first contribution in https://github.com/lektor/lektor/pull/1021
    • @CAM-Gerlach made their first contribution in https://github.com/lektor/lektor/pull/1036
    • @bockstaller made their first contribution in https://github.com/lektor/lektor/pull/1042

    Full Changelog: https://github.com/lektor/lektor/compare/v3.3.2...v3.4.0b1

    Source code(tar.gz)
    Source code(zip)
  • v3.3.6(Jul 27, 2022)

    This release fixes a number of issues with the admin UI that are noted in #1022, including:

    • Spurious edit page scrolling when typing in textareas is now (hopefully) fixed.
    • Fixed the edit hotkey (<ctl>-e or <meta>-e on a Mac) so that it works again.
    • The save hotkey (<ctl>-s or equivalent) in the edit view now always switches to the preview view.

    Full Changelog: https://github.com/lektor/lektor/compare/v3.3.5...v3.3.6

    Source code(tar.gz)
    Source code(zip)
  • v3.3.5(Jul 18, 2022)

  • v3.3.4(May 2, 2022)

  • v3.3.3(Mar 29, 2022)

  • v3.3.2(Mar 1, 2022)

  • v3.3.1(Jan 9, 2022)

  • v3.3.0(Dec 14, 2021)

  • v3.2.3(Dec 11, 2021)

  • v3.2.2(Dec 11, 2021)

  • v3.2.1(Dec 11, 2021)

    Bug and compatibility (bitrot) fixes.

    Compatibility

    • Pin pytest-click<1 for python 2.7. #924
    • Fixes to support werkzeug 1.x. #833

    Bugs

    • Allow rsync deployment to a local path. #830, #836
    • Fix queries with offset but without a limit. #827

    Admin UI

    • Fix select and checkboxes widgets when choices is empty. #900
    • Update npm packages. #848, #834, #816
    • Fix updating of the preview iframe. #846
    • Allow ftps: and mailto: URLs in url fields. #840
    • Fix the toggling of flow widgets in the admin UI to not mark the content as changed. #842
    • Rename CSS class to prevent conflict with EasyList FR adblock list. #841
    • Fix the handling of the URLs when opening the admin UI from the pencil button. #837
    • Fix the checkboxes widget in the admin UI. #817

    Testing / CI

    • Test under python 3.9. #845
    • Various CI test fixes. #932, #839, #832, #826
    • Added a tox.ini. #824

    Code Reformatting

    • Blackify, reorder-python-imports, flake8. #823
    • Reformatted js code with prettier. #825
    • Update pylint config. #822
    Source code(tar.gz)
    Source code(zip)
  • 3.2.0(Aug 20, 2020)

    • Fix off-by-one error in pagination's iter_pages in the interpretation of the right_current argument, and adding an appropriate trailing None for some uses.
    • Add support for setting an output_path in the project file.
    • Replaced the slugify backend to handle unicode more effectively. This should mean greater language support, but it may produce slightly different results in some cases.
    • Several modernization and performance improvements to the admin UI
    • Improved speed of source info updates.
    • Set colorspace to sRGB for thumbnails.
    • Now stripping profiles and comments from thumbnails.
    • Added support for deleting and excluding files for the rsync deployment publisher.
    • Improved speed of flow rendering in the admin UI.
    • Bugfix to correctly calculate relative urls from slugs that contain dots.
    • Bugfix to allow negative integers in integer fields in the admin UI.
    • Improved image-heavy build speeds by reducing the amount of data extracted from EXIFs.
    • Added the ability to collapse flow elements in the admin UI.
    • Now extra_flags is passed to all plugin events.
    • Extra flags can now be passed to the clean and dev shell CLI commands.
    • Bugfix where lektor plugins reinstall triggered on_setup_env instead of just reinstalling plugins.
    • Added the ability to generate video thumbnails with ffmpeg.
    • Added mode and upscale thumbnail arguments, changing the preferred crop method to using mode. mode can be crop, fit, or stretch. upscale=False can now prevent upscaling.
    • Added a new CLI command lektor dev new-theme.
    • Made admin use full UTF-8 version of RobotoSlab. Fixes missing glyphs for some languages
    • Bumped minimum Jinja2 version to 2.11
    • Bumped filetype dependency to 1.0.7 because of API changes
    • Relative urls are now as short as possible.
    • Automatically include setup.cfg configured for universal wheels when creating plugins
    Source code(tar.gz)
    Source code(zip)
  • 3.1.2(Sep 7, 2018)

    • Fix pagination and virtual pathing for alts
    • Fixing deploy from local server in Python 3
    • Now passing server_info to publisher from local server, providing better support for plugin provided publishers.
    • Added a more full-featured example project.
    • Adding Jinja2 do extension.
    • Better new-plugin command.
    • More tests.
    • Added the ability to sort child pages in admin according to models.
    • Better image handling and info detection for JPGs and SVGs
    • Lektor can now be ran with python -m lektor
    • New plugins now come with a more full featured setup.py
    Source code(tar.gz)
    Source code(zip)
  • 3.1.1(Apr 18, 2018)

    • Better Image dimension detection.
    • Fix backwards compatibility with thumbnail generation.
    • Adding safety check when runnning new build in non-empty dir since that could delete data.
    • Adding command aliases.
    Source code(tar.gz)
    Source code(zip)
  • 3.1(Jan 29, 2018)

    3.1.0

    Release date 29th of January 2018.

    • Adding ability to use Lektor Themes.
    • Adding Markdown event hook between instantiating the Renderer and creating the Markdown Processor
    • Improving tests for GitHub deployment.
    • Added the ability to use IPython in the lektor dev shell if it's available.
    • Added ability to publish from different filesystems.
    • Adding new option to turn disable editing fields on alternatives.
    • Added automated testing for Windows.
    • Expanded automated testing environments to Python 2.7, 3.5, 3.6, & Node 6, 7, 8.
    • Windows bugfixes.
    • Improved exif image data.
    • Improved date handling in admin.
    • Make GitHub Pages branch detection case insensitive.
    • Set sqlite isolation to autocommit.
    • Fixed errors in the example project.
    • Enabling pylint and standard.js.
    • Improved image rotation.
    • Now measuring tests and pull requests with code coverage.
    • Thumbnails can now have a defined quality.
    • Moved Windows cache to local appdata.
    • README tweaks.
    • Beter translations.
    • Better file tracking in watcher.
    • Upgraded many node dependencies.
    • Upgraded from ES5 to ES6.
    • Added mp4 attachment type.
    • Bugfixes for Python 3.
    Source code(tar.gz)
    Source code(zip)
  • 3.1.0.dev1(Dec 9, 2017)

    • Added Lektor theming.
    • Fix: Potential infinite build/prune loop due to pathing issue.
    • Added markdown-lexer-config plugin hook.
    • Fix GitHub deploy on Python 3.
    • Added ability for dev shell to use IPython if it's available.
    • Added ability to publish from different filesystems.
    • Adding new option to turn on disabling of editing fields on alternatives.
    • Added automated testing for Windows.
    • Expanded automated testing environments to Python 2.7, 3.5, 3.6, & Node 6, 7, 8.
    • Windows bugfixes.
    • Improved exif image data.
    • Improved date handling in admin.
    • Make GitHub Pages branch detection case insensitive.
    • Set sqlite isolation to autocommit.
    • Fixed errors in the example project.
    • Enabling pylint and standard.js.
    • Improved image rotation.
    • Now measuring tests and pull requests with code coverage.
    • Thumbnails can now have a defined quality.
    • Moved Windows cache to local appdata.
    • README tweaks.
    • Beter translations.
    • Better file tracking in watcher.
    • Upgraded many node dependencies.
    • Upgraded from ES5 to ES6.
    • Added mp4 attachment type.
    • Bugfixes for Python 3.
    Source code(tar.gz)
    Source code(zip)
  • 3.0.1(Jun 13, 2017)

  • 3.0(Jun 13, 2017)

  • 2.4(Jun 13, 2017)

  • 2.3(May 31, 2016)

  • 2.2(Apr 12, 2016)

  • 2.1(Apr 12, 2016)

  • 2.0(Apr 10, 2016)

    • Added _discoverable system field which controls if a page should show up in children. The default is that a page is discoverable. Setting it to False means in practical terms that someone needs to know the URL as all collection operations will not return it.
    • Added for_page function to pagination that returns the pagiantion for a specific page.
    • Make pagination next_page and prev_page be None on the edges.
    • Allow plugins to provide publishers.
    • Added |markdown filter.
    • Added French translations.
    • Unicode filenames as final build artifacts are now explicitly disallowed.
    • Serve up a 404.html as an error page in the dev server.
    • Improvements to the path normalization and alt handling. This should support URL generation in more complex cases between alts now.
    • Show a clearer error message when URL generation fails because a source object is virtual (does not have a path).
    • Empty text is now still valid markdown.
    • Lektor clean now loads the plugins as well.
    • Basic support for type customization.
    • Fields that are absent in a content file from an alternative are now pulled from the primary content file.
    • Development server now resolves index.html for assets as well.
    • Markdown processing now correctly adjusts links relative to where the rendered output is rendered.
    • Added Dutch translations.
    • Added Record.get_siblings()
    • Added various utilties: build_url, join_path, parse_path
    • Added support for virtual paths and made pagination work with it.
    • Added support for Query.distinct
    • Add support for pagination url resolving on root URL.
    • Server information can now also contain extra key/value pairs that can be used by publishers to affect the processing.
    • The thumbnails will now always have the correct width and height set as an attribute.
    • added datetime type
    • added support for the process_image utility functions so that plugins can use it directly.
    • added support for included_assets and excluded_assets in the project file.
    • added Spanish translations.
    • added Japanese translations.
    • added support for discovering existing alts of sources.
    • added support for image cropping.
    • added preliminary support for publishing on windows.
    • children and attachments can now have a hidden flag configured explicitly. Attachments will also no longer inherit the hidden flag of the parent record as that is not a sensible default.
    • changed internal sqlite consistency mode to improve performance on HDDs.
    • allow SVG files to be treated as images. This is something that does not work in all situations yet (in particular thumbnailing does not actually do anything for those)
    Source code(tar.gz)
    Source code(zip)
    Lektor-2.0.dmg(65.70 MB)
  • 1.2.1(Feb 3, 2016)

  • 1.2(Feb 2, 2016)

    • Fixed an error that caused unicode characters in the project name to be mishandled in the quickstart.
    • Do not create empty folders when the quickstart skips over files.
    • Empty values for the slug field now pull in the default.
    • Corrected a bug in hashing in the FTP publisher that could cause files to not upload correctly.
    • Improved error message for when imagemagick cannot be found.
    • Fixed scrolling in the admin for firefox and some other browsers.
    • Fixed a problem with deleting large projects due to sqlite limitations.
    • Fixed admin preview of root page in firefox.
    Source code(tar.gz)
    Source code(zip)
    Lektor-1.2.dmg(66.17 MB)
Owner
Lektor CMS
A new kind of content management system for Python.
Lektor CMS
Makes dynamic linked shit "static". Amazing

static.py What does it do? You give it a dynamically linked binary and it will make a directory that has all the dependencies (recursively). It also f

Stephen Tong 24 Dec 16, 2022
Create a simple static website using python and jinja templates.

Simple Static Create a simple static website using python and jinja templates. Simple Static has four pieces: A build command that renders jinja templ

Hartley Brody 6 Sep 05, 2022
A Python media index

pyvideo https://pyvideo.org is simply an index of Python-related media records. The raw data being used here comes out of the pyvideo/data repo. Befor

pyvideo 235 Dec 24, 2022
Jekyll is a simple, blog-aware, static site generator perfect for personal, project, or organization sites.

Jekyll Jekyll is a simple, blog-aware, static site generator perfect for personal, project, or organization sites. Think of it like a file-based CMS,

Jekyll 45.8k Dec 31, 2022
Static site generator for designers. Uses Python and Django templates.

News Cactus 3 is out! We're happy to announce Cactus 3. It brings a set of great new features like asset fingerprinting, an asset pipeline, pretty url

3.4k Jan 01, 2023
Minimal Static Blog Generator in Python

Minimal Static Blog Generator in Python Simple static blog generator, written in Python, with the top Lighthouse scores. Missing 'Best Practices' and

Danial Goodwin 1 Apr 20, 2022
The lektor static file content management system

Lektor Lektor is a static website generator. It builds out an entire project from static files into many individual HTML pages and has a built-in admi

Lektor CMS 3.6k Dec 29, 2022
Kaktos is a python static site generator

Python static site generator κάκτος Kaktos is a python static site generator. The idea is create a simple static site generator for people that don't

Paulo Coutinho 4 Sep 21, 2022
barely is a lightweight, but highly extensible static site generator written in pure python.

barely is a lightweight, but highly extensible static site generator. Explore the docs » Quickstart · See available Plugins · Report Bug · Request Fea

40 Dec 01, 2022
Simple Static Site Inductor Made in Python

sssimp 🐍 Simple Static Site Inductor Made in Python How to use Create a folder called input, inside create a folder called content and an empty file

Tina 11 Oct 09, 2022
Hobby Project. A Python Library to create and generate static web pages using just python.

PyWeb 🕸️ 🐍 Current Release: 0.1 A Hobby Project 🤓 PyWeb is a small Library to generate customized static web pages using python. Aimed for new deve

Abhinav Sinha 2 Nov 18, 2021
dirmaker is a simple, opinionated static site generator for quickly publishing directory websites.

dirmaker is a simple, opinionated static site generator for publishing directory websites (eg: Indic.page, env.wiki It takes entries from a YAML file and generates a categorised, paginated directory

Kailash Nadh 40 Nov 20, 2022
A simple static site generator with deployment to S3/Cloudfront.

Stasis A simple static site generator with deployment to S3/Cloudfront. Features Stasis is a static website generator written in Python, using Pandoc

Scott Czepiel 56 Sep 29, 2022
AutoLoader is a plugin for Pelican, a static site generator written in Python.

AutoLoader AutoLoader is a plugin for Pelican, a static site generator written in Python. AutoLoader is designed to autoload the other Pelican plugins

2 Nov 07, 2022
A Python Static Website Generator

Version 0.8.9 Overview Hyde starter kit by merlinrebrovic is a really nice way to get started with hyde. Hyde layout for bootstrap by auzigog is also

Hyde - Static Website Generator 1.6k Jan 01, 2023
A python-based static site generator for setting up a CV/Resume site

ezcv A python-based static site generator for setting up a CV/Resume site Table of Contents What does ezcv do? Features & Roadmap Why should I use ezc

Kieran Wood 5 Oct 25, 2022
Static site generator that supports Markdown and reST syntax. Powered by Python.

Pelican Pelican is a static site generator, written in Python. Write content in reStructuredText or Markdown using your editor of choice Includes a si

Pelican dev team 11.3k Jan 04, 2023
A static website and blog generator

Nikola, a Static Site and Blog Generator In goes content, out comes a website, ready to deploy. Why Static Websites? Static websites are safer, use fe

Nikola, a static site generator 2.4k Jan 05, 2023
Tinkerer is a blogging engine/static website generator powered by Sphinx.

Tinkerer What is Tinkerer? Tinkerer is a blogging engine/static website generator powered by Sphinx. It allows blogging in reStructuredText format, co

Vlad Riscutia 307 Dec 06, 2022
a static website generator to make beautiful customizable pictures galleries that tell a story

Prosopopee Prosopopee. Static site generator for your story. Make beautiful customizable pictures galleries that tell a story using a static website g

Bram 259 Dec 19, 2022