# File lib/asciidoctor/reader.rb, line 592
  def process_line line
    return line unless @process_lines

    if line.empty?
      @look_ahead += 1
      return ''
    end

    # NOTE highly optimized
    if line.end_with?(']') && !line.start_with?('[') && line.include?('::')
      if line.include?('if') && (match = ConditionalDirectiveRx.match(line))
        # if escaped, mark as processed and return line unescaped
        if line.start_with?('\\')
          @unescape_next_line = true
          @look_ahead += 1
          line[1..-1]
        else
          if preprocess_conditional_inclusion(*match.captures)
            # move the pointer past the conditional line
            advance
            # 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
        end
      elsif @skipping
        advance
        nil
      elsif ((escaped = line.start_with?('\\include::')) || line.start_with?('include::')) && (match = IncludeDirectiveRx.match(line))
        # if escaped, mark as processed and return line unescaped
        if escaped
          @unescape_next_line = true
          @look_ahead += 1
          line[1..-1]
        else
          # QUESTION should we strip whitespace from raw attributes in Substitutors#parse_attributes? (check perf)
          if preprocess_include match[1], match[2].strip
            # 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
        end
      else
        # NOTE optimization to inline super
        @look_ahead += 1
        line
      end
    elsif @skipping
      advance
      nil
    else
      # NOTE optimization to inline super
      @look_ahead += 1
      line
    end
  end