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