# frozen_string_literal: true module HTML class Pipeline module RubyMarkup # To go through a markdown document. Mainly used to decide if we are in # code blocks to decide if we should escape underscored usernames. class MarkdownTraverser def initialize(markdown) @lines = markdown.dup.lines init_position end def each lines.each do |line| update_position(line.include?(CODEBLOCK_MARKER)) yield(line) end end def in_codeblock? prev == true && current == false end private CODEBLOCK_MARKER = "```".freeze private_constant :CODEBLOCK_MARKER attr_reader :lines attr_accessor :prev, :current def init_position self.prev = false self.current = lines.first.include?(CODEBLOCK_MARKER) end def update_position(current) self.current = current self.prev = current ? !prev : prev end end end end end