import sys from subprocess import Popen, PIPE import re from collections import namedtuple from itertools import chain import argparse from vim_pandoc.utils import ensure_string PandocOption = namedtuple('PandocOption', ['names', 'arg', 'optional_arg']) class PandocInfo(object): def __init__(self, pandoc='pandoc'): if type(pandoc) == bytes: pandoc = pandoc.decode() self.pandoc = pandoc self.update() def __raw_output(self, cmd, pattern=None): data = ensure_string(Popen([self.pandoc, cmd], stdout=PIPE).communicate()[0]) if pattern: return re.search(pattern, data, re.DOTALL) else: return data def update(self): self.version = self.get_version() self.options = self.get_options() self.extensions = self.get_extensions() self.input_formats = self.get_input_formats() self.output_formats = self.get_output_formats() def get_version(self): versionPattern = 'pandoc(\.exe)? (?P\d+\.\d+)' return self.__raw_output('--version', pattern=versionPattern).group('version') def get_options(self): # first line describes pandoc usage data = self.__raw_output('--help').splitlines()[1:] data = [l.strip() for l in data] # options from --trace onwards are not meaningful for us try: cutoff = data.index('--trace') except ValueError: cutoff = -1 data = data[:cutoff] options = [] for line in data: # TODO: simplify if possible if re.search(',', line): # multiple variant options if re.search('(?