class Asciidoctor::PreprocessorReader

def process_line line

def process_line line
  return line unless @process_lines
  if line.empty?
    if @skipping
      shift
      return
    end
    @look_ahead += 1
    return line
  end
  # NOTE highly optimized
  if line.end_with?(']') && !line.start_with?('[') && line.include?('::')
    if (line.include? 'if') && ConditionalDirectiveRx =~ line
      # if escaped, mark as processed and return line unescaped
      if $1 == '\\'
        @unescape_next_line = true
        @look_ahead += 1
        line.slice 1, line.length
      elsif preprocess_conditional_directive $2, $3, $4, $5
        # move the pointer past the conditional line
        shift
        # treat next line as uncharted territory
        nil
      else
        # the line was not a valid conditional line
        # mark it as visited and return it
        @look_ahead += 1
        line
      end
    elsif @skipping
      shift
      nil
    elsif (line.start_with? 'inc', '\\inc') && IncludeDirectiveRx =~ line
      # if escaped, mark as processed and return line unescaped
      if $1 == '\\'
        @unescape_next_line = true
        @look_ahead += 1
        line.slice 1, line.length
      # QUESTION should we strip whitespace from raw attributes in Substitutors#parse_attributes? (check perf)
      elsif preprocess_include_directive $2, $3
        # peek again since the content has changed
        nil
      else
        # the line was not a valid include line and is unchanged
        # mark it as visited and return it
        @look_ahead += 1
        line
      end
    else
      # NOTE optimization to inline super
      @look_ahead += 1
      line
    end
  elsif @skipping
    shift
    nil
  else
    # NOTE optimization to inline super
    @look_ahead += 1
    line
  end
end