# frozen_string_literal: true module Asciidoctor module PDF module TextTransformer XMLMarkupRx = /&#?[a-z\d]+;|]+>)|([^&<]+)/ TagFilterRx = /(<[^>]+>)|([^<]+)/ ContiguousCharsRx = /\p{Graph}+/ WordRx = /\p{Word}+/ BareClassRx = / class="bare[" ]/ Hyphen = '-' SoftHyphen = ?\u00ad LowerAlphaChars = 'a-z' # NOTE: use more widely-supported ғ instead of ꜰ as replacement for F # NOTE: use more widely-supported ǫ instead of ꞯ as replacement for Q # NOTE: use more widely-supported s (lowercase latin "s") instead of ꜱ as replacement for S # NOTE: in small caps, x (lowercase latin "x") remains unchanged SmallCapsChars = 'ᴀʙᴄᴅᴇғɢʜɪᴊᴋʟᴍɴoᴘǫʀsᴛᴜᴠᴡxʏᴢ' def capitalize_words_pcdata string if XMLMarkupRx.match? string string.gsub(PCDATAFilterRx) { $2 ? (capitalize_words $2) : $1 } else capitalize_words string end end def capitalize_words string string.gsub(ContiguousCharsRx) { $&.capitalize } end def hyphenate_words_pcdata string, hyphenator if XMLMarkupRx.match? string skipping = false string.gsub PCDATAFilterRx do if $2 skipping ? $2 : (hyphenate_words $2, hyphenator) else skipping = skipping ? $1 != '' : ($1.start_with? '