Exemplo n.º 1
0
 def _is_potential_source_path(self, path):
     """Return True if path was supposed to be used as a source file.
     (This includes all source files that have been found by generators
     before this method is called, even if they failed to process.)
     The path argument is expected to be relative to self.path.
     """
     return posixize_path(os.path.normpath(path)) in self.context['filenames']
Exemplo n.º 2
0
 def _is_potential_source_path(self, path):
     """Return True if path was supposed to be used as a source file.
     (This includes all source files that have been found by generators
     before this method is called, even if they failed to process.)
     The path argument is expected to be relative to self.path.
     """
     return posixize_path(os.path.normpath(path)) in self.context['filenames']
Exemplo n.º 3
0
 def _add_failed_source_path(self, path, static=False):
     """Record a source file path that a Generator failed to process.
     (For example, one that was missing mandatory metadata.)
     The path argument is expected to be relative to self.path.
     """
     key = 'static_content' if static else 'generated_content'
     self.context[key][posixize_path(os.path.normpath(path))] = None
Exemplo n.º 4
0
 def _add_failed_source_path(self, path, static=False):
     """Record a source file path that a Generator failed to process.
     (For example, one that was missing mandatory metadata.)
     The path argument is expected to be relative to self.path.
     """
     key = 'static_content' if static else 'generated_content'
     self.context[key][posixize_path(os.path.normpath(path))] = None
Exemplo n.º 5
0
def normalize_path(path):
    path = posixize_path(osp.normpath(path))
    if not osp.isabs(path):
        path = osp.join('/', path)
    if osp.basename(path) == "index.html":
        path = osp.dirname(path)

    return path
Exemplo n.º 6
0
 def _is_potential_source_path(self, path, static=False):
     """Return True if path was supposed to be used as a source file.
     (This includes all source files that have been found by generators
     before this method is called, even if they failed to process.)
     The path argument is expected to be relative to self.path.
     """
     key = 'static_content' if static else 'generated_content'
     return (posixize_path(os.path.normpath(path)) in self.context[key])
Exemplo n.º 7
0
 def _is_potential_source_path(self, path, static=False):
     """Return True if path was supposed to be used as a source file.
     (This includes all source files that have been found by generators
     before this method is called, even if they failed to process.)
     The path argument is expected to be relative to self.path.
     """
     key = 'static_content' if static else 'generated_content'
     return (posixize_path(os.path.normpath(path)) in self.context[key])
Exemplo n.º 8
0
 def test_pass_deep_subpaths(self):
     self.assertEqual(
         utils.sanitised_join(
             "/foo/bar",
             "test"
         ),
         utils.posixize_path(
             os.path.abspath(os.path.join("/foo/bar", "test")))
     )
Exemplo n.º 9
0
    def test_not_save_as_draft(self):
        """Static.save_as is not affected by draft status."""

        static = Static(content=None,
                        metadata=dict(status='draft', ),
                        settings=self.settings,
                        source_path=os.path.join('dir', 'foo.jpg'),
                        context=self.settings.copy())

        expected_save_as = posixize_path(os.path.join('dir', 'foo.jpg'))
        self.assertEqual(static.status, 'draft')
        self.assertEqual(static.save_as, expected_save_as)
        self.assertEqual(static.url, path_to_url(expected_save_as))
Exemplo n.º 10
0
    def get_relative_source_path(self, source_path=None):
        """Return the relative path (from the content path) to the given
        source_path.

        If no source path is specified, use the source path of this
        content object.
        """
        if not source_path:
            source_path = self.source_path
        if source_path is None:
            return None

        return posixize_path(
            os.path.relpath(
                os.path.abspath(
                    os.path.join(self.settings['PATH'], source_path)),
                os.path.abspath(self.settings['PATH'])))
Exemplo n.º 11
0
    def get_relative_source_path(self, source_path=None):
        """Return the relative path (from the content path) to the given
        source_path.

        If no source path is specified, use the source path of this
        content object.
        """
        if not source_path:
            source_path = self.source_path
        if source_path is None:
            return None

        return posixize_path(
            os.path.relpath(
                os.path.abspath(os.path.join(self.settings['PATH'], source_path)),
                os.path.abspath(self.settings['PATH'])
            ))
Exemplo n.º 12
0
def path_metadata(full_path, source_path, settings=None):
    metadata = {}
    if settings:
        if settings.get('DEFAULT_DATE', None) == 'fs':
            metadata['date'] = datetime.datetime.fromtimestamp(
                os.stat(full_path).st_mtime)
            metadata['modified'] = metadata['date']

        # Apply EXTRA_PATH_METADATA for the source path and the paths of any
        # parent directories. Sorting EPM first ensures that the most specific
        # path wins conflicts.

        epm = settings.get('EXTRA_PATH_METADATA', {})
        for path, meta in sorted(epm.items()):
            # Enforce a trailing slash when checking for parent directories.
            # This prevents false positives when one file or directory's name
            # is a prefix of another's.
            dirpath = posixize_path(os.path.join(path, ''))
            if source_path == path or source_path.startswith(dirpath):
                metadata.update(meta)

    return metadata
Exemplo n.º 13
0
 def _add_failed_source_path(self, path):
     """Record a source file path that a Generator failed to process.
     (For example, one that was missing mandatory metadata.)
     The path argument is expected to be relative to self.path.
     """
     self.context['filenames'][posixize_path(os.path.normpath(path))] = None
Exemplo n.º 14
0
    def read_file(self,
                  base_path,
                  path,
                  content_class=Page,
                  fmt=None,
                  context=None,
                  preread_signal=None,
                  preread_sender=None,
                  context_signal=None,
                  context_sender=None):
        """Return a content object parsed with the given format."""

        path = os.path.abspath(os.path.join(base_path, path))
        source_path = posixize_path(os.path.relpath(path, base_path))
        logger.debug('Read file %s -> %s', source_path, content_class.__name__)

        if not fmt:
            _, ext = os.path.splitext(os.path.basename(path))
            fmt = ext[1:]

        if fmt not in self.readers:
            raise TypeError('Pelican does not know how to parse %s', path)

        if preread_signal:
            logger.debug('Signal %s.send(%s)', preread_signal.name,
                         preread_sender)
            preread_signal.send(preread_sender)

        reader = self.readers[fmt]

        metadata = _filter_discardable_metadata(
            default_metadata(settings=self.settings,
                             process=reader.process_metadata))
        metadata.update(
            path_metadata(full_path=path,
                          source_path=source_path,
                          settings=self.settings))
        metadata.update(
            _filter_discardable_metadata(
                parse_path_metadata(source_path=source_path,
                                    settings=self.settings,
                                    process=reader.process_metadata)))
        reader_name = reader.__class__.__name__
        metadata['reader'] = reader_name.replace('Reader', '').lower()

        content, reader_metadata = self.get_cached_data(path, (None, None))
        if content is None:
            content, reader_metadata = reader.read(path)
            self.cache_data(path, (content, reader_metadata))
        metadata.update(_filter_discardable_metadata(reader_metadata))

        if content:
            # find images with empty alt
            find_empty_alt(content, path)

        # eventually filter the content with typogrify if asked so
        if self.settings['TYPOGRIFY']:
            from typogrify.filters import typogrify
            import smartypants

            # Tell `smartypants` to also replace " HTML entities with
            # smart quotes. This is necessary because Docutils has already
            # replaced double quotes with said entities by the time we run
            # this filter.
            smartypants.Attr.default |= smartypants.Attr.w

            def typogrify_wrapper(text):
                """Ensures ignore_tags feature is backward compatible"""
                try:
                    return typogrify(text,
                                     self.settings['TYPOGRIFY_IGNORE_TAGS'])
                except TypeError:
                    return typogrify(text)

            if content:
                content = typogrify_wrapper(content)

            if 'title' in metadata:
                metadata['title'] = typogrify_wrapper(metadata['title'])

            if 'summary' in metadata:
                metadata['summary'] = typogrify_wrapper(metadata['summary'])

        if context_signal:
            logger.debug('Signal %s.send(%s, <metadata>)', context_signal.name,
                         context_sender)
            context_signal.send(context_sender, metadata=metadata)

        return content_class(content=content,
                             metadata=metadata,
                             settings=self.settings,
                             source_path=path,
                             context=context)
Exemplo n.º 15
0
 def relative_dir(self):
     return posixize_path(
         os.path.dirname(
             os.path.relpath(os.path.abspath(self.source_path),
                             os.path.abspath(self.settings['PATH']))))
Exemplo n.º 16
0
    def read_file(self, base_path, path, content_class=Page, fmt=None,
                  context=None, preread_signal=None, preread_sender=None,
                  context_signal=None, context_sender=None):
        """Return a content object parsed with the given format."""

        path = os.path.abspath(os.path.join(base_path, path))
        source_path = posixize_path(os.path.relpath(path, base_path))
        logger.debug(
            'Read file %s -> %s',
            source_path, content_class.__name__)

        if not fmt:
            _, ext = os.path.splitext(os.path.basename(path))
            fmt = ext[1:]

        if fmt not in self.readers:
            raise TypeError(
                'Pelican does not know how to parse %s', path)

        if preread_signal:
            logger.debug(
                'Signal %s.send(%s)',
                preread_signal.name, preread_sender)
            preread_signal.send(preread_sender)

        reader = self.readers[fmt]

        metadata = _filter_discardable_metadata(default_metadata(
            settings=self.settings, process=reader.process_metadata))
        metadata.update(path_metadata(
            full_path=path, source_path=source_path,
            settings=self.settings))
        metadata.update(_filter_discardable_metadata(parse_path_metadata(
            source_path=source_path, settings=self.settings,
            process=reader.process_metadata)))
        reader_name = reader.__class__.__name__
        metadata['reader'] = reader_name.replace('Reader', '').lower()

        content, reader_metadata = self.get_cached_data(path, (None, None))
        if content is None:
            content, reader_metadata = reader.read(path)
            self.cache_data(path, (content, reader_metadata))
        metadata.update(_filter_discardable_metadata(reader_metadata))

        if content:
            # find images with empty alt
            find_empty_alt(content, path)

        # eventually filter the content with typogrify if asked so
        if self.settings['TYPOGRIFY']:
            from typogrify.filters import typogrify
            import smartypants

            # Tell `smartypants` to also replace &quot; HTML entities with
            # smart quotes. This is necessary because Docutils has already
            # replaced double quotes with said entities by the time we run
            # this filter.
            smartypants.Attr.default |= smartypants.Attr.w

            def typogrify_wrapper(text):
                """Ensures ignore_tags feature is backward compatible"""
                try:
                    return typogrify(
                        text,
                        self.settings['TYPOGRIFY_IGNORE_TAGS'])
                except TypeError:
                    return typogrify(text)

            if content:
                content = typogrify_wrapper(content)

            if 'title' in metadata:
                metadata['title'] = typogrify_wrapper(metadata['title'])

            if 'summary' in metadata:
                metadata['summary'] = typogrify_wrapper(metadata['summary'])

        if context_signal:
            logger.debug(
                'Signal %s.send(%s, <metadata>)',
                context_signal.name,
                context_sender)
            context_signal.send(context_sender, metadata=metadata)

        return content_class(content=content, metadata=metadata,
                             settings=self.settings, source_path=path,
                             context=context)
Exemplo n.º 17
0
 def _add_failed_source_path(self, path):
     """Record a source file path that a Generator failed to process.
     (For example, one that was missing mandatory metadata.)
     The path argument is expected to be relative to self.path.
     """
     self.context['filenames'][posixize_path(os.path.normpath(path))] = None
Exemplo n.º 18
0
 def relative_dir(self):
     return posixize_path(
         os.path.dirname(
             os.path.relpath(
                 os.path.abspath(self.source_path),
                 os.path.abspath(self.settings['PATH']))))