def test_format_date_in_string_customization(localeborg_base): assert LocaleBorg().format_date_in_string( "Foo {month:'miesiąca' MMMM} Bar", TESLA_BIRTHDAY, 'pl') == 'Foo miesiąca lipca Bar' assert LocaleBorg().format_date_in_string("Foo {month_year:MMMM yyyy} Bar", TESLA_BIRTHDAY, 'pl') == 'Foo lipca 1856 Bar'
def test_format_date_locale_variants(): LocaleBorg.reset() LocaleBorg.initialize({'en': 'en_US'}, 'en') assert LocaleBorg().formatted_date('long', TESLA_BIRTHDAY_DT, 'en') == DT_EN_US LocaleBorg.reset() LocaleBorg.initialize({'en': 'en_GB'}, 'en') assert LocaleBorg().formatted_date('long', TESLA_BIRTHDAY_DT, 'en') == '10 July 1856 at 12:34:56 UTC'
def localeborg_base(): """A base config of LocaleBorg.""" LocaleBorg.reset() assert not LocaleBorg.initialized LocaleBorg.initialize({}, 'en') assert LocaleBorg.initialized assert LocaleBorg().current_lang == 'en' return None
def localeborg_base(): """A base config of LocaleBorg.""" LocaleBorg.reset() assert not LocaleBorg.initialized LocaleBorg.initialize({}, 'en') assert LocaleBorg.initialized assert LocaleBorg().current_lang == 'en' return None
def test_set_locale(localeborg_base): LocaleBorg().set_locale('pl') assert LocaleBorg.initialized assert LocaleBorg().current_lang == 'pl' LocaleBorg().set_locale('xx') # fake language -- used to ensure any locale can be supported assert LocaleBorg.initialized assert LocaleBorg().current_lang == 'xx' assert LocaleBorg().set_locale('xz') == '' # empty string for template ease of use
def test_initialize(): LocaleBorg.reset() assert not LocaleBorg.initialized LocaleBorg.initialize({}, 'en') assert LocaleBorg.initialized assert LocaleBorg().current_lang == 'en' LocaleBorg.reset() LocaleBorg.initialize({}, 'pl') assert LocaleBorg.initialized assert LocaleBorg().current_lang == 'pl'
def localeborg_reset(): """ Reset the LocaleBorg before and after every test. """ LocaleBorg.reset() assert not LocaleBorg.initialized try: yield finally: LocaleBorg.reset() assert not LocaleBorg.initialized
def test_format_date_translatablesetting(localeborg_base): df = TranslatableSetting("DATE_FORMAT", { 'en': "'en' MMMM", 'pl': "MMMM 'pl'" }, { 'en': '', 'pl': '' }) assert LocaleBorg().formatted_date(df, TESLA_BIRTHDAY_DT, 'en') == 'en July' assert LocaleBorg().formatted_date(df, TESLA_BIRTHDAY_DT, 'pl') == 'lipca pl'
def test_format_date_timezone(localeborg_base): tesla_150_birthday_dtz = datetime.datetime( 2006, 7, 10, 12, 34, 56, tzinfo=dateutil.tz.gettz('America/New_York')) assert LocaleBorg().formatted_date( 'long', tesla_150_birthday_dtz) == 'July 10, 2006 at 12:34:56 PM -0400' nodst = datetime.datetime(2006, 1, 10, 12, 34, 56, tzinfo=dateutil.tz.gettz('America/New_York')) assert LocaleBorg().formatted_date( 'long', nodst) == 'January 10, 2006 at 12:34:56 PM -0500'
def test_format_date_locale_variants(): LocaleBorg.reset() LocaleBorg.initialize({'en': 'en_US'}, 'en') assert LocaleBorg().formatted_date('long', TESLA_BIRTHDAY_DT, 'en') == DT_EN_US LocaleBorg.reset() LocaleBorg.initialize({'en': 'en_GB'}, 'en') assert LocaleBorg().formatted_date('long', TESLA_BIRTHDAY_DT, 'en') == '10 July 1856 at 12:34:56 UTC'
def read_metadata(self, post, lang=None): """Read the metadata from a post, and return a metadata dict.""" if lang is None: lang = LocaleBorg().current_lang source_path = post.translated_source_path(lang) with io.open(source_path, 'r', encoding='utf-8') as inf: data = inf.read() _, _, _, document = rst2html(data, logger=self.logger, source_path=source_path, transforms=self.site.rst_transforms, no_title_transform=False) meta = {} if 'title' in document: meta['title'] = document['title'] for docinfo in document.traverse(docutils.nodes.docinfo): for element in docinfo.children: if element.tagname == 'field': # custom fields (e.g. summary) name_elem, body_elem = element.children name = name_elem.astext() value = body_elem.astext() elif element.tagname == 'authors': # author list name = element.tagname value = [element.astext() for element in element.children] else: # standard fields (e.g. address) name = element.tagname value = element.astext() name = name.lower() meta[name] = value # Put 'authors' meta field contents in 'author', too if 'authors' in meta and 'author' not in meta: meta['author'] = '; '.join(meta['authors']) # Map metadata from other platforms to names Nikola expects (Issue #2817) map_metadata(meta, 'rest_docinfo', self.site.config) return meta
def compile_string(self, data, source_path=None, is_two_file=True): """Compile reST into HTML strings.""" # If errors occur, this will be added to the line number reported by # docutils so the line number matches the actual line number (off by # 7 with default metadata, could be more or less depending on the post). add_ln = 0 if not is_two_file: m_data, data = self.split_metadata(data) add_ln = len(m_data.splitlines()) + 1 default_template_path = os.path.join(os.path.dirname(__file__), 'template.txt') settings_overrides = { 'initial_header_level': 1, 'record_dependencies': True, 'stylesheet_path': None, 'link_stylesheet': True, 'syntax_highlight': 'short', 'math_output': 'mathjax', 'template': default_template_path, 'language_code': LEGAL_VALUES['DOCUTILS_LOCALES'].get(LocaleBorg().current_lang, 'en') } output, error_level, deps = rst2html( data, settings_overrides=settings_overrides, logger=self.logger, source_path=source_path, l_add_ln=add_ln, transforms=self.site.rst_transforms, no_title_transform=self.site.config.get('NO_DOCUTILS_TITLE_TRANSFORM', False)) if not isinstance(output, unicode_str): # To prevent some weird bugs here or there. # Original issue: empty files. `output` became a bytestring. output = output.decode('utf-8') return output, error_level, deps
def compile(self, source, dest, is_two_file=True, post=None, lang=None): if lang is None: lang = LocaleBorg().current_lang makedirs(os.path.dirname(dest)) with io.open(dest, "w+", encoding="utf8") as out_file: # Read post with io.open(source, "r", encoding="utf8") as in_file: data = in_file.read() if not is_two_file: data = re.split('(\n\n|\r\n\r\n)', data, maxsplit=1)[-1] # Read additional data additional_data, dependent_files = self.load_additional_data( source) # Process post context = Context(hash(data), name=source, additional_data=additional_data) for filename in dependent_files: context.add_file_dependency(filename, 'fragment') output = self.__formatData(data, context) # Write result out_file.write(output) if post is None: deps_path = dest + '.wpdep' else: deps_path = self._get_dep_filename(post, lang) self._write_deps(context, deps_path)
def read_metadata(self, post, file_metadata_regexp=None, unslugify_titles=False, lang=None): """Read the metadata from a post's meta tags, and return a metadata dict.""" if lang is None: lang = LocaleBorg().current_lang source_path = post.translated_source_path(lang) with io.open(source_path, 'r', encoding='utf-8-sig') as inf: data = inf.read() metadata = {} try: doc = lxml.html.document_fromstring(data) except lxml.etree.ParserError as e: # Issue #374 -> #2851 if str(e) == "Document is empty": return {} # let other errors raise raise title_tag = doc.find('*//title') if title_tag is not None and title_tag.text: metadata['title'] = title_tag.text meta_tags = doc.findall('*//meta') for tag in meta_tags: k = tag.get('name', '').lower() if not k: continue elif k == 'keywords': k = 'tags' content = tag.get('content') if content: metadata[k] = content map_metadata(metadata, 'html_metadata', self.site.config) return metadata
def test_format_date_timezone(base_config): tesla_150_birthday_dtz = datetime.datetime( 2006, 7, 10, 12, 34, 56, tzinfo=dateutil.tz.gettz("America/New_York")) formatted_date = LocaleBorg().formatted_date("long", tesla_150_birthday_dtz) assert formatted_date == "July 10, 2006 at 12:34:56 PM -0400" nodst = datetime.datetime(2006, 1, 10, 12, 34, 56, tzinfo=dateutil.tz.gettz("America/New_York")) formatted_date = LocaleBorg().formatted_date("long", nodst) assert formatted_date == "January 10, 2006 at 12:34:56 PM -0500"
def test_initialize(): LocaleBorg.reset() assert not LocaleBorg.initialized LocaleBorg.initialize({}, 'en') assert LocaleBorg.initialized assert LocaleBorg().current_lang == 'en' LocaleBorg.reset() LocaleBorg.initialize({}, 'pl') assert LocaleBorg.initialized assert LocaleBorg().current_lang == 'pl'
def handler(self, site=None, data=None, lang=None, file=None, template=None, post=None, recurring_month=False): if not template: template = 'calendar.tmpl' deps = self.site.template_system.template_deps(template) if file is not None: with open(file, 'rb') as inf: data = inf.read() deps.append(file) cal = ical.Calendar.from_ical(data) events = [] for element in cal.walk(): eventdict = {} if element.name == "VEVENT": if element.get('summary') is not None: eventdict['summary'] = element.get('summary') if element.get('description') is not None: eventdict['description'] = element.get('description') if element.get('url') is not None: eventdict['url'] = element.get('url') if element.get('dtstart') is not None: eventdict['dtstart'] = element.get('dtstart').dt if element.get('dtend') is not None: eventdict['dtend'] = element.get('dtend').dt event_length = element.get('dtend').dt - element.get( 'dtstart').dt if element.get('duration') is not None: event_length = element.decoded('duration') eventdict['dtend'] = element.get( 'dtstart').dt + event_length if element.get('location') is not None: eventdict['location'] = element.get('location') events.append(eventdict) if 'RRULE' in element and recurring_month: for date in self._calculate_recurring( element, recurring_month): subevent = dict(eventdict) subevent['dtstart'] = date subevent['dtend'] = date + event_length events.append(subevent) output = self.site.render_template(template, None, { 'events': events, 'lang': LocaleBorg().current_lang, }) return output, deps
def test_format_date_translatablesetting(base_config, lang, expected_string): df = TranslatableSetting("DATE_FORMAT", { "en": "'en' MMMM", "pl": "MMMM 'pl'" }, { "en": "", "pl": "" }) assert LocaleBorg().formatted_date(df, TESLA_BIRTHDAY_DT, lang) == expected_string
def test_format_date_long(localeborg_base): assert LocaleBorg().formatted_date('long', TESLA_BIRTHDAY_DT) == DT_EN_US assert LocaleBorg().formatted_date('long', TESLA_BIRTHDAY_DT, 'en') == DT_EN_US assert LocaleBorg().formatted_date('long', TESLA_BIRTHDAY_DT, 'pl') == DT_PL LocaleBorg().set_locale('pl') assert LocaleBorg().formatted_date('long', TESLA_BIRTHDAY_DT) == DT_PL assert LocaleBorg().formatted_date('long', TESLA_BIRTHDAY_DT, 'en') == DT_EN_US
def test_locale_base(): LocaleBorg.reset() LocaleBorg.initialize(LEGAL_VALUES['LOCALES_BASE'], 'en') assert LocaleBorg().formatted_date('long', TESLA_BIRTHDAY_DT, 'sr') == '10. јул 1856. 12:34:56 UTC' assert LocaleBorg().formatted_date( 'long', TESLA_BIRTHDAY_DT, 'sr_latin') == '10. jul 1856. 12:34:56 UTC'
def render(self, target_language=None, **context): # We bypass BaseTemplate.render because it wants to setup # a bunch of translation stuff that's only applicable to # zope.i18n, and it overrides the translate function we pass # in which came from Nikola. assert 'request' in context assert 'translate' in context if target_language is None: target_language = LocaleBorg().current_lang context['target_language'] = target_language # pylint:disable=bad-super-call return super(BaseTemplate, self).render(**context)
def test_format_date_in_string_month_day_year_gb(): LocaleBorg.reset() LocaleBorg.initialize({'en': 'en_GB'}, 'en') assert LocaleBorg().format_date_in_string( "Foo {month_day_year} Bar", TESLA_BIRTHDAY) == 'Foo 10 July 1856 Bar' assert LocaleBorg().format_date_in_string("Foo {month_day_year} Bar", TESLA_BIRTHDAY, 'pl') == 'Foo 10 lipca 1856 Bar'
def localeborg_base(): """A base config of LocaleBorg.""" LocaleBorg.reset() assert not LocaleBorg.initialized LocaleBorg.initialize({}, "en") assert LocaleBorg.initialized assert LocaleBorg().current_lang == "en" try: yield finally: LocaleBorg.reset() assert not LocaleBorg.initialized
def read_metadata(self, post, lang=None): """Read metadata directly from ipynb file. As ipynb files support arbitrary metadata as json, the metadata used by Nikola will be assume to be in the 'nikola' subfield. """ self._req_missing_ipynb() if lang is None: lang = LocaleBorg().current_lang source = post.translated_source_path(lang) with io.open(source, "r", encoding="utf8") as in_file: nb_json = nbformat.read(in_file, current_nbformat) # Metadata might not exist in two-file posts or in hand-crafted # .ipynb files. return nb_json.get('metadata', {}).get('nikola', {})
def generate_calendar_template(timezone_name, filename, days_in_past, days_in_future, output_filename): template = 'calendar_preformat.tmpl' deps = self.site.template_system.template_deps(template) deps.append(filename) events = collect_events(filename, days_in_past, days_in_future) output = self.site.render_template( template, None, { 'events': sorted(events, key=lambda k: k['dtstart']), 'lang': LocaleBorg().current_lang, }) with open("plugins/calendar_preformat/templates/jinja/%s" % output_filename, "w") as outputfile: outputfile.write(output)
def localeborg_setup(default_locale): """ Reset the LocaleBorg before and after every test. """ LocaleBorg.reset() LocaleBorg.initialize({}, default_locale) try: yield finally: LocaleBorg.reset()
def localeborg(default_locale): """ LocaleBorg with default settings """ LocaleBorg.reset() LocaleBorg.initialize({}, default_locale) try: yield finally: LocaleBorg.reset()
def test_format_date_long(base_config): assert LocaleBorg().formatted_date("long", TESLA_BIRTHDAY_DT) == DT_EN_US assert LocaleBorg().formatted_date("long", TESLA_BIRTHDAY_DT, "en") == DT_EN_US assert LocaleBorg().formatted_date("long", TESLA_BIRTHDAY_DT, "pl") == DT_PL LocaleBorg().set_locale("pl") assert LocaleBorg().formatted_date("long", TESLA_BIRTHDAY_DT) == DT_PL assert LocaleBorg().formatted_date("long", TESLA_BIRTHDAY_DT, "en") == DT_EN_US
def add_header_permalinks(fname, xpath_list=None, file_blacklist=None): """Post-process HTML via lxml to add header permalinks Sphinx-style.""" # Blacklist requires custom file handling file_blacklist = file_blacklist or [] if fname in file_blacklist: return with io.open(fname, 'r', encoding='utf-8') as inf: data = inf.read() doc = lxml.html.document_fromstring(data) # Get language for slugify try: lang = doc.attrib['lang'] # <html lang="…"> except KeyError: # Circular import workaround (utils imports filters) from nikola.utils import LocaleBorg lang = LocaleBorg().current_lang xpath_set = set() if not xpath_list: xpath_list = ['*//div[@class="e-content entry-content"]//{hx}'] for xpath_expr in xpath_list: for hx in ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']: xpath_set.add(xpath_expr.format(hx=hx)) for x in xpath_set: nodes = doc.findall(x) for node in nodes: parent = node.getparent() if 'id' in node.attrib: hid = node.attrib['id'] elif 'id' in parent.attrib: # docutils: <div> has an ID and contains the header hid = parent.attrib['id'] else: # Using force-mode, because not every character can appear in a # HTML id node.attrib['id'] = slugify(node.text_content(), lang, True) hid = node.attrib['id'] new_node = lxml.html.fragment_fromstring( '<a href="#{0}" class="headerlink" title="Permalink to this heading">¶</a>' .format(hid)) node.append(new_node) with io.open(fname, 'w', encoding='utf-8') as outf: outf.write('<!DOCTYPE html>\n' + lxml.html.tostring(doc, encoding="unicode"))
def read_metadata(self, post, lang=None): """Read the metadata from a post, and return a metadata dict.""" if lang is None: lang = LocaleBorg().current_lang source_path = post.translated_source_path(lang) # Silence reST errors, some of which are due to a different # environment. Real issues will be reported while compiling. null_logger = logbook.Logger('NULL') null_logger.handlers = [logbook.NullHandler()] with io.open(source_path, 'r', encoding='utf-8') as inf: data = inf.read() _, _, _, document = rst2html(data, logger=null_logger, source_path=source_path, transforms=self.site.rst_transforms) meta = {} if 'title' in document: meta['title'] = document['title'] for docinfo in document.traverse(docutils.nodes.docinfo): for element in docinfo.children: if element.tagname == 'field': # custom fields (e.g. summary) name_elem, body_elem = element.children name = name_elem.astext() value = body_elem.astext() elif element.tagname == 'authors': # author list name = element.tagname value = [element.astext() for element in element.children] else: # standard fields (e.g. address) name = element.tagname value = element.astext() name = name.lower() meta[name] = value # Put 'authors' meta field contents in 'author', too if 'authors' in meta and 'author' not in meta: meta['author'] = '; '.join(meta['authors']) # Map metadata from other platforms to names Nikola expects (Issue #2817) map_metadata(meta, 'rest_docinfo', self.site.config) return meta
def run(self): gallery_name = self.arguments[0] kw = { 'output_folder': self.site.config['OUTPUT_FOLDER'], 'thumbnail_size': self.site.config['THUMBNAIL_SIZE'], } gallery_index_file = os.path.join( kw['output_folder'], self.site.path('gallery', gallery_name)) gallery_index_path = self.site.path('gallery', gallery_name) gallery_folder = os.path.dirname(gallery_index_path) self.state.document.settings.record_dependencies.add( gallery_index_file) with open(gallery_index_file, 'r') as inf: data = inf.read() dom = lxml.html.fromstring(data) text = [ e.text for e in dom.xpath('//script') if e.text and 'jsonContent = ' in e.text ][0] photo_array = json.loads(text.split(' = ', 1)[1].split(';', 1)[0]) for img in photo_array: img['url'] = '/' + '/'.join([gallery_folder, img['url']]) img['url_thumb'] = '/' + '/'.join( [gallery_folder, img['url_thumb']]) photo_array_json = json.dumps(photo_array) context = {} context['description'] = '' context['title'] = '' context['lang'] = LocaleBorg().current_lang context['crumbs'] = [] context['folders'] = [] context['photo_array'] = photo_array context['photo_array_json'] = photo_array_json context['permalink'] = '#' context.update(self.site.GLOBAL_CONTEXT) context.update(kw) output = self.site.template_system.render_template( 'gallery.tmpl', None, context) # This magical comment makes everything work. Try removing it! output = '\n<!-- foo -->\n%s\n\n\n' % output return [nodes.raw('', output, format='html')]
def read_metadata(self, post, file_metadata_regexp=None, unslugify_titles=False, lang=None): """Read the metadata from a post, and return a metadata dict.""" if not self.support_metadata: return {} if Markdown is None: req_missing(['markdown'], 'build this site (compile Markdown)') if lang is None: lang = LocaleBorg().current_lang source = post.translated_source_path(lang) with io.open(source, 'r', encoding='utf-8') as inf: # Note: markdown meta returns lowercase keys data = inf.read() # If the metadata starts with "---" it's actually YAML and # we should not let markdown parse it, because it will do # bad things like setting empty tags to "''" if data.startswith('---\n'): return {} _, meta = self.converter.convert(data) # Map metadata from other platforms to names Nikola expects (Issue #2817) map_metadata(meta, 'markdown_metadata', self.site.config) return meta
def compile_string(self, data, source_path=None, is_two_file=True, post=None, lang=None): """Compile Markdown into HTML strings.""" if lang is None: lang = LocaleBorg().current_lang if Markdown is None: req_missing(['markdown'], 'build this site (compile Markdown)') if not is_two_file: _, data = self.split_metadata(data, post, lang) new_data, shortcodes = sc.extract_shortcodes(data) output, _ = self.converters[lang].convert(new_data) output, shortcode_deps = self.site.apply_shortcodes_uuid( output, shortcodes, filename=source_path, extra_context={'post': post}) return output, shortcode_deps
def test_locale_base(): LocaleBorg.reset() LocaleBorg.initialize(LEGAL_VALUES['LOCALES_BASE'], 'en') assert LocaleBorg().formatted_date('long', TESLA_BIRTHDAY_DT, 'sr') == '10. јул 1856. 12:34:56 UTC' assert LocaleBorg().formatted_date('long', TESLA_BIRTHDAY_DT, 'sr_latin') == '10. jul 1856. 12:34:56 UTC'
def test_initilalize_failure(): LocaleBorg.reset() with pytest.raises(ValueError): LocaleBorg.initialize({}, None) LocaleBorg.initialize({}, '') assert not LocaleBorg.initialized
def test_uninitialized_error(): LocaleBorg.reset() with pytest.raises(LocaleBorgUninitializedException): LocaleBorg()
def test_format_date_in_string_month_day_year_gb(): LocaleBorg.reset() LocaleBorg.initialize({'en': 'en_GB'}, 'en') assert LocaleBorg().format_date_in_string("Foo {month_day_year} Bar", TESLA_BIRTHDAY) == 'Foo 10 July 1856 Bar' assert LocaleBorg().format_date_in_string("Foo {month_day_year} Bar", TESLA_BIRTHDAY, 'pl') == 'Foo 10 lipca 1856 Bar'