2016-01-20 2 views
2

Я пытаюсь использовать Pandoc для преобразования LaTeX в Markdown. Мне нужно создать файл, а затем запустить команду терминала pandoc. Проблема в том, что файл, который я создаю, не находится в том же каталоге, в котором я запускаю команды терминала.Использование Pandoc с Swift

Я пробовал использовать оболочку («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} 

ответ

2

Это отчасти потому, что исполняемый задачу установлен в env, который сам выполняет pandoc; но тем временем он теряет рабочий каталог.

Решение этого вопроса - установить launchPath на исполняемый файл Pandoc.

Это потому, что мы должны использовать inputPath и outputPath в рассуждениях задач, а не только имена файлов, или установить 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 {тест}
* Тест *

Смежные вопросы