Class: Pdfrb::Arlington::PdfVersion
- Inherits:
-
Object
- Object
- Pdfrb::Arlington::PdfVersion
- 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
-
#extensions ⇒ Object
readonly
Returns the value of attribute extensions.
-
#literal ⇒ Object
readonly
Returns the value of attribute literal.
-
#major ⇒ Object
readonly
Returns the value of attribute major.
-
#minor ⇒ Object
readonly
Returns the value of attribute minor.
Class Method Summary collapse
-
.from_tsv_cell(str) ⇒ Object
Parse a TSV cell.
- .latest ⇒ Object
Instance Method Summary collapse
- #<=>(other) ⇒ Object
- #before?(other) ⇒ Boolean
- #deprecated_at?(deprecated_in) ⇒ Boolean
- #eql?(other) ⇒ Boolean (also: #==)
- #hash ⇒ Object
-
#initialize(version, extensions: []) ⇒ PdfVersion
constructor
A new instance of PdfVersion.
- #predicate_wrapped? ⇒ Boolean
- #since?(other) ⇒ Boolean
- #to_a ⇒ Object
- #to_s ⇒ Object
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
#extensions ⇒ Object (readonly)
Returns the value of attribute extensions.
18 19 20 |
# File 'lib/pdfrb/arlington/pdf_version.rb', line 18 def extensions @extensions end |
#literal ⇒ Object (readonly)
Returns the value of attribute literal.
18 19 20 |
# File 'lib/pdfrb/arlington/pdf_version.rb', line 18 def literal @literal end |
#major ⇒ Object (readonly)
Returns the value of attribute major.
18 19 20 |
# File 'lib/pdfrb/arlington/pdf_version.rb', line 18 def major @major end |
#minor ⇒ Object (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 |
.latest ⇒ Object
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
89 90 91 |
# File 'lib/pdfrb/arlington/pdf_version.rb', line 89 def before?(other) self < other end |
#deprecated_at?(deprecated_in) ⇒ 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: ==
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 |
#hash ⇒ Object
76 77 78 |
# File 'lib/pdfrb/arlington/pdf_version.rb', line 76 def hash to_a.hash end |
#predicate_wrapped? ⇒ Boolean
99 100 101 |
# File 'lib/pdfrb/arlington/pdf_version.rb', line 99 def predicate_wrapped? @extensions == [:predicate] end |
#since?(other) ⇒ Boolean
85 86 87 |
# File 'lib/pdfrb/arlington/pdf_version.rb', line 85 def since?(other) self >= other end |
#to_a ⇒ Object
66 67 68 |
# File 'lib/pdfrb/arlington/pdf_version.rb', line 66 def to_a [@major, @minor] end |
#to_s ⇒ Object
62 63 64 |
# File 'lib/pdfrb/arlington/pdf_version.rb', line 62 def to_s "#{@major}.#{@minor}" end |