def transliterate(data, from, to, **opts)
      from = from.to_sym
      to = to.to_sym
      return data if from == to
      raise SchemeNotSupportedError, from unless @schemes.key?(from)
      raise SchemeNotSupportedError, to unless @schemes.key?(to)

      data = data.to_str.dup
      options = @defaults.merge(opts)
      map = make_map(from, to)

      data.gsub!(/(<.*?>)/, "##\\1##") if options[:skip_sgml]

      # Easy way out for "{\m+}", "\", and ".h".
      if from == :itrans
        data.gsub!(/\{\\m\+\}/, ".h.N")
        data.gsub!(/\.h/, "")
        data.gsub!(/\\([^'`_]|$)/, "##\\1##")
      end

      if map[:from_roman?]
        transliterate_roman(data, map, options)
      else
        transliterate_brahmic(data, map)
      end
    end
def transliterate(data, from, to, **opts)
      from = from.to_sym
      to = to.to_sym
      return data if from == to
      raise SchemeNotSupportedError, from unless @schemes.key?(from)
      raise SchemeNotSupportedError, to unless @schemes.key?(to)

      data = data.to_str.dup
      options = @defaults.merge(opts)
      map = make_map(from, to)

      data.gsub!(/(<.*?>)/, "##\\1##") if options[:skip_sgml]

      # Easy way out for "{\m+}", "\", and ".h".
      if from == :itrans
        data.gsub!(/\{\\m\+\}/, ".h.N")
        data.gsub!(/\.h/, "")
        data.gsub!(/\\([^'`_]|$)/, "##\\1##")
      end

      if map[:from_roman?]
        transliterate_roman(data, map, options)
      else
        transliterate_brahmic(data, map)
      end
    end
Transliterate from one script to another.

 @param data [String] the String to transliterate
 @param from [Symbol] the source script
 @param to [Symbol] the destination script
 @option opts [Boolean] :skip_sgml (false) escape SGML-style tags in text string
 @option opts [Boolean] :syncope (false) activate Hindi-style schwa syncope
 @return [String] the transliterated string