将 SPIP 文本转换为 markdown(或 HTML)
Convert SPIP text to markdown (or HTML)
我必须更新一个基于 SPIP(具有特定的、类似 Markdown 语法的法语 CMS)的旧网站。
我想将其数据库内容转换为 markdown,但我没有找到任何有用的资源将 SPIP 语法转换为 HTML(然后通过 league/html-to-markdown 转换为 markdown,例如),但我无法找到正确的方法(来自 SPIP 的代码)来执行此操作。
任何帮助都会很棒。
和你一样,我不知道这样的工具,所以当我不得不面对导出 SPIP 数据的问题时,我创建了我的工具。但是这个工具:
- 旨在输出XML而不是HTML
- 作为SPIP的插件实现,所以必须先安装,然后从SPIP私有区域驱动
- 老实说,因为是几年前的事了,我脑子里并没有那么多事情
所以我不能现实地建议你使用它。
另一方面,如果您想编写自己的工具,您可以利用以下摘录,这是我的工具的核心:
$spip2xml_specifs = [
'data_fields' => [
# obj => [
# dest_field => src_field | [src_field,...]
# ]
# in src_field, initial "*" means: do not apply filters
'rub' => [
'titre' => '*titre',
'body' => ['descriptif','texte'],
],
'art' => [
'titre' => '*titre',
'body' => ['*surtitre','*soustitre','descriptif','chapo','texte','ps'],
],
),
'str_replace' => [
"\r\n" => "\n", # normalize Win with *nix
],
'preg_replace' => [
'¤\n\n\n*¤' => "\n\n", # limit multiple \n up to 2
#
'¤{{{(.+)}}}¤msU' => '<h3></h3>',
'¤{{(.+)}}¤msU' => '<b></b>',
'¤{(.+)}¤msU' => '<i></i>',
# _ => <br />
'¤^_ ¤ms' => '<br />',
# ---- => <hr />
'¤^(-{4,})(\n|$)¤ms' => '<hr />',
/*
# \n\n => <paragraph>
'¤(\n\n)?(.+)((?=\n\n)|$)¤Us' => '<p></p>',
'¤\n\n¤' => '', # drop left (why?) \n\n
*/
# [...|...->...] => <a href... /a>
'¤\[->(.*)\]¤msU' => '<a href=""></a>',
'¤\[(.*)->(.*)\]¤msU' => '<a href=""></a>',
'¤<a (.*)>(.*)\|(.*)</a>¤msU' => '<a title="" ></a>',
# <cadre>, <code> => <blockquote>
'¤<(?:cadre|quote)>(.*)</>¤imsU' => '<blockquote></blockquote>',
# -* => <ul... /ul>
'¤^-\*([^*].*)¤m' => '<li></li>',
'¤(<li>.*</li>)¤s' => '<ul></ul>',
# tableaux, notes, ancres...? modèles non traités -> signaler ?
#
# finally remove superfluous <p>
'¤<p><(h[1-6r]|ul|table)(.*)>(.*)(</>)?</p>¤imsU'
=> '<>',
],
];
data_fields
数组注册了两个主要数据容器(标题和文章)必须处理的字段。
然后 str_replace
和 preg_replace
数组成员注册必须在每个字段上依次执行的所有转换。
至少我可以断言这些规范是正确的并且工作正常。
如果需要,请随时询问更多信息。
我终于找到了符合我需要的脚本:
https://github.com/nhoizey/spip2markdown
它旨在在 SPIP 内部使用,但 the main functions 很容易适应。
我必须更新一个基于 SPIP(具有特定的、类似 Markdown 语法的法语 CMS)的旧网站。
我想将其数据库内容转换为 markdown,但我没有找到任何有用的资源将 SPIP 语法转换为 HTML(然后通过 league/html-to-markdown 转换为 markdown,例如),但我无法找到正确的方法(来自 SPIP 的代码)来执行此操作。
任何帮助都会很棒。
和你一样,我不知道这样的工具,所以当我不得不面对导出 SPIP 数据的问题时,我创建了我的工具。但是这个工具:
- 旨在输出XML而不是HTML
- 作为SPIP的插件实现,所以必须先安装,然后从SPIP私有区域驱动
- 老实说,因为是几年前的事了,我脑子里并没有那么多事情
所以我不能现实地建议你使用它。
另一方面,如果您想编写自己的工具,您可以利用以下摘录,这是我的工具的核心:
$spip2xml_specifs = [
'data_fields' => [
# obj => [
# dest_field => src_field | [src_field,...]
# ]
# in src_field, initial "*" means: do not apply filters
'rub' => [
'titre' => '*titre',
'body' => ['descriptif','texte'],
],
'art' => [
'titre' => '*titre',
'body' => ['*surtitre','*soustitre','descriptif','chapo','texte','ps'],
],
),
'str_replace' => [
"\r\n" => "\n", # normalize Win with *nix
],
'preg_replace' => [
'¤\n\n\n*¤' => "\n\n", # limit multiple \n up to 2
#
'¤{{{(.+)}}}¤msU' => '<h3></h3>',
'¤{{(.+)}}¤msU' => '<b></b>',
'¤{(.+)}¤msU' => '<i></i>',
# _ => <br />
'¤^_ ¤ms' => '<br />',
# ---- => <hr />
'¤^(-{4,})(\n|$)¤ms' => '<hr />',
/*
# \n\n => <paragraph>
'¤(\n\n)?(.+)((?=\n\n)|$)¤Us' => '<p></p>',
'¤\n\n¤' => '', # drop left (why?) \n\n
*/
# [...|...->...] => <a href... /a>
'¤\[->(.*)\]¤msU' => '<a href=""></a>',
'¤\[(.*)->(.*)\]¤msU' => '<a href=""></a>',
'¤<a (.*)>(.*)\|(.*)</a>¤msU' => '<a title="" ></a>',
# <cadre>, <code> => <blockquote>
'¤<(?:cadre|quote)>(.*)</>¤imsU' => '<blockquote></blockquote>',
# -* => <ul... /ul>
'¤^-\*([^*].*)¤m' => '<li></li>',
'¤(<li>.*</li>)¤s' => '<ul></ul>',
# tableaux, notes, ancres...? modèles non traités -> signaler ?
#
# finally remove superfluous <p>
'¤<p><(h[1-6r]|ul|table)(.*)>(.*)(</>)?</p>¤imsU'
=> '<>',
],
];
data_fields
数组注册了两个主要数据容器(标题和文章)必须处理的字段。
然后 str_replace
和 preg_replace
数组成员注册必须在每个字段上依次执行的所有转换。
至少我可以断言这些规范是正确的并且工作正常。
如果需要,请随时询问更多信息。
我终于找到了符合我需要的脚本: https://github.com/nhoizey/spip2markdown
它旨在在 SPIP 内部使用,但 the main functions 很容易适应。