This file is indexed.

/usr/lib/ruby/vendor_ruby/kramdown/utils/string_scanner.rb is in ruby-kramdown 1.15.0-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# -*- coding: utf-8 -*-
#
#--
# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
#
# This file is part of kramdown which is licensed under the MIT.
#++
#


require 'strscan'

module Kramdown
  module Utils

    # This patched StringScanner adds line number information for current scan position and a
    # start_line_number override for nested StringScanners.
    class StringScanner < ::StringScanner

      # The start line number. Used for nested StringScanners that scan a sub-string of the source
      # document. The kramdown parser uses this, e.g., for span level parsers.
      attr_reader :start_line_number

      # Takes the start line number as optional second argument.
      #
      # Note: The original second argument is no longer used so this should be safe.
      def initialize(string, start_line_number = 1)
        super(string)
        @start_line_number = start_line_number || 1
        @previous_pos = 0
        @previous_line_number = @start_line_number
      end

      # Sets the byte position of the scan pointer.
      #
      # Note: This also resets some internal variables, so always use pos= when setting the position
      # and don't use any other method for that!
      def pos=(pos)
        if self.pos > pos
          @previous_line_number = @start_line_number
          @previous_pos = 0
        end
        super
      end

      # Return information needed to revert the byte position of the string scanner in a performant
      # way.
      #
      # The returned data can be fed to #revert_pos to revert the position to the saved one.
      #
      # Note: Just saving #pos won't be enough.
      def save_pos
        [pos, @previous_pos, @previous_line_number]
      end

      # Revert the position to one saved by #save_pos.
      def revert_pos(data)
        self.pos = data[0]
        @previous_pos, @previous_line_number = data[1], data[2]
      end

      # Returns the line number for current charpos.
      #
      # NOTE: Requires that all line endings are normalized to '\n'
      #
      # NOTE: Normally we'd have to add one to the count of newlines to get the correct line number.
      # However we add the one indirectly by using a one-based start_line_number.
      def current_line_number
        # Not using string[@previous_pos..best_pos].count('\n') because it is slower
        strscan = ::StringScanner.new(string)
        strscan.pos = @previous_pos
        old_pos = pos + 1
        @previous_line_number += 1 while strscan.skip_until(/\n/) && strscan.pos <= old_pos

        @previous_pos = (eos? ? pos : pos + 1)
        @previous_line_number
      end

    end

  end
end