def preprocess_conditional_directive keyword, target, delimiter, text
target = target.downcase unless (no_target = target.empty?)
return false if (no_target && (keyword == 'ifdef' || keyword == 'ifndef')) || (text && keyword == 'endif')
if keyword == 'endif'
if @conditional_stack.empty?
warn %(asciidoctor: ERROR: #{line_info}: unmatched macro: endif::#{target}[])
elsif no_target || target == (pair = @conditional_stack[-1])[:target]
@conditional_stack.pop
@skipping = @conditional_stack.empty? ? false : @conditional_stack[-1][:skipping]
else
warn %(asciidoctor: ERROR: #{line_info}: mismatched macro: endif::#{target}[], expected endif::#{pair[:target]}[])
end
return true
end
if @skipping
skip = false
else
case keyword
when 'ifdef'
case delimiter
when ','
skip = target.split(',', -1).none? {|name| @document.attributes.key? name }
when '+'
skip = target.split('+', -1).any? {|name| !@document.attributes.key? name }
else
skip = !@document.attributes.key?(target)
end
when 'ifndef'
case delimiter
when ','
skip = target.split(',', -1).any? {|name| @document.attributes.key? name }
when '+'
skip = target.split('+', -1).all? {|name| @document.attributes.key? name }
else
skip = @document.attributes.key?(target)
end
when 'ifeval'
return false unless no_target && EvalExpressionRx =~ text.strip
lhs, op, rhs = $1, $2, $3
lhs = resolve_expr_val lhs
rhs = resolve_expr_val rhs
if op == '!='
skip = lhs.send :==, rhs
else
skip = !(lhs.send op.to_sym, rhs)
end
end
end
if keyword == 'ifeval' || !text
@skipping = true if skip
@conditional_stack << {:target => target, :skip => skip, :skipping => @skipping}
else
unless @skipping || skip
replace_next_line text.rstrip
unshift ''
@look_ahead -= 1 if text.start_with? 'include::'
end
end
true
end