24

我正在用 Objective-C 编写一个 Cocoa 应用程序,我希望能够合并 Markdown。用户将以 Markdown 语法输入文本,单击“导出”按钮,程序将输出 XHTML 文件。

不过,似乎有很多选择。我可以使用C/C++ 实现之一,我可以将 Perl 脚本作为我的 Cocoa 应用程序的资源运行,我假设可以使用 Python 实现和 PyObjC 桥或 Perl 实现和 CamelBones 或 PerlObjC 桥。什么是最简单和最容易的解决方案?我没有做任何复杂的事情,比如需要线程的实时渲染预览。

4

6 回答 6

32

我查看了各种选项,最后发现了libsoldout,一个非常小的 C 实现,很容易集成。您只需要在 Xcode 项目中包含 array.[ch]、buffer.[ch]、markdown.[ch] 和 renderers.[ch],然后您可以将 NSString 从 markdown 转换为 HTML,如下所示:

NSString *rawMarkdown;
const char * prose = [rawMarkdown UTF8String];  
struct buf *ib, *ob;       

int length = rawMarkdown.length + 1;

ib = bufnew(length);
bufgrow(ib, length);
memcpy(ib->data, prose, length);
ib->size = length;

ob = bufnew(64);
markdown(ob, ib, &mkd_xhtml);

NSString *shinyNewHTML = [NSString stringWithUTF8String: ob->data];
NSLog(@"%@", shinyNewHTML);

bufrelease(ib);
bufrelease(ob);
于 2011-01-14T10:34:18.617 回答
19

我刚刚在 iPad 应用程序中使用了包含 SmartyPants 支持的Sundown 实现,并取得了巨大成功。花了大约 15 分钟来构建一个测试应用程序。

假设你有一个 UITextView *textView(你 setDelegate:self)和一个 UIWebView *webView 来显示结果:

- (void) textViewDidEndEditing:(UITextView *)textView
{
    NSString *rawMarkdown = [textView text];
    const char * prose = [rawMarkdown UTF8String];  
    struct buf *ib, *ob;       

    int length = [rawMarkdown lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1;

    ib = bufnew(length);
    bufgrow(ib, length);
    memcpy(ib->data, prose, length);
    ib->size = length;

    ob = bufnew(64);

    struct sd_callbacks callbacks;
    struct html_renderopt options;
    struct sd_markdown *markdown;


    sdhtml_renderer(&callbacks, &options, 0);
    markdown = sd_markdown_new(0, 16, &callbacks, &options);

    sd_markdown_render(ob, ib->data, ib->size, markdown);
    sd_markdown_free(markdown);


    NSString *shinyNewHTML = [NSString stringWithUTF8String: ob->data];
    [webView loadHTMLString:shinyNewHTML baseURL:[[NSURL alloc] initWithString:@""]];

    bufrelease(ib);
    bufrelease(ob);
}
于 2011-10-22T20:18:04.717 回答
16

您可能想查看我编写的开源应用程序Macdown(或 Rentzsch 的Markdownlive),它将此功能作为两个应用程序的唯一用途。

于 2009-09-16T21:08:36.957 回答
7

我发现使用这些基于 C 的库处理大量降价时存在问题。

这里有一个非常简单的 Obj-C 库对我有用:

https://github.com/mdiep/MMMarkdown


MMMarkdown 使用步骤:

  1. 构建 OS X 或 iOS 目标

  2. 复制include/MMMarkdown.hand lib/libMMMarkdown-Mac.a或者lib/libMMMarkdown-iOS.a到你的项目中

  3. 然后代码是:

#import "MMMarkdown.h"

NSError  *error;
NSString *markdown   = @"# Example\nWhat a library!";
NSString *htmlString = [MMMarkdown HTMLStringWithMarkdown:markdown error:&error];
// Returns @"<h1>Example</h1>\n<p>What a library!</p>"
于 2013-11-07T08:15:17.023 回答
1

我用过peg-markdown,它比原来的 perl 快得多,并且如果你启用它们可以处理一些语法扩展。

于 2009-10-04T00:18:20.517 回答
0
  1. Oliver Letterer 的GHMarkdownParser将 markdown 翻译成 HTML。
  2. 用于 Markdown 文件的 Phil Toland 的QLMarkdown QuickLook 生成器。
于 2012-12-27T13:32:11.120 回答