Class: Pdfrb::Arlington::PdfVersion

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/pdfrb/arlington/pdf_version.rb

Overview

PDF version value object. Comparable by [major, minor]. Handles the 9 canonical versions (1.0..1.7, 2.0) plus predicate-wrapped variants (fn:Extension(name, version), fn:Eval(expr)).

For predicate-wrapped versions, the literal is the version embedded in the predicate; extensions captures the named extension(s) attached. Evaluator-side predicate handling decides whether an extension applies to a given document.

Constant Summary collapse

CANONICAL =
%w[1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 2.0].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(version, extensions: []) ⇒ PdfVersion

Returns a new instance of PdfVersion.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/pdfrb/arlington/pdf_version.rb', line 20

def initialize(version, extensions: [])
  case version
  when PdfVersion
    @major = version.major
    @minor = version.minor
    @literal = version.literal
    @extensions = version.extensions
  when ::String
    @literal = parse_literal(version)
    @major, @minor = parse_major_minor(@literal)
    @extensions = extensions
  else
    raise ArgumentError, "PdfVersion needs a String, got #{version.class}"
  end
  freeze
end

Instance Attribute Details

#extensionsObject (readonly)

Returns the value of attribute extensions.



18
19
20
# File 'lib/pdfrb/arlington/pdf_version.rb', line 18

def extensions
  @extensions
end

#literalObject (readonly)

Returns the value of attribute literal.



18
19
20
# File 'lib/pdfrb/arlington/pdf_version.rb', line 18

def literal
  @literal
end

#majorObject (readonly)

Returns the value of attribute major.



18
19
20
# File 'lib/pdfrb/arlington/pdf_version.rb', line 18

def major
  @major
end

#minorObject (readonly)

Returns the value of attribute minor.



18
19
20
# File 'lib/pdfrb/arlington/pdf_version.rb', line 18

def minor
  @minor
end

Class Method Details

.from_tsv_cell(str) ⇒ Object

Parse a TSV cell. Tolerates:

"1.7"                          -> 1.7
"fn:Extension(ISO_19005_3,1.7)" -> 1.7 + extension ISO_19005_3
"fn:Eval(...)"                  -> latest (caller resolves via predicate)


43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/pdfrb/arlington/pdf_version.rb', line 43

def self.from_tsv_cell(str)
  return nil if str.nil? || str.empty?

  s = str.strip
  case s
  when /\A(\d+\.\d+)\z/
    new(Regexp.last_match(1))
  when /\Afn:Extension\(([^,]+),\s*(\d+\.\d+)\)\z/
    new(Regexp.last_match(2), extensions: [Regexp.last_match(1)])
  when /\Afn:Extension\(([^,)]+)\)\z/
    # name-only extension (e.g. fn:Extension(OpenOffice)) — no version.
    new("2.0", extensions: [Regexp.last_match(1)])
  when /\Afn:Eval\(/, /\Afn:SinceVersion\(/, /\Afn:IsPDFVersion\(/
    new("2.0", extensions: [:predicate]) # caller resolves via predicate
  else
    raise Pdfrb::ParseError, "unrecognised PDF version: #{str.inspect}"
  end
end

.latestObject



37
# File 'lib/pdfrb/arlington/pdf_version.rb', line 37

def self.latest; new("2.0"); end

Instance Method Details

#<=>(other) ⇒ Object



70
71
72
73
74
# File 'lib/pdfrb/arlington/pdf_version.rb', line 70

def <=>(other)
  return nil unless other.is_a?(PdfVersion)

  to_a <=> other.to_a
end

#before?(other) ⇒ Boolean

Returns:

  • (Boolean)


89
90
91
# File 'lib/pdfrb/arlington/pdf_version.rb', line 89

def before?(other)
  self < other
end

#deprecated_at?(deprecated_in) ⇒ Boolean

Returns:

  • (Boolean)


93
94
95
96
97
# File 'lib/pdfrb/arlington/pdf_version.rb', line 93

def deprecated_at?(deprecated_in)
  return false unless deprecated_in

  self >= deprecated_in
end

#eql?(other) ⇒ Boolean Also known as: ==

Returns:

  • (Boolean)


80
81
82
# File 'lib/pdfrb/arlington/pdf_version.rb', line 80

def eql?(other)
  other.is_a?(PdfVersion) && to_a == other.to_a
end

#hashObject



76
77
78
# File 'lib/pdfrb/arlington/pdf_version.rb', line 76

def hash
  to_a.hash
end

#predicate_wrapped?Boolean

Returns:

  • (Boolean)


99
100
101
# File 'lib/pdfrb/arlington/pdf_version.rb', line 99

def predicate_wrapped?
  @extensions == [:predicate]
end

#since?(other) ⇒ Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/pdfrb/arlington/pdf_version.rb', line 85

def since?(other)
  self >= other
end

#to_aObject



66
67
68
# File 'lib/pdfrb/arlington/pdf_version.rb', line 66

def to_a
  [@major, @minor]
end

#to_sObject



62
63
64
# File 'lib/pdfrb/arlington/pdf_version.rb', line 62

def to_s
  "#{@major}.#{@minor}"
end