将 Pandoc 与 Swift 一起使用

Using Pandoc with Swift

我正在尝试使用 Pandoc 将 LaTeX 转换为 Markdown。我需要创建一个文件,然后 运行 pandoc 终端命令。问题是我创建的文件不在我 运行 输入终端命令的同一目录中。

我尝试使用 shell("cd"),但它不会将您移至用户的文件夹。

有什么想法吗?

import Cocoa

class ViewController: NSViewController {

    func shell(args: String...) -> Int32 {
        let task = NSTask()
        task.launchPath = "/usr/bin/env"
        task.arguments = args
        task.launch()
        task.waitUntilExit()
        return task.terminationStatus
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        shell("pwd")

        let file = "input.txt"
        let text = "\emph{test}"

        if let dir : NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true).first {
            let inputPath = dir.stringByAppendingPathComponent(file)

            //writing
            do {
                try text.writeToFile(inputPath, atomically: false, encoding: NSUTF8StringEncoding)
                shell("pandoc","-f","latex","-t","markdown","input.txt","-o","output.txt")
            }
            catch {/* error handling here */}

            let outputPath = dir.stringByAppendingPathComponent("output.txt")
            //reading
            do {
                let inputText = try NSString(contentsOfFile: inputPath, encoding: NSUTF8StringEncoding)
                print(inputText)

                let convertedText = try NSString(contentsOfFile: outputPath, encoding: NSUTF8StringEncoding)
                print(convertedText)

            }
            catch {/* error handling here */}
        }


    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }


}

这是输出

/Users/james/Library/Developer/Xcode/DerivedData/FlashCardPreview-gqzwutewnxspazcdloxqruaikvel/Build/Products/Debug
env: pandoc: No such file or directory
\emph{test}

部分原因是任务的可执行文件设置为 env,它本身执行 pandoc;但与此同时它丢失了工作目录。

解决方法是将 launchPath 设置为 Pandoc 可执行文件。

这也是因为我们必须在任务参数中使用 inputPathoutputPath 而不仅仅是文件名, 来设置 currentDirectoryPath 用于任务。

工作版本 1:

func shell(args: String...) -> Int32 {
    let task = NSTask()
    task.launchPath = "/usr/local/bin/pandoc"
    task.arguments = args
    task.launch()
    task.waitUntilExit()
    return task.terminationStatus
}

let file = "input.txt"
let text = "\emph{test}"

if let dir : NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true).first {

    let inputPath = dir.stringByAppendingPathComponent(file)
    let outputPath = dir.stringByAppendingPathComponent("output.txt")

    //writing
    do {
        try text.writeToFile(inputPath, atomically: false, encoding: NSUTF8StringEncoding)
        shell("-f","latex","-t","markdown", inputPath, "-o", outputPath)
    }
    catch { print(error) }

    //reading
    do {
        let inputText = try NSString(contentsOfFile: inputPath, encoding: NSUTF8StringEncoding)
        print(inputText)

        let convertedText = try NSString(contentsOfFile: outputPath, encoding: NSUTF8StringEncoding)
        print(convertedText)

    }
    catch { print(error) }
}

工作版本 2:

func shell(args: String...) -> Int32 {
    let task = NSTask()
    task.launchPath = "/usr/local/bin/pandoc"
    if let dir = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true).first {
        task.currentDirectoryPath = dir
    }
    task.arguments = args
    task.launch()
    task.waitUntilExit()
    return task.terminationStatus
}

let file = "input.txt"
let text = "\emph{test}"

if let dir : NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true).first {

    let inputPath = dir.stringByAppendingPathComponent(file)
    let outputPath = dir.stringByAppendingPathComponent("output.txt")

    //writing
    do {
        try text.writeToFile(inputPath, atomically: false, encoding: NSUTF8StringEncoding)
        shell("-f","latex","-t","markdown","input.txt","-o","output.txt")
    }
    catch { print(error) }


    //reading
    do {
        let inputText = try NSString(contentsOfFile: inputPath, encoding: NSUTF8StringEncoding)
        print(inputText)

        let convertedText = try NSString(contentsOfFile: outputPath, encoding: NSUTF8StringEncoding)
        print(convertedText)

    }
    catch { print(error) }
}

打印:

\emph{test}
*test*