使用Lua插件在非常旧的Lua 2.5上对字符串进行表单和处理

我正在尝试编写Lua插件,从HTML页面中提取和放置一些元数据。它是针对soupault静态站点生成器的插件,需要使用2.5版本的Lua。因此,不能使用闭包和特定的for循环。 这个生成器的工作方式不重要,因为插件存在为一个小的独立文件.lua,并在生成器运行期间连接。 重要的是插件使用的方法。这些在插件的输入和输出中使用。

更重要的是,如何使用lua语言形成和处理提取的标签列表。

HTML页面正文中的输入数据:

<site-meta-data>
#+title: post 1 title
#+subtitle: Post 1 subtitle
#+description: Post 1 decription
#+author: Billy
#+date: 2021-11-03
#+datepublished: 2021-06-02
#+usertags: inventory,errand
#+summary: Post 1 summary
#+id: 1-test1com
</site-meta-data>

插件应该执行以下步骤:

  • 获取<site-meta-data></site-meta-data>标记之间的字符串列表,并按照第一个冒号进行拆分(例如,string.match(destination\_number, "(.-):"))
  • 创建变量名作为冒号前的第一个单词,且不包含#+ (例如,标题)
  • 为此变量创建下一步操作的条件。如果从字符串中创建的变量名等于当前名称(例如,meta_tag = title),则在父标签之后插入具有值的metatag或插入提取的新标签。我将自己编写应该插入的标记。
  • 处理完列表后,删除<site-meta-data></site-meta-data>之间的所有内容,包括标记本身。

由于在Lua脚本方面接近零,我只写了脚本的外观。

all_meta_tags = HTML.select_one(page,"site-meta-data")
all_meta_tags = HTML.parse(page,"site-meta-data")
print(all_meta_tags)

local index = 1
while all_meta_tags[index] do
  meta_tag_line = all_meta_tags[index]
  meta_tag = string.match(meta_tag_line, "(.-):")
  meta_tag_content = string.match(meta_tag_line, ":(.*)")
  meta_tag_content = strlower(String.trim(meta_tag_content))
  meta_tag = Regex.replace(meta_tag, "#+", "")
  if(meta_tag =="title") then
   HTML.append_child(page, HTML.create_string('<meta name="title" content="value..">'))
  elseif (meta_tag == 'subtitle') then
   HTML.append_child(page, HTML.create_string('...'))
  elseif (meta_tag == 'description') then
    HTML.append_child(page, HTML.create_string('<meta name="description" content="meta_tag_value">'))
  elseif (meta_tag == 'author') then
    HTML.append_child(page, HTML.create_string('author...'))
  elseif (meta_tag == 'date') then
    HTML.append_child(page, HTML.create_string('<meta name="date" content="meta_tag_content">'))
   end
  index = index + 1
 end

HTML.delete(HTML.select_one(page,"site-meta-data"))

请帮我修改脚本,以完成上述任务。我将更正它应该放置的标记。

原文链接 https://stackoverflow.com/questions/69996285

点赞
用户17431954
用户17431954

从版本 4.0 开始,soupault 支持预解析钩子。因此现在可以使用该钩子重新实现各种类型的前置元素。插件应该始终将渲染后的 HTML 放置在页面正文之前。插件可以编写为以下示例。

[hooks.pre-parse]
file = "hooks/org-mode-metadata.lua"
template = """
<h1 id="post-title">{{title}}</h1>
...
2022-07-09 21:49:41