class Asciidoctor::Epub3::DocumentIdGenerator

Constants

CharRefRx
InvalidIdCharsRx
LeadingDigitRx
ReservedIds

Public Class Methods

generate_id(doc, pre = nil, sep = nil) click to toggle source
# File lib/asciidoctor-epub3/converter.rb, line 1782
def generate_id doc, pre = nil, sep = nil
  synthetic = false
  unless (id = doc.id)
    # NOTE we assume pre is a valid ID prefix and that pre and sep only contain valid ID chars
    pre ||= '_'
    sep = sep ? sep.chr : '_'
    if doc.header?
      id = doc.doctitle sanitize: true
      id = id.gsub CharRefRx do
        $1 ? ($1 == 'amp' ? 'and' : sep) : ((d = $2 ? $2.to_i : $3.hex) == 8217 ? '' : ([d].pack 'U*'))
      end if id.include? '&'
      id = id.downcase.gsub InvalidIdCharsRx, sep
      if id.empty?
        id, synthetic = nil, true
      else
        unless sep.empty?
          if (id = id.tr_s sep, sep).end_with? sep
            if id == sep
              id, synthetic = nil, true
            else
              id = (id.start_with? sep) ? id[1..-2] : id.chop
            end
          elsif id.start_with? sep
            id = id[1..-1]
          end
        end
        unless synthetic
          if pre.empty?
            id = %(_#{id}) if LeadingDigitRx =~ id
          elsif !(id.start_with? pre)
            id = %(#{pre}#{id})
          end
        end
      end
    elsif (first_section = doc.first_section)
      id = first_section.id
    else
      synthetic = true
    end
    id = %(#{pre}document#{sep}#{doc.object_id}) if synthetic
  end
  logger.error %(chapter uses a reserved ID: #{id}) if !synthetic && (ReservedIds.include? id)
  id
end