diff options
| -rw-r--r-- | lib/asciidoctor/document.rb | 26 | ||||
| -rw-r--r-- | test/document_test.rb | 40 |
2 files changed, 49 insertions, 17 deletions
diff --git a/lib/asciidoctor/document.rb b/lib/asciidoctor/document.rb index bad2ae1b..99c7e9c2 100644 --- a/lib/asciidoctor/document.rb +++ b/lib/asciidoctor/document.rb @@ -1222,25 +1222,17 @@ class Document < AbstractBlock # %Z is OS dependent and may contain characters that aren't UTF-8 encoded (see asciidoctor#2770 and asciidoctor.js#23) localtime = (attrs['localtime'] ||= now.strftime %(%T #{now.utc_offset == 0 ? 'UTC' : '%z'})) attrs['localdatetime'] ||= %(#{localdate} #{localtime}) - if input_mtime - input_mtime = source_date_epoch if source_date_epoch - if (docdate = attrs['docdate']) - attrs['docyear'] ||= ((docdate.index '-') == 4 ? (docdate.slice 0, 4) : nil) - else - docdate = attrs['docdate'] = input_mtime.strftime '%F' - attrs['docyear'] ||= input_mtime.year.to_s - end - # %Z is OS dependent and may contain characters that aren't UTF-8 encoded (see asciidoctor#2770 and asciidoctor.js#23) - doctime = (attrs['doctime'] ||= input_mtime.strftime %(%T #{input_mtime.utc_offset == 0 ? 'UTC' : '%z'})) - attrs['docdatetime'] ||= %(#{docdate} #{doctime}) + # docdate, doctime and docdatetime should default to localdate, localtime and localdatetime if not otherwise set + input_mtime = source_date_epoch || input_mtime || now + if (docdate = attrs['docdate']) + attrs['docyear'] ||= ((docdate.index '-') == 4 ? (docdate.slice 0, 4) : nil) else - # docdate, doctime and docdatetime should default to - # localdate, localtime and localdatetime if not otherwise set - attrs['docdate'] ||= localdate - attrs['docyear'] ||= localyear - attrs['doctime'] ||= localtime - attrs['docdatetime'] ||= %(#{localdate} #{localtime}) + docdate = attrs['docdate'] = input_mtime.strftime '%F' + attrs['docyear'] ||= input_mtime.year.to_s end + # %Z is OS dependent and may contain characters that aren't UTF-8 encoded (see asciidoctor#2770 and asciidoctor.js#23) + doctime = (attrs['doctime'] ||= input_mtime.strftime %(%T #{input_mtime.utc_offset == 0 ? 'UTC' : '%z'})) + attrs['docdatetime'] ||= %(#{docdate} #{doctime}) nil end diff --git a/test/document_test.rb b/test/document_test.rb index b9218a01..1eb479d8 100644 --- a/test/document_test.rb +++ b/test/document_test.rb @@ -1718,4 +1718,44 @@ context 'Document' do assert_equal expect, result end end + + context 'Date time attributes' do + test 'should compute docyear and docdatetime from docdate and doctime' do + doc = Asciidoctor::Document.new [], attributes: {'docdate' => '2015-01-01', 'doctime' => '10:00:00-0700'} + assert_equal '2015-01-01', (doc.attr 'docdate') + assert_equal '2015', (doc.attr 'docyear') + assert_equal '10:00:00-0700', (doc.attr 'doctime') + assert_equal '2015-01-01 10:00:00-0700', (doc.attr 'docdatetime') + end + test 'should allow docdate and doctime to be overridden' do + doc = Asciidoctor::Document.new [], input_mtime: ::Time.now, attributes: {'docdate' => '2015-01-01', 'doctime' => '10:00:00-0700'} + assert_equal '2015-01-01', (doc.attr 'docdate') + assert_equal '2015', (doc.attr 'docyear') + assert_equal '10:00:00-0700', (doc.attr 'doctime') + assert_equal '2015-01-01 10:00:00-0700', (doc.attr 'docdatetime') + end + test 'should compute docdatetime from doctime' do + doc = Asciidoctor::Document.new [], attributes: {'doctime' => '10:00:00-0700'} + assert_equal '10:00:00-0700', (doc.attr 'doctime') + assert (doc.attr 'docdatetime').end_with?(' 10:00:00-0700') + end + test 'should compute docyear from docdate' do + doc = Asciidoctor::Document.new [], attributes: {'docdate' => '2015-01-01'} + assert_equal '2015', (doc.attr 'docyear') + assert (doc.attr 'docdatetime').start_with?('2015-01-01 ') + end + test 'should allow doctime to be overridden' do + doc = Asciidoctor::Document.new [], input_mtime: ::Time.new(2019, 01, 02, 3, 4, 5, "+06:00"), attributes: {'doctime' => '10:00:00-0700'} + assert_equal '2019-01-02', (doc.attr 'docdate') + assert_equal '2019', (doc.attr 'docyear') + assert_equal '10:00:00-0700', (doc.attr 'doctime') + assert_equal '2019-01-02 10:00:00-0700', (doc.attr 'docdatetime') + end + test 'should allow docdate to be overridden' do + doc = Asciidoctor::Document.new [], input_mtime: ::Time.new(2019, 01, 02, 3, 4, 5, "+06:00"), attributes: {'docdate' => '2015-01-01'} + assert_equal '2015-01-01', (doc.attr 'docdate') + assert_equal '2015', (doc.attr 'docyear') + assert_equal '2015-01-01 03:04:05 +0600', (doc.attr 'docdatetime') + end + end end |
