在服务器端为 ColdFusion 实现 Showdown.js markdown 解析器

2024-01-06

这是一个“事实调查”问题,旨在了解使用以下命令创建 ColdFusion UDF 来解析服务器上的 markdown 有多困难:showdown.js 解析器。 http://attacklab.net/showdown/已经有一个利用 showdown.js 的 java 实现(请参阅本文末尾的代码),我想了解如何为 ColdFusion 实现它。我没有 Java 经验,我不会特别称自己为“程序员”,但我不希望这阻止我尝试。

Summary

我想跑步Shadow.js http://attacklab.net/showdown/服务器端以便将 Markdown 转换为 HTML。

Why?

保存用户条目的两个版本,一个采用 Markdown 格式,另一个采用 HTML 格式,这样我们就可以向最终用户显示原始 Markdown 版本,以防他们想要编辑其条目。

为什么不使用服务器端解析器?

有两个原因:

  1. 截至目前,还没有用于此特定目的的 ColdFusion markdown 解析器
  2. 在客户端使用 Showdown.js,然后在服务器端使用不同的解析器将导致显示给客户端的预览与数据库中存储的版本之间的标记不一致。鉴于 markdown 的定义很松散,大多数解析器实现都会有细微的差异。

一个非常好的博客条目 http://briancarper.net/blog/415/clojure-and-markdown-and-javascript-and-java-and讨论这个问题。

为什么不在客户端进行所有解析并发布两个版本?

我认为这不是一个安全的解决方案。我还认为用户可能会发布带有不匹配 HTML 的 Markdown。

有现成的实现吗?

一种名为 CFShowdown 的实现 http://blog.adampresley.com/software-development/cfshowdown-a-markdown-library-for-coldfusion/comment-page-1/#comment-8029,但它不是为了这个特定目的。相反,它用于处理页面上的输出。评论区的上述博客 http://briancarper.net/blog/415/clojure-and-markdown-and-javascript-and-java-and具有由名为 David 的用户编写的纯 Java 实现:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine jsEngine = manager.getEngineByName("js");
try
{
    jsEngine.eval(new InputStreamReader(getClass().getResourceAsStream("showdown.js")));
    showdownConverter = jsEngine.eval("new Showdown.converter()");
}
catch (Exception e)
{
    log.error("could not create showdown converter", e);
}

try
{
    return ((Invocable) jsEngine).invokeMethod(
        showdownConverter, 
        "makeHtml", 
        markdownString
    ) + "";
}
catch (Exception e)
{
    log.error("error while converting markdown to html", e);
    return "[could not convert input]";
}

客观的

创建一个 java 类,允许我们将此实现与 ColdFusion UDF 或组件内的自定义标记一起使用,类似于<cfset html = getMarkdown(string)>

由于我没有 Java 经验,因此我希望从用户那里获得一些关于从哪里以及如何开始执行此任务的建议和意见。我创建了一个


有文件对决.js http://attacklab.net/showdown/showdown-v0.9.zip和同一目录中的文件 markdown.txt (如下示例)。

摊牌.cfm

<cfscript>
manager = createObject("java", "javax.script.ScriptEngineManager").init();
jsEngine = manager.getEngineByName("js");

showdownJS = fileRead('#getDirectoryFromPath(getCurrentTemplatePath())#/showdown.js');

jsEngine.eval(showdownJS);
showdownConverter = jsEngine.eval("new Showdown.converter()");

markdownString = fileRead("#getDirectoryFromPath(getCurrentTemplatePath())#/markdown.txt");

args = [markdownString];

result = jsEngine.invokeMethod(
    showdownConverter,
    "makeHtml",
    args
) & "";
</cfscript>

降价.txt

Showdown Demo
-------------

You can try out Showdown on this page:

  - Type some [Markdown] text on the left side.
  - See the corresponding HTML on the right.

For a Markdown cheat-sheet, switch the right-hand window from *Preview* to *Syntax Guide*.

Showdown is a JavaScript port of the original Perl version of Markdown.  You can get the full [source code] by clicking on the version number at the bottom of the page.

Also check out [WMD, the Wysiwym Markdown Editor][wmd].  It'll be open source soon; email me at the address below if you'd like to help me test the standalone version.

**Start with a [blank page] or edit this document in the left window.**

  [Markdown]: http://daringfireball.net/projects/markdown/
  [source code]: http://attacklab.net/showdown/showdown-v0.9.zip
  [wmd]: http://wmd-editor.com/
  [blank page]: ?blank=1 "Clear all text"

Update

这是一个需要的版本Adam Presley 在 Java 中的工作 https://stackoverflow.com/questions/4600535/implementating-showdown-js-markdown-parser-on-the-server-side-for-coldfusion/4605963#4605963并在 CFC 中完成这一切。请注意,我采用了他在 showdown.js 末尾添加的一点点魔法,并将其放入一个 CFC 函数中,该函数附加了返回值(即showdownAdapterJS()).

CFC

<cfcomponent output="false" accessors="true">
    <cffunction name="init" output="false" access="public" returntype="Showdown" hint="Constructor">
        <cfset variables.manager = createObject("java", "javax.script.ScriptEngineManager").init()>
        <cfset variables.engine = manager.getEngineByName("javascript")>
        <cfreturn this/>
    </cffunction>

    <cffunction name="toHTML" output="false" access="public" returntype="any" hint="">
        <cfargument name="markdownText" type="string" required="true"/>
        <cfset var local = structNew()/>
        <cfset var bindings = variables.engine.createBindings()>
        <cfset var result = "">

        <cftry>
            <cfset bindings.put("markdownText", arguments.markdownText)>
            <cfset variables.engine.setBindings(bindings, createObject("java", "javax.script.ScriptContext").ENGINE_SCOPE)>
            <cfset var showdownJS = fileRead('#getDirectoryFromPath(getCurrentTemplatePath())#/showdown.js')>
            <cfset showdownJS &= showdownAdapterJS()>
            <cfset result = engine.eval(showdownJS)>
            <cfcatch type="javax.script.ScriptException">
                <cfset result = "The script had an error: " & cfcatch.Message>
            </cfcatch>
        </cftry>

        <cfreturn result>
    </cffunction>

    <cffunction name="showdownAdapterJS" output="false" access="private" returntype="string" hint="">
        <cfset var local = structNew()/>
<cfsavecontent variable="local.javascript">
<cfoutput>#chr(13)##chr(10)#var __converter = new Showdown.converter();
__converter.makeHtml(markdownText);</cfoutput>
</cfsavecontent>
        <cfreturn local.javascript>
    </cffunction>
</cfcomponent>

Usage

<cfset showdown = createObject("component", "Showdown").init()>
<cfset markdownString = fileRead("#getDirectoryFromPath(getCurrentTemplatePath())#/markdown.txt")>
<cfoutput>#showdown.toHTML(markdownString)#</cfoutput>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在服务器端为 ColdFusion 实现 Showdown.js markdown 解析器 的相关文章

随机推荐

  • PyCharm 项目文件夹记录出现 ModuleNotFoundError 错误

    我正在 PyCharm 中从事一个项目 该项目具有以下结构 projectRoot folder1 somecode py utils init py myutils1 py 我想知道如何进行导入 以便在以交互方式在 pyCharm 控制台
  • bootstrap-vue 表 td 元素样式

    我有一个问题 就是给 td b 表元素的标签 这是模板 td
  • 在哪里可以找到“SIP Communicator”库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在为 Android 开发 Sip 客户端 我需要这个库来完成我的项目 有一个使用这个库的开源代码 但我在任何地方都找不到它 一款知名
  • Django - 在基于类的视图上使用reverse()

    我的 Django 项目中有以下 url 配置 urlpatterns patterns r my view MyViewClass as view 有没有办法使用reverse 函数获取上面视图的url 就在这里 Use the name
  • TransactionScope 和 Npgsql - 准备好的事务问题

    我有以下代码 using TransactionScope tScope new TransactionScope using NpgsqlConnection myConnection new NpgsqlConnection MyCon
  • 将 RecyclerView 锚定在折叠工具栏布局上稍高的位置 [重复]

    这个问题在这里已经有答案了 是否可以将 RecyclerView 锚定在比通常位置高一点的位置 就像大多数可折叠视图上的 FAB 图标一样 有关预期结果 请参见图 1 Image 1 我尝试了以下代码 但它没有给出预期结果 有关当前结果 请
  • 批量分配令牌

    我有以下问题 我正在从数据库中读取字段 这些字段并非都是必填字段 因此 并非所有内容都已填写 我遇到的问题是 Batch ms dos 和 Tokens 函数 让我举一个例子 有问题的字段如下 示例 First Name John Last
  • 如何在 XAML 中注入转换器

    我有一个 IValueConverter 实现的类 我需要使用我的 DI 容器 Ninject 注入它 问题是 在 XAML 中 没有立即明显的方法来控制 Converter 对象的实例化 所以我的 XAML 包含这样一行 Source 绑
  • for 循环的限制是计算一次还是每次循环都计算?

    以下循环中的限制 12332 324234 是计算一次还是每次循环运行时计算 for int i 0 i lt 12332 324234 i Do something 为此 计算一次 或更可能计算 0 次 编译器将为您优化乘法 然而 如果你
  • 发布者订阅者模式的现代替代方案

    我有一个 C Windows 应用程序 我正在处理发布者 订阅者的情况 其中我的一个类 发布者 定期生成数据并将其传递给另一个类 订阅者 该类不断等待接收来自发布者的通知 我是设计模式的新手 我查找了发布者订阅者模型的常见实现 我注意到它们
  • jquery 如果鼠标悬停

    我有一个带有悬停功能的 img 来显示元素 其中一些新元素与 img 重叠 因此如果我将鼠标悬停在新元素上 因为光标不再位于 img 上 该元素会隐藏自身 然后立即重新出现 因为光标再次位于 img 上 如果光标位于新元素内的 img 上
  • Pandas,groupby 并找到组中的最大值,返回值和计数

    我有一个带有日志数据的 pandas DataFrame host service 0 this com mail 1 this com mail 2 this com web 3 that com mail 4 other net mai
  • 是否可以在 Firebase 托管上托管 Express 和 socket.io 应用程序?

    我关注 Firebase 云功能已经有一段时间了 最近 我发现在 Firebase Hosting 上托管 Node js 应用程序 但它仅使用 Express 我们可以在 Firebase 上托管 socket io 应用吗 Fireba
  • 部分 Fragment 项目隐藏在操作栏下

    我正在学习 android 开发 我的问题可能很简单 我被困在下面的部分并请求你的帮助 描述 我正在使用android默认的 导航抽屉 活动来实现一个小项目 我创建了一个片段 当用户从导航抽屉中选择一个选项时 该片段将打开 面临的问题 Wh
  • Python3 - Matplotlib FuncAnimation 连续内存泄漏

    EDIT2 因此 经过更多的工作 我创建了最小的样本 它在每台机器上都相当不错地重现了 Memoryleak 这段代码只是创建一个 TKinter 窗口和一个带有 3 个正弦波的 matplotlib 画布 然后尝试制作动画 看到 blit
  • 在 laravel 8 上安装 laravel/jetstream 失败

    通过composer安装jetstream后composer require laravel jetstream然后突然得到一个ErrorException 没有这样的文件或目录 Writing lock file Generating o
  • 使用 JAXB 解组 XML

    我有一个 XML 文件 我正在尝试对其进行解组 但我不知道如何执行此操作 XML 看起来像
  • 致命错误:webp 不支持调色板图像

    我保存的是png图像webp使用以下代码格式化但有时显示 致命错误 webp 不支持调色板图像 所以 请给我建议 im imagecreatetruecolor 120 20 text color imagecolorallocate im
  • 如何在没有手动限制的情况下在一侧扩展 ggplot 条形刻度而不是另一侧

    目标是消除刻度线和条形底部之间的空间 而不切断条形另一端之外的任何百分比标签 我正在使用 R 的 ggplot2 运行数十个条形图 并尝试遵循我们的组织风格指南 该指南是使用 Excel 手动为每个图表开发的 不同图表中的最大长度条的长度不
  • 在服务器端为 ColdFusion 实现 Showdown.js markdown 解析器

    这是一个 事实调查 问题 旨在了解使用以下命令创建 ColdFusion UDF 来解析服务器上的 markdown 有多困难 showdown js 解析器 http attacklab net showdown 已经有一个利用 show