The default format of today_fmt and html_last_updated_fmt is back to strftime format again

`html_last_updated_fmt` is commonly used for non date formatting. But
LDML is difficult to represent them from its characteristics.

Now we moved to strftime format again (ref: #2394).
This commit is contained in:
Takeshi KOMIYA 2016-04-02 10:23:13 +09:00
parent 5e0b542e62
commit d35ccb9b4c
10 changed files with 49 additions and 27 deletions

View File

@ -1,6 +1,13 @@
Release 1.4.1 (in development)
==============================
Incompatible changes
--------------------
* The default format of `today_fmt` and `html_last_updated_fmt` is back to
strftime format again. Locale Date Markup Language is also supported for
backward compatibility until Sphinx-1.5.
Translations
------------

View File

@ -330,13 +330,12 @@ Project information
replacement for ``|today|``.
* If you set :confval:`today` to a non-empty value, it is used.
* Otherwise, the current time is formatted using `Locale Data Markup Language
<http://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns>`_
and the format given in :confval:`today_fmt`.
* Otherwise, the current time is formatted using :func:`time.strftime` and
the format given in :confval:`today_fmt`.
The default is no :confval:`today` and a :confval:`today_fmt` of ``'MMMM dd,
YYYY'`` (or, if translation is enabled with :confval:`language`, an
equivalent %format for the selected locale).
The default is no :confval:`today` and a :confval:`today_fmt` of ``'%B %d,
%Y'`` (or, if translation is enabled with :confval:`language`, an equivalent
format for the selected locale).
.. versionchanged:: 1.4
@ -344,6 +343,12 @@ Project information
Language. strftime format is also supported for backward compatibility
until Sphinx-1.5.
.. versionchanged:: 1.4.1
Format specification was changed again from Locale Data Markup Language
to strftime. LDML format is also supported for backward compatibility
until Sphinx-1.5.
.. confval:: highlight_language
The default language to highlight source code in. The default is
@ -696,9 +701,8 @@ that use Sphinx's HTMLWriter class.
.. confval:: html_last_updated_fmt
If this is not None, a 'Last updated on:' timestamp is inserted
at every page bottom, using the given `Locale Data Markup Language
<http://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns>`_
format. The empty string is equivalent to ``'MMM dd, YYYY'`` (or a
at every page bottom, using the given :func:`strftime` format.
The empty string is equivalent to ``'%b %d, %Y'`` (or a
locale-dependent equivalent).
.. versionchanged:: 1.4
@ -707,6 +711,13 @@ that use Sphinx's HTMLWriter class.
Language. strftime format is also supported for backward compatibility
until Sphinx-1.5.
.. versionchanged:: 1.4.1
Format specification was changed again from Locale Data Markup Language
to strftime. LDML format is also supported for backward compatibility
until Sphinx-1.5.
.. confval:: html_use_smartypants
If true, `SmartyPants <http://daringfireball.net/projects/smartypants/>`_

View File

@ -530,7 +530,7 @@ class EpubBuilder(StandaloneHTMLBuilder):
metadata['copyright'] = self.esc(self.config.epub_copyright)
metadata['scheme'] = self.esc(self.config.epub_scheme)
metadata['id'] = self.esc(self.config.epub_identifier)
metadata['date'] = self.esc(format_date('YYYY-MM-dd', language=self.config.language,
metadata['date'] = self.esc(format_date('%Y-%m-%d', language=self.config.language,
warn=self.warn))
metadata['files'] = files
metadata['spine'] = spine

View File

@ -292,7 +292,7 @@ class StandaloneHTMLBuilder(Builder):
# typically doesn't include the time of day
lufmt = self.config.html_last_updated_fmt
if lufmt is not None:
self.last_updated = format_date(lufmt or _('MMM dd, YYYY'),
self.last_updated = format_date(lufmt or _('%b %d, %Y'),
language=self.config.language,
warn=self.warn)
else:

View File

@ -54,7 +54,7 @@ class DefaultSubstitutions(Transform):
text = config[refname]
if refname == 'today' and not text:
# special handling: can also specify a strftime format
text = format_date(config.today_fmt or _('MMMM dd, YYYY'),
text = format_date(config.today_fmt or _('%b %d, %Y'),
language=config.language, warn=env.warn)
ref.replace_self(nodes.Text(text, text))

View File

@ -179,13 +179,13 @@ def format_date(format, date=None, language=None, warn=None):
else:
date = datetime.now()
if '%' not in format:
if re.match('EEE|MMM|dd|DDD|MM|WW|medium|YY', format):
# consider the format as babel's
return babel_format_date(date, format, locale=language, warn=warn)
else:
warnings.warn('ustrftime format support will be dropped at Sphinx-1.5',
warnings.warn('LDML format support will be dropped at Sphinx-1.5',
DeprecationWarning)
return babel_format_date(date, format, locale=language, warn=warn)
else:
# consider the format as ustrftime's and try to convert it to babel's
result = []
tokens = re.split('(%.)', format)

View File

@ -371,8 +371,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
if builder.config.today:
self.elements['date'] = builder.config.today
else:
self.elements['date'] = format_date(builder.config.today_fmt or
_('MMMM dd, YYYY'),
self.elements['date'] = format_date(builder.config.today_fmt or _('%b %d, %Y'),
language=builder.config.language)
if builder.config.latex_logo:
self.elements['logo'] = '\\includegraphics{%s}\\par' % \

View File

@ -97,8 +97,7 @@ class ManualPageTranslator(BaseTranslator):
if builder.config.today:
self._docinfo['date'] = builder.config.today
else:
self._docinfo['date'] = format_date(builder.config.today_fmt or
_('MMMM dd, YYYY'),
self._docinfo['date'] = format_date(builder.config.today_fmt or _('%b %d, %Y'),
language=builder.config.language)
self._docinfo['copyright'] = builder.config.copyright
self._docinfo['version'] = builder.config.version

View File

@ -218,8 +218,7 @@ class TexinfoTranslator(nodes.NodeVisitor):
'project': self.escape(self.builder.config.project),
'copyright': self.escape(self.builder.config.copyright),
'date': self.escape(self.builder.config.today or
format_date(self.builder.config.today_fmt or
_('MMMM dd, YYYY'),
format_date(self.builder.config.today_fmt or _('%b %d, %Y'),
language=self.builder.config.language))
})
# title

View File

@ -169,6 +169,7 @@ def test_get_catalogs_with_compact(dir):
def test_format_date():
date = datetime.date(2016, 2, 7)
# default format
format = None
assert i18n.format_date(format, date=date) == 'Feb 7, 2016'
assert i18n.format_date(format, date=date, language='') == 'Feb 7, 2016'
@ -177,6 +178,7 @@ def test_format_date():
assert i18n.format_date(format, date=date, language='ja') == '2016/02/07'
assert i18n.format_date(format, date=date, language='de') == '07.02.2016'
# strftime format
format = '%B %d, %Y'
assert i18n.format_date(format, date=date) == 'February 07, 2016'
assert i18n.format_date(format, date=date, language='') == 'February 07, 2016'
@ -185,14 +187,19 @@ def test_format_date():
assert i18n.format_date(format, date=date, language='ja') == u'2月 07, 2016'
assert i18n.format_date(format, date=date, language='de') == 'Februar 07, 2016'
# invalid date format
# LDML format
format = 'MMM dd, YYYY'
assert i18n.format_date(format, date=date) == 'Feb 07, 2016'
assert i18n.format_date(format, date=date, language='') == 'Feb 07, 2016'
assert i18n.format_date(format, date=date, language='unknown') == 'Feb 07, 2016'
assert i18n.format_date(format, date=date, language='en') == 'Feb 07, 2016'
assert i18n.format_date(format, date=date, language='ja') == u'2月 07, 2016'
assert i18n.format_date(format, date=date, language='de') == 'Feb. 07, 2016'
# raw string
format = 'Mon Mar 28 12:37:08 2016, commit 4367aef'
assert i18n.format_date(format, date=date) == format
# quoted format
quoted_format = "'Mon Mar 28 12:37:08 2016, commit 4367aef'"
assert i18n.format_date(quoted_format, date=date) == format
def test_get_filename_for_language():
app = TestApp()