Class: String

Inherits:
Object show all
Defined in:
lib/vendor/puppet/util/zaml.rb,
lib/vendor/puppet/util/monkey_patches.rb

Constant Summary collapse

ZAML_ESCAPES =
{
  "\a" => "\\a", "\e" => "\\e", "\f" => "\\f", "\n" => "\\n",
  "\r" => "\\r", "\t" => "\\t", "\v" => "\\v"
}
ASCII_ENCODING =
Encoding.find("ASCII-8BIT")

Instance Method Summary collapse

Instance Method Details

#lines(separator = $/) ⇒ Object



151
152
153
154
155
# File 'lib/vendor/puppet/util/monkey_patches.rb', line 151

def lines(separator = $/)
  lines = split(separator)
  block_given? and lines.each {|line| yield line }
  lines
end

#to_ascii8bitObject



328
329
330
331
332
333
334
# File 'lib/vendor/puppet/util/zaml.rb', line 328

def to_ascii8bit
  if self.encoding == ASCII_ENCODING
    self
  else
    self.dup.force_encoding(ASCII_ENCODING)
  end
end

#to_zaml(z) ⇒ Object



279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
# File 'lib/vendor/puppet/util/zaml.rb', line 279

def to_zaml(z)
  z.with_structured_prefix(self) do
    case
    when self == ''
      z.emit('""')
    when self.to_ascii8bit !~ /\A(?: # ?: non-capturing group (grouping with no back references)
               [\x09\x0A\x0D\x20-\x7E]            # ASCII
             | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
             |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
             | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
             |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
             |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
             | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
             |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
             )*\z/mnx
      # Emit the binary tag, then recurse. Ruby splits BASE64 output at the 60
      # character mark when packing strings, and we can wind up a multi-line
      # string here.  We could reimplement the multi-line string logic,
      # but why would we - this does just as well for producing solid output.
      z.emit("!binary ")
      [self].pack("m*").to_zaml(z)

    # Only legal UTF-8 characters can make it this far, so we are safe
    # against emitting something dubious. That means we don't need to mess
    # about, just emit them directly. --daniel 2012-07-14
    when ((self =~ /\A[a-zA-Z\/][-\[\]_\/.a-zA-Z0-9]*\z/) and
        (self !~ /^(?:true|false|yes|no|on|null|off)$/i))
      # simple string literal, safe to emit unquoted.
      z.emit(self)
    when (self =~ /\n/ and self !~ /\A\s/ and self !~ /\s\z/)
      # embedded newline, split line-wise in quoted string block form.
      if self[-1..-1] == "\n" then z.emit('|+') else z.emit('|-') end
      z.nested { split("\n",-1).each { |line| z.nl; z.emit(line) } }
    else
      # ...though we still have to escape unsafe characters.
      escaped = gsub(/[\\"\x00-\x1F]/) do |c|
        ZAML_ESCAPES[c] || "\\x#{c[0].ord.to_s(16)}"
      end
      z.emit("\"#{escaped}\"")
    end
  end
end