Sha256: 7ad323ef7b2a23ead21eac0d51364e22fbc5f4a5ec6a2e63e7395bdd17e0f97c

Contents?: true

Size: 1022 Bytes

Versions: 3

Compression:

Stored size: 1022 Bytes

Contents

module PlantumlBuilder
  class Encode64
    # Encoding alphabet
    # 0..9,
    # A..Z,
    # a..z,
    # -,
    # _
    ALPHABET = ['0'..'9',
                'A'..'Z',
                'a'..'z',
                %w[- _ ?]].map(&:to_a).flatten.freeze

    def initialize(string)
      self.diagram = string
      self.query   = ''
    end

    def encode
      align_diagram.map(&:ord).each_slice(3) do |slice|
        append3bytes(*slice)
      end

      query
    end

    private

    attr_accessor :diagram, :query

    def align_diagram
      chars = diagram.chars
      unaligned = chars.length % 3
      left = unaligned.zero? ? 0 : 3 - unaligned

      chars + [0] * left
    end

    def append3bytes(b1, b2, b3)
      c1 = b1 >> 2
      c2 = ((b1 & 0x3) << 4) | (b2 >> 4)
      c3 = ((b2 & 0xF) << 2) | (b3 >> 6)
      c4 = b3 & 0x3F

      [c1, c2, c3, c4].each do |c|
        self.query = query + encode6bit(c & 0x3F)
      end
    end

    def encode6bit(b)
      ALPHABET[b] || ALPHABET.last
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
plantuml_builder-0.3.0 lib/plantuml_builder/encode64.rb
plantuml_builder-0.2.0 lib/plantuml_builder/encode64.rb
plantuml_builder-0.1.1 lib/plantuml_builder/encode64.rb