Module: CharacterSet::Writer

Defined in:
lib/character_set/writer.rb

Class Method Summary collapse

Class Method Details

.surrogate_pair(astral_codepoint) ⇒ Object



30
31
32
33
34
35
# File 'lib/character_set/writer.rb', line 30

def surrogate_pair(astral_codepoint)
  base = astral_codepoint - 0x10000
  high = ((base / 1024).floor + 0xD800).to_s(16)
  low  = (base % 1024 + 0xDC00).to_s(16)
  "\\u#{high}\\u#{low}"
end

.surrogate_pairs(astral_ranges) ⇒ Object



26
27
28
# File 'lib/character_set/writer.rb', line 26

def surrogate_pairs(astral_ranges)
  astral_ranges.flat_map { |range| range.map { |cp| surrogate_pair(cp) } }
end

.write(codepoint_ranges, opts = {}, &block) ⇒ Object



5
6
7
8
9
10
11
12
13
14
# File 'lib/character_set/writer.rb', line 5

def write(codepoint_ranges, opts = {}, &block)
  content = codepoint_ranges.map do |range|
    if range.size > 2 && opts[:abbreviate] != false
      range.minmax.map { |cp| Character.new(cp).escape(opts, &block) }.join('-')
    else
      range.map { |cp| Character.new(cp).escape(opts, &block) }.join
    end
  end.join
  opts[:in_brackets] ? "[#{content}]" : content
end

.write_surrogate_alternation(bmp_ranges, astral_ranges) ⇒ Object



16
17
18
19
20
21
22
23
24
# File 'lib/character_set/writer.rb', line 16

def write_surrogate_alternation(bmp_ranges, astral_ranges)
  bmp_set = write(bmp_ranges, format: :js, in_brackets: true)
  if astral_ranges.empty?
    bmp_set
  else
    surrogate_pairs = surrogate_pairs(astral_ranges)
    "(?:#{((bmp_ranges.any? ? [bmp_set] : []) + surrogate_pairs) * '|'})"
  end
end