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
Django CMS Project for quicksetup with minimal installation process.

Django CMS Project for quicksetup with minimal installation process.

Dipankar Chowdhury 3 Mar 24, 2022
A curated list of awesome packages, articles, and other cool resources from the Wagtail community.

Awesome Wagtail A curated list of awesome packages, articles, and other cool resources from the Wagtail community. Wagtail is a Python CMS powered by

Springload 1.7k Jan 03, 2023
Crypt Wiki - VimWiki with added support for encryption/decryption

Crypt Wiki - VimWiki with added support for encryption/decryption This project is meant to solve an issue I have ran into recently. I wanted to have a

Adrian Costin 6 Dec 18, 2022
Ticket shop application for conferences, festivals, concerts, tech events, shows, exhibitions, workshops, barcamps, etc.

pretix Reinventing ticket presales, one ticket at a time. Project status & release cycle While there is always a lot to do and improve on, pretix by n

pretix 1.3k Jan 01, 2023
Journey is a journaling app where users can create their own journal and entries in it!

Journey is a journaling app where users can create their own journal and entries in it!

Hieu Ma 8 Dec 12, 2021
A Django-based CMS with a focus on extensibility and concise code

FeinCMS - An extensible Django-based CMS When was the last time, that a pre-built software package you wanted to use got many things right, but in the

FeinCMS 847 Jan 07, 2023
A full-stack clone of Instagram, allowing the user to interact with posts and other users.

This project is a full-stack clone of Instagram, allowing the user to interact with posts and other users

Alejandro Carrizosa Grant 4 Feb 14, 2022
A self-hosted application that lets you create podcast RSS feeds from YouTube playlists

Playlist2Podcast A self-hosted application that lets you create podcast RSS feeds from YouTube playlists. What Does This Do? Takes a list of YouTube p

Simon 12 Nov 14, 2022
A full stack e-learning application, this is the backend using django restframework and docker.

DevsPrime API API Service backing client interfaces Technologies Python 3.9 : Base programming language for development Bash Scripting : Create conven

Nnabue Favour Chukwuemeka 1 Oct 21, 2021
LOOKING FOR NEW MAINTAINER - Quokka is a Content Management System - `docker run --rm -it -p 5000:5000 quokka/quokka`

Quokka The Happiest CMS in the world Quokka is a Content Management Framework written in Python. A lightweight framework to build CMS (Content Managem

Quokka Project 2.2k Jan 01, 2023
ConnectLearn is an easy to use and deploy Open-Source Project meant to make it easier for the right students to find the right teachers online.

ConnectLearn ConnectLearn is an easy to use and deploy Open-Source Project meant to make it easier for the right students to find the right teachers o

Aditya 5 Oct 24, 2021
E-Commerce Platform

Shuup Shuup is an Open Source E-Commerce Platform based on Django and Python. https://shuup.com/ Copyright Copyright (c) 2012-2021 by Shoop Commerce L

Shuup 2k Jan 07, 2023
Abilian Social Business Engine - an enterprise social networking / collaboration platform.

About Abilian SBE (Social Business Engine) is a platform for social business applications, and more specifically collaborative / enterprise 2.0 busine

Abilian open source projects 63 Dec 29, 2022
Simple yet powerful and really extendable application for managing a blog within your Django Web site.

Django Blog Zinnia Simple yet powerful and really extendable application for managing a blog within your Django Web site. Zinnia has been made for pub

Julien Fache 2.1k Dec 24, 2022
Ella is a CMS based on Python web framework Django with a main focus on high-traffic news websites and Internet magazines.

Ella CMS Ella is opensource CMS based on Django framework, designed for flexibility. It is composed from several modules: Ella core is the main module

295 Oct 16, 2022
Flask-SQLAlchemy implementation of nested/threaded comment replies.

Threaded comments using Common Table Expressions (CTE) for a MySQL Flask blog or CMS Credits to peterspython Also read more about the implementation h

ONDIEK ELIJAH OCHIENG 5 Nov 12, 2022
An encylopedia that runs on Django as part of CS50w's coursework

Django Wiki As part of the CS50w course, this project aims to apply the use of Django together with HTML and CSS to replicate an encyclopedia. Require

Beckham 1 Oct 28, 2021
Backend routes and database for an abstract theoretical app that relates a database of courses, users, and assignments.

Backend routes and database for an abstract theoretical app that relates a database of courses, users, and assignments.

Sean Wiesner 0 Dec 27, 2021
Link aggregator community organised by tags in python3/django3 + sqlite3.

sic Link aggregator community organised by tags in python3/django3 + sqlite3. Public instance at https://sic.pm and Tor hidden service.

Manos Pitsidianakis 97 Dec 30, 2022
Oppia a free, online learning platform to make quality education accessible for all.

Oppia is an online learning tool that enables anyone to easily create and share interactive activities (called 'explorations'). These activities simulate a one-on-one conversation with a tutor, makin

Oppia 4.8k Dec 28, 2022