1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
require "posix-spawn"
require "github/markup/implementation"
module GitHub
module Markup
class CommandError < RuntimeError
end
class CommandImplementation < Implementation
attr_reader :command, :block
def initialize(regexp, command, &block)
super regexp
@command = command.to_s
@block = block
end
def render(content)
rendered = execute(command, content)
rendered = rendered.to_s.empty? ? content : rendered
call_block(rendered, content)
end
private
def call_block(rendered, content)
if block && block.arity == 2
block.call(rendered, content)
elsif block
block.call(rendered)
else
rendered
end
end
def execute(command, target)
spawn = POSIX::Spawn::Child.new(*command, :input => target)
if spawn.status.success?
spawn.out.gsub("\r", '')
else
raise CommandError.new(spawn.err.strip)
end
end
end
end
end
|