module Unicopy

Constants

DUMP_FORMATS
DUMP_FORMAT_DEFAULTS
VERSION

Public Class Methods

deliver(output, print: false, message: "", codepoints_length:) click to toggle source
# File lib/unicopy.rb, line 98
def self.deliver(output, print: false, message: "", codepoints_length:)
  if print
    puts(output)
  else
    Clipboard.copy(output)
    puts Paint["Copied #{message} #{codepoints_length} codepoint#{codepoints_length != 1 ? "s" : ""} to clipboard", :green]
  end
end
dump_codepoints(codepoints, format: nil) click to toggle source
# File lib/unicopy.rb, line 130
def self.dump_codepoints(codepoints, format: nil)
  format ||= "uplus"
  if dump_format_details = DUMP_FORMATS[format]
    prefix  = dump_format_details[:prefix]  || DUMP_FORMAT_DEFAULTS[:prefix]
    replace = dump_format_details[:replace] || DUMP_FORMAT_DEFAULTS[:replace]
    joiner  = dump_format_details[:joiner]  || DUMP_FORMAT_DEFAULTS[:joiner]
    suffix  = dump_format_details[:suffix]  || DUMP_FORMAT_DEFAULTS[:suffix]
  else
    raise ArgumentError, "unicopy does not know dump format \"#{format}\""
  end

  prefix + codepoints.map{ |cp| replace.is_a?(Proc) ? replace[cp] : replace % cp }.join(joiner) + suffix
end
transform_raw_codepoints(codepoints, parse_decimal = false) click to toggle source
# File lib/unicopy.rb, line 107
def self.transform_raw_codepoints(codepoints, parse_decimal = false)
  if parse_decimal
    parse_numerals_regex = /\A([0-9]+)\z/
    numeral_base = 10
  else
    parse_numerals_regex = /\A(?:U\+)?(\h+)\z/
    numeral_base = 16
  end

  codepoints.map{ |cp|
    case cp
    when Integer
      cp
    when parse_numerals_regex
      $1.to_i(numeral_base)
    else
      raise ArgumentError, "unicopy does not understand codepoint \"#{cp}\". Please pass hexadecimal codepoint values, separated by spaces, or use --string option"
    end
  }.tap{ |codepoints|
    codepoints.pack("U*").valid_encoding? or raise ArgumentError, "invalid codepoints passed to unicopy"
  }
end
unicopy(*args, string: false, dump: nil, parse_decimal: false, print: false) click to toggle source
# File lib/unicopy.rb, line 79
def self.unicopy(*args, string: false, dump: nil, parse_decimal: false, print: false)
  if args.empty?
    raise ArgumentError, "no data given to copy"
  elsif !string
    codepoints = transform_raw_codepoints(args.join(" ").split(" "), parse_decimal)
    if dump
      deliver(dump_codepoints(codepoints, format: dump), print: print, codepoints_length: codepoints.length, message: "dump of")
    else # default
      deliver(codepoints.pack("U*"), print: print, codepoints_length: codepoints.length, message: "string of")
    end
  else
    data = args.join("")
    data = data.encode("UTF-8") unless data.encoding.name == "UTF-8"
    codepoints = data.unpack("U*")

    deliver(dump_codepoints(codepoints, format: dump), print: print, codepoints_length: codepoints.length, message: "dump of")
  end
end