鹈鹕的生成器,允许使用通用实体代替默认页面和文章实体

pelican-entities的Python项目详细描述


一个新的Pelican生成器 替换默认的页面和文章生成器,允许定义 任意内容类型,aka,实体类型(例如:项目、事件)和 关联索引/直接模板。

类似于drupal中的节点。

安装

要安装库,可以使用 pip

$ pip install pelican-entities

用法

  1. 更新pelicanconf.py

    1. entities添加到PLUGINS
      PLUGINS=['entities',...]
    2. 禁用默认页面和文章生成器:

      PAGE_PATHS=[]ARTICLE_PATHS=[]DIRECT_TEMPLATES=[]PAGINATED_DIRECT_TEMPLATES=[]
    3. 指定要在站点中使用的实体类型及其设置:

      ENTITY_TYPES={<type1_name>:{PATHS:[<type1_path1>,<type1_path2>,...],EXCLUDES:[...],<type1_name>_URL:"...",<type1_name>_SAVE_AS:"...",...},<type2_name>:{...}}
  2. 更新主题以使用新变量。

  3. 注意不兼容的插件(那些依赖于页面和 文章生成器信号或存在的变量定义 他们)。

设置

在实体类型级别定义的设置优先于全局设置 一个。

默认值的变化

  • 每个实体类型的设置都定义为 输入ENTITY_TYPES字典。
  • PAGE_PATHSARTICLE_PATHS替换为PATHS
  • PAGE_EXCLUDESARTICLE_EXCLUDES替换为EXCLUDES
  • PAGE_URLARTICLE_URLPAGE_SAVE_ASARTICLE_SAVE_AS替换为 泛型<entity_name>_URL<entity_name>_SAVE_AS
  • ARTICLE_ORDER_BYPAGE_ORDER_BY被删除,取而代之的是SORTER

新设置

  • DEFAULT_TEMPLATE:生成页面时默认使用的模板 实体类型。
  • MANDATORY_PROPERTIES:必须为 被视为有效的实体(默认情况下,仅为标题)。
  • SORTER:以实体列表为参数并负责的函数 按需分类。默认值是调用 entities.attribute_list_sorter(["date"], reverse=True)
  • ARCHIVE_TEMPLATE:用于存档页的模板。
  • CATEGORY_TEMPLATE:用于类别页的模板。
  • TAG_TEMPLATE:用于标记页的模板。
  • AUTHOR_TEMPLATE:用于作者页的模板。
  • SUBGENERATOR_CLASS:可以选择定义自定义子生成器类。这应该 或者是与^{tt29}匹配的可调用$ 接口或将动态导入的此类可调用的导入路径。

背景/主题

新的可用变量

  • 全局:
    • url:当前页的url。
    • entity_type:与此页关联的实体的类型。
    • entity_types:dict,所有声明的实体类型都是键,并且 生成器作为值。
    • <entity_type_name>:对于每个声明的实体类型,都会向 上下文包含:
      • entities:该实体类型的所有实体。
      • translations:该实体类型的所有转换。
      • tags:该实体类型的所有标记。
      • categories:该实体类型的所有类别。
      • authors:该实体类型的所有作者。
      • drafts:该实体类型的所有草稿。
      • drafts_translations:该实体类型的所有草稿翻译。
  • 实体页面:
    • entity:包含描述实体的对象(替换article 或者page)。
  • 直接模板:
    • direct:在呈现直接模板时,变量始终等于true。
  • 标签、类别、作者页面:
    • entities:替换articles
    • all_entitites:替换all_articles
  • 草稿页:
    • entity:替换article
    • all_entities:替换all_articles
  • 分页页面(直接模板或标记、类别、作者页面):
    • entities_paginator:替换articles_paginator
    • entities_page:替换articles_page
    • entities_previous_page:替换articles_previous_page
    • entities_next_page:替换articles_next_page

删除变量

  • 实体页面:
    • category:访问t穿过entity.category
  • 直接模板:
    • dates:如果要以相反的顺序迭代,请显式地执行。

示例配置

这是我在网站上使用的配置:

ENTITY_TYPES={"Page":{"PATHS":[""],"EXCLUDES":["blog","projects"],"PAGE_URL":"{slug}","PAGE_SAVE_AS":"{slug}/index.html","PATH_METADATA":r"(?P<slug>[^/]+)/.*","DIRECT_TEMPLATES":["search"],"SEARCH_SAVE_AS":"search/index.html"},"Article":{"PATHS":["blog"],"ARTICLE_URL":"blog/{category}/{slug}/","ARTICLE_SAVE_AS":"blog/{category}/{slug}/index.html","PATH_METADATA":r".*/(?P<category>[^/]+)/(?P<date>\d{4}/\d{2}/\d{2})/(?P<slug>[^/]+)/.*","DIRECT_TEMPLATES":["blog"],"PAGINATED_DIRECT_TEMPLATES":["blog"],"BLOG_SAVE_AS":"blog/index.html","CATEGORY_TEMPLATE":"blog_category","CATEGORY_URL":"blog/{slug}/","CATEGORY_SAVE_AS":os.path.join("blog","{slug}","index.html"),"FEED_ATOM":os.path.join("blog","feeds","atom.xml"),"CATEGORY_FEED_ATOM":os.path.join("blog","feeds","%s.atom.xml")},"Project":{"PATHS":["projects"],"SORTER":entities.attribute_list_sorter(["date","project_start"],reverse=True),"PROJECT_URL":"projects/{category}/{slug}/","PROJECT_SAVE_AS":"projects/{category}/{slug}/index.html","PATH_METADATA":r".*/(?P<category>[^/]+)/(?P<slug>[^/]+)/.*","DIRECT_TEMPLATES":["projects"],"PAGINATED_DIRECT_TEMPLATES":["projects"],"PROJECTS_SAVE_AS":"projects/index.html","CATEGORY_TEMPLATE":"project_category","CATEGORY_URL":'projects/{slug}/',"CATEGORY_SAVE_AS":os.path.join('projects','{slug}','index.html'),"FEED_ATOM":os.path.join("projects","feeds","atom.xml"),"CATEGORY_FEED_ATOM":os.path.join("projects","feeds","%s.atom.xml")}}

对于工作示例,请检查my sitemy site’s source code

延伸

可用信号

  • entity_generator_init:初始化父生成器。这个 生成器负责为每个实体类型创建生成器。
  • entity_generator_finalized:父级生成上下文结束 发电机。
  • entity_writer_finalized:父生成器生成输出的结束。
  • entity_subgenerator_*:特定实体生成器的信号 键入。这些信号与物品生成器使用的信号相同。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将字符串拆分为带关键字的部分   删除数据库后未指定java数据源问题“url”属性   网络化java多人游戏连接   Java当新字符串等于旧字符串时,为什么substring()不创建新对象?   一个实例到多个bean的java注入   JavaSpringMVC验证错误消息   java总结if语句,并从另一个对象(如字符串[])读取if条件(动态if)   需要多个输入的Java IF语句   jsf如何选择正确的bean范围?   java将数据库值加载到组合框JSP,Hibernate   一次活动中的java 3布局   团队和球员反对Java的困难   java ActionListener如何知道按下了哪个按钮?