我看到使用Mylyn WikiText将wiki页面转换为html from this question的建议,除了我不确定它是否只是通过阅读网站的首页来寻找它。我会进一步研究它。虽然我更喜欢它是一个Trac插件,所以我可以从wiki选项中启动转换,但Trac-Hacks的所有插件只导出单页,而我想一次性转储所有格式化的页面。
那么现有的Trac插件或独立应用程序是否符合我的要求?如果没有,你会指着我开始考虑自己实现这个功能吗?
答案 0 :(得分:5)
您可以在this ticket的trac-hacks评论中找到一些有用的信息。一个用户报告使用wget
实用程序创建wiki的镜像副本,就像它是一个普通的网站一样。另一个用户报告使用XmlRpc plugin来提取任何给定Wiki页面的HTML版本,但是这种方法可能需要您创建一个脚本来与插件进行交互。不幸的是,海报并未提供任何示例代码,但XmlRpc插件页面包含大量文档和示例以帮助您入门。
如果您可以访问托管Trac的服务器上的命令行,则可以使用trac-admin
命令,如:
trac-admin /path/to/trac wiki export <wiki page name>
检索指定Wiki页面的纯文本版本。然后,您必须将wiki语法解析为HTML,但有一些工具可用于执行此操作。
答案 1 :(得分:1)
出于我们的目的,我们希望单独导出每个Wiki页面,而不需要页眉/页脚和其他特定于实例的内容。为此,XML-RPC接口非常适合。这是我创建的Python 3.6+脚本,用于将整个wiki导出到当前目录中的HTML文件中。请注意,此技术不会重写任何超链接,因此它们将完全解析为该站点。
import os
import xmlrpc.client
import getpass
import urllib.parse
def add_auth(url):
host = urllib.parse.urlparse(url).netloc
realm = os.environ.get('TRAC_REALM', host)
username = getpass.getuser()
try:
import keyring
password = keyring.get_password(realm, username)
except Exception:
password = getpass.getpass(f"password for {username}@{realm}: ")
if password:
url = url.replace('://', f'://{username}:{password}@')
return url
def main():
trac_url = add_auth(os.environ['TRAC_URL'])
rpc_url = urllib.parse.urljoin(trac_url, 'login/xmlrpc')
trac = xmlrpc.client.ServerProxy(rpc_url)
for page in trac.wiki.getAllPages():
filename = f'{page}.html'.lstrip('/')
dir = os.path.dirname(filename)
dir and os.makedirs(dir, exist_ok=True)
with open(filename, 'w') as f:
doc = trac.wiki.getPageHTML(page)
f.write(doc)
__name__ == '__main__' and main()
此脚本仅需要Python 3.6,因此请下载并保存到export-wiki.py文件,然后设置TRAC_URL环境变量并调用脚本。例如在Unix上:
$ TRAC_URL=http://mytrac.mydomain.com python3.6 export-wiki.py
它会提示输入密码。如果不需要密码,只需按Enter键即可绕过。如果需要不同的用户名,还要设置USER环境变量。也可以获得密钥环支持,但可以忽略不计。