Python 全局包含在重新构造的文本中
我正在为我的博客/网站使用StructuredText,我想添加一个全局包含文件。我有权访问并很高兴更改用于生成html输出的设置文件,但我无法理解其中任何一个的语法:Python 全局包含在重新构造的文本中,python,jekyll,restructuredtext,docutils,hyde,Python,Jekyll,Restructuredtext,Docutils,Hyde,我正在为我的博客/网站使用StructuredText,我想添加一个全局包含文件。我有权访问并很高兴更改用于生成html输出的设置文件,但我无法理解其中任何一个的语法: 向解析器添加默认包含文件 使用python中的docutils在python中定义指令/内联角色等 我试着阅读源代码和文档,只是觉得有点难以理解。我希望我错过了一些非常明显的东西,但我想做如下的事情(第一部分就是已经存在的--你可以看到 有没有一种简单的方法可以做到这一点?最好定义一个文件defaults.rst,并在每次加载该
defaults.rst
,并在每次加载该文件
编辑:下面是一些我希望能够全局包含的示例(自定义指令也不错,但我可能会用代码编写它们)
我不太确定我是否理解这个问题。您想在某个文件中定义一些替换,例如,并在所有其他StructuredText文件中提供这些替换,还是想在输出文件中包含一些常见的HTML?您能澄清您的问题吗 如果您想做的是前者,您可以使用该指令,正如我在中概述的那样 或者,如果您希望在生成的输出中包含一些常见的HTML,请尝试复制和编辑模块
path/to/docutils/writers/html4css1/
中包含的template.txt
文件。您可以在此文件中包含任意HTML元素,并修改docutils生成的HTML的布局方法要求您修改Docuitls源代码,这始终是一个优势
编辑:我认为不可能设置一个标志来使用Docuitls设置包含文件。但是,如果您可以使用,它基于Docuitls,但有大量扩展名,那么此软件包的设置正好满足您的需要(请参阅)。rst\u prolog
是:
将包含在读取的每个源文件开头的重构文本字符串
我需要完全相同的东西:一种方法,可以让一些全局重构文本文件自动导入到每个重构文本文章中,而无需每次手动指定它们 此问题的一个解决方案是以下插件:
导入操作系统
从鹈鹕进口信号
从pelican.readers导入RstReader
等级RStreaderRapper(RstReader):
enabled=RstReader.enabled
文件扩展名=['rst']
类FileInput(RstReader.FileInput):
定义初始化(self,*args,**kwargs):
RstReader.FileInput.\uuuuu init\uuuu(self,*args,**kwargs)
self.source=rstreaderRapper.SourceWrapper(self.source)
#钩入踏板
RstReader.FileInput=RstReader.FileInput
RstReader.FileInput=FileInput
类SourceWrapper():
"""
模拟并包装调用“打开”的结果`
"""
content\u to\u prepend=无
定义初始化(自身,源):
self.source=源
def读取(自):
content=self.source.read()
如果self.content\u to\u prepend不是None:
content=“{}\n{}”。格式(self.content\u to\u prepend,content)
返回内容
def关闭(自我):
self.source.close()
def过程_设置(pelicanobj):
include_files=pelicanobj.settings.get('RST_GLOBAL_include'、[])或[]
base_path=pelicanobj.settings.get('path',“)
def读取(fn):
使用open(os.path.join(base_path,fn),'r')作为res:
content=res.read()
返回“.INLCUSION FROM{}\n{}\n”。格式(fn,内容)
inclusion=“”。如果包含文件,则加入(映射(读取,包含文件)),否则无
rstreaderRapper.SourceWrapper.content_to_prepend=包含
def寄存器():
信号。初始化。连接(进程设置)
简而言之:
- 从上述代码创建插件(最好从GitHub克隆)
- 导入插件(在
中调整pelicanconf.py
)PLUGINS
- 通过在
pelicanconf.py
RstReader
的内部类FileInput
子类化,并将RstReader.FileInput
的类引用设置为子类。此外,还通过SourceWrapper
模拟python文件对象。
尽管如此,这种方法对我来说是可行的,在日常工作流程中并不麻烦
我知道这个问题是2012年提出的,但我认为这个答案对其他人还是有帮助的。我确实了解包含文件的工作原理,但我不希望在我在网站上生成的每个文档的顶部都添加一个明确的包含行。我还希望能够在不同的包含文件之间切换,而无需更改nge我制作的每一个文档。对我来说,这相当于在设置解析器/编写器时设置标志和选项。我考虑的另一件事是在Python中定义一个自定义角色,然后注册它。这是一个非常有用的答案,所以我将接受它,然后尝试一个新的问题,这个问题的措辞非常复杂,更加具体。谢谢非常感谢你花时间回答!
import sys
from docutils.core import publish_parts
from optparse import OptionParser
from docutils.frontend import OptionParser as DocutilsOptionParser
from docutils.parsers.rst import Parser
# sets up a writer that is then called to parse rst pages repeatedly
def transform(writer=None, part=None):
p = OptionParser(add_help_option=False)
# Collect all the command line options
docutils_parser = DocutilsOptionParser(components=(writer, Parser()))
for group in docutils_parser.option_groups:
p.add_option_group(group.title, None).add_options(group.option_list)
p.add_option('--part', default=part)
opts, args = p.parse_args()
# ... more settings, etc
# then I just tell the parser/writer to process specified file X.rst every time
# (or alternately a python file defining more roles...but nicer if in rst)
.. role:: raw-html(raw)
:format: html
.. |common-substitution| replace:: apples and orange
.. |another common substitution| replace:: etc