This is an automated email from the ASF dual-hosted git repository.
dfoulks pushed a commit to branch dfoulks/pelican-gha
in repository https://gitbox.apache.org/repos/asf/petri.git
The following commit(s) were added to refs/heads/dfoulks/pelican-gha by this
push:
new d5aec52 Removed local plugins
d5aec52 is described below
commit d5aec523a151cf4638cd11424e7c02bb2ba1c144
Author: Drew <[email protected]>
AuthorDate: Wed May 22 14:49:24 2024 -0400
Removed local plugins
---
theme/plugins/gfm.py | 237 --------------------------------------------------
theme/plugins/toc2.py | 157 ---------------------------------
2 files changed, 394 deletions(-)
diff --git a/theme/plugins/gfm.py b/theme/plugins/gfm.py
deleted file mode 100644
index 597b831..0000000
--- a/theme/plugins/gfm.py
+++ /dev/null
@@ -1,237 +0,0 @@
-#!/usr/bin/python
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-# gfm_reader.py -- GitHub-Flavored Markdown reader for Pelican
-#
-
-import sys
-import os.path
-import ctypes
-import re
-import platform
-
-import pelican.utils
-import pelican.plugins.signals
-import pelican.readers
-
-_LIBDIR = os.environ['LIBCMARKDIR']
-if platform.system() == 'Darwin':
- _LIBEXT = '.dylib'
-else:
- _LIBEXT = '.so'
-_LIBCMARK = f'libcmark-gfm{_LIBEXT}'
-try:
- cmark = ctypes.CDLL(os.path.join(_LIBDIR, _LIBCMARK))
-except OSError as e:
- raise ImportError('%s not found. See build-cmark.sh. Error:\n%s' %
(_LIBCMARK, e))
-
-# Newer releases have different naming for this library. Try it first.
-try:
- cmark_ext = ctypes.CDLL(os.path.join(_LIBDIR,
f'libcmark-gfm-extensions{_LIBEXT}'))
- ENSURE_REGISTERED = 'cmark_gfm_core_extensions_ensure_registered'
-except OSError:
- # Try the older name for the library.
- try:
- cmark_ext = ctypes.CDLL(os.path.join(_LIBDIR,
f'libcmark-gfmextensions{_LIBEXT}'))
- ENSURE_REGISTERED = 'core_extensions_ensure_registered'
- except OSError:
- #print('LIBDIR:', _LIBDIR)
- raise ImportError('GFM Extensions not found. See build-cmark.sh')
-#print(f'USING: {ENSURE_REGISTERED}')
-
-
-# Use ctypes to access the functions in libcmark-gfm
-F_cmark_parser_new = cmark.cmark_parser_new
-F_cmark_parser_new.restype = ctypes.c_void_p
-F_cmark_parser_new.argtypes = (ctypes.c_int,)
-
-F_cmark_parser_feed = cmark.cmark_parser_feed
-F_cmark_parser_feed.restype = None
-F_cmark_parser_feed.argtypes = (ctypes.c_void_p, ctypes.c_char_p,
ctypes.c_size_t)
-
-F_cmark_parser_finish = cmark.cmark_parser_finish
-F_cmark_parser_finish.restype = ctypes.c_void_p
-F_cmark_parser_finish.argtypes = (ctypes.c_void_p,)
-
-F_cmark_parser_attach_syntax_extension =
cmark.cmark_parser_attach_syntax_extension
-F_cmark_parser_attach_syntax_extension.restype = ctypes.c_int
-F_cmark_parser_attach_syntax_extension.argtypes = (ctypes.c_void_p,
ctypes.c_void_p)
-
-F_cmark_parser_get_syntax_extensions = cmark.cmark_parser_get_syntax_extensions
-F_cmark_parser_get_syntax_extensions.restype = ctypes.c_void_p
-F_cmark_parser_get_syntax_extensions.argtypes = (ctypes.c_void_p,)
-
-F_cmark_parser_free = cmark.cmark_parser_free
-F_cmark_parser_free.restype = None
-F_cmark_parser_free.argtypes = (ctypes.c_void_p,)
-
-F_cmark_node_free = cmark.cmark_node_free
-F_cmark_node_free.restype = None
-F_cmark_node_free.argtypes = (ctypes.c_void_p,)
-
-F_cmark_find_syntax_extension = cmark.cmark_find_syntax_extension
-F_cmark_find_syntax_extension.restype = ctypes.c_void_p
-F_cmark_find_syntax_extension.argtypes = (ctypes.c_char_p,)
-
-F_cmark_render_html = cmark.cmark_render_html
-F_cmark_render_html.restype = ctypes.c_char_p
-F_cmark_render_html.argtypes = (ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p)
-
-
-# Set up the libcmark-gfm library and its extensions
-F_register = getattr(cmark_ext, ENSURE_REGISTERED)
-F_register.restype = None
-F_register.argtypes = ( )
-F_register()
-
-### technically, maybe install an atexit() to release the plugins
-
-# Options for the GFM rendering call
-### this could be moved into SETTINGS or somesuch, but meh. not needed now.
-OPTS = 0
-
-# The GFM extensions that we want to use
-EXTENSIONS = (
- 'autolink',
- 'table',
- 'strikethrough',
- 'tagfilter',
-)
-
-
-class GFMReader(pelican.readers.BaseReader):
- enabled = True
- """GFM-flavored Reader for the Pelican system.
-
- Pelican looks for all subclasses of BaseReader, and automatically
- registers them for the file extensions listed below. Thus, nothing
- further is required by users of this Reader.
- """
-
- # NOTE: the builtin MarkdownReader must be disabled. Otherwise, it will be
- # non-deterministic which Reader will be used for these files.
- file_extensions = ['md', 'markdown', 'mkd', 'mdown']
-
- # Metadata is specified as a single, colon-separated line, such as:
- #
- # Title: this is the title
- #
- # Note: name starts in column 0, no whitespace before colon, will be
- # made lower-case, and value will be stripped
- #
- RE_METADATA = re.compile('^([A-za-z]+): (.*)$')
-
- def read_source(self, source_path):
- "Read metadata and content from the source."
-
- # Prepare the "slug", which is the target file name. It will be the
- # same as the source file, minus the leading
".../content/(articles|pages)"
- # and with the extension removed (Pelican will add .html)
- relpath = os.path.relpath(source_path, self.settings['PATH'])
- parts = relpath.split(os.sep)
- parts[-1] = os.path.splitext(parts[-1])[0] # split off ext, keep base
- slug = os.sep.join(parts[1:])
-
- metadata = {
- 'slug': slug,
- }
- # Fetch the source content, with a few appropriate tweaks
- with pelican.utils.pelican_open(source_path) as text:
-
- # Extract the metadata from the header of the text
- lines = text.splitlines()
- i = 0 # See
https://github.com/apache/infrastructure-pelican/issues/70
- for i in range(len(lines)):
- line = lines[i]
- match = GFMReader.RE_METADATA.match(line)
- if match:
- name = match.group(1).strip().lower()
- if name != 'slug':
- value = match.group(2).strip()
- if name == 'date':
- value = pelican.utils.get_date(value)
- metadata[name] = value
- #if name != 'title':
- # print 'META:', name, value
- elif not line.strip():
- # blank line
- continue
- else:
- # reached actual content
- break
-
- # Redo the slug for articles.
- # depending on pelicanconf.py this will change the output filename
- if parts[0] == 'articles' and 'title' in metadata:
- metadata['slug'] = pelican.utils.slugify(
- metadata['title'],
- self.settings.get('SLUG_SUBSTITUTIONS', ()))
-
- # Reassemble content, minus the metadata
- text = '\n'.join(lines[i:])
-
- return text, metadata
-
- def read(self, source_path):
- "Read metadata and content then render into HTML."
-
- # read metadata and markdown content
- text, metadata = self.read_source(source_path)
- assert text, 'Text must not be empty'
- assert metadata, 'Metadata must not be empty'
- # Render the markdown into HTML
- if sys.version_info >= (3, 0):
- text = text.encode('utf-8')
- content = self.render(text).decode('utf-8')
- else:
- content = self.render(text)
- assert content, 'Did not expect content to be empty'
-
- return content, metadata
-
- def render(self, text):
- "Use cmark-gfm to render the Markdown into an HTML fragment."
-
- parser = F_cmark_parser_new(OPTS)
- assert parser, 'Failed to initialise parser'
- for name in EXTENSIONS:
- ext = F_cmark_find_syntax_extension(name.encode('utf-8'))
- assert ext, 'Failed to find UTF-8 extension'
- rv = F_cmark_parser_attach_syntax_extension(parser, ext)
- assert rv, 'Failed to attach the UTF-8 extension'
- exts = F_cmark_parser_get_syntax_extensions(parser)
- F_cmark_parser_feed(parser, text, len(text))
- doc = F_cmark_parser_finish(parser)
- assert doc, 'Did not expect rendered output to be empty'
-
- output = F_cmark_render_html(doc, OPTS, exts)
-
- F_cmark_parser_free(parser)
- F_cmark_node_free(doc)
-
- return output
-
-
-def add_readers(readers):
- readers.reader_classes['md'] = GFMReader
-
-
-def register():
- pelican.plugins.signals.readers_init.connect(add_readers)
diff --git a/theme/plugins/toc2.py b/theme/plugins/toc2.py
deleted file mode 100644
index 489bc49..0000000
--- a/theme/plugins/toc2.py
+++ /dev/null
@@ -1,157 +0,0 @@
-'''
-toc
-===================================
-Generates Table of Contents for markdown.
-Only generates a ToC for the headers FOLLOWING th [TOC] tag,
-so you can insert it after a specific section that need not be
-include in the ToC.
-'''
-
-from __future__ import unicode_literals
-
-import logging
-import re
-
-from bs4 import BeautifulSoup, Comment
-
-from pelican import contents, signals
-from pelican.utils import slugify
-
-
-logger = logging.getLogger(__name__)
-
-'''
-https://github.com/waylan/Python-Markdown/blob/master/markdown/extensions/headerid.py
-'''
-IDCOUNT_RE = re.compile(r'^(.*)_([0-9]+)$')
-
-
-def unique(id, ids):
- """ Ensure id is unique in set of ids. Append '_1', '_2'... if not """
- while id in ids or not id:
- m = IDCOUNT_RE.match(id)
- if m:
- id = '%s_%d' % (m.group(1), int(m.group(2)) + 1)
- else:
- id = '%s_%d' % (id, 1)
- ids.add(id)
- return id
-
-
-'''
-end
-'''
-
-
-class HtmlTreeNode(object):
- def __init__(self, parent, header, level, id):
- self.children = []
- self.parent = parent
- self.header = header
- self.level = level
- self.id = id
-
- def add(self, new_header, ids):
- new_level = new_header.name
- new_string = new_header.string
- new_id = new_header.attrs.get('id')
-
- if not new_string:
- new_string = new_header.find_all(
- text=lambda t: not isinstance(t, Comment),
- recursive=True)
- new_string = "".join(new_string)
-
- if not new_id:
- new_id = slugify(new_string, ())
-
- new_id = unique(new_id, ids) # make sure id is unique
-
- new_header.attrs['id'] = new_id
- if(self.level < new_level):
- new_node = HtmlTreeNode(self, new_string, new_level, new_id)
- self.children += [new_node]
- return new_node, new_header
- elif(self.level == new_level):
- new_node = HtmlTreeNode(self.parent, new_string, new_level, new_id)
- self.parent.children += [new_node]
- return new_node, new_header
- elif(self.level > new_level):
- return self.parent.add(new_header, ids)
-
- def __str__(self):
- ret = ""
- if self.parent:
- ret = "<a class='toc-href' href='#{0}' title='{1}'>{1}</a>".format(
- self.id, self.header)
-
- if self.children:
- ret += "<ul>{}</ul>".format('{}' * len(self.children)).format(
- *self.children)
-
- if self.parent:
- ret = "<li>{}</li>".format(ret)
-
- if not self.parent:
- ret = "<div id='toc'>{}</div>".format(ret)
-
- return ret
-
-
-def init_default_config(pelican):
- from pelican.settings import DEFAULT_CONFIG
-
- TOC_DEFAULT = {
- 'TOC_HEADERS': '^h[1-6]',
- 'TOC_RUN': 'true'
- }
-
- DEFAULT_CONFIG.setdefault('TOC', TOC_DEFAULT)
- if(pelican):
- pelican.settings.setdefault('TOC', TOC_DEFAULT)
-
-
-def generate_toc(content):
- if isinstance(content, contents.Static):
- return
-
- all_ids = set()
- title = content.metadata.get('title', 'Title')
- tree = node = HtmlTreeNode(None, title, 'h0', '')
- soup = BeautifulSoup(content._content, 'html.parser')
- settoc = False
-
- try:
- header_re = re.compile(content.metadata.get(
- 'toc_headers', content.settings['TOC']['TOC_HEADERS']))
- except re.error as e:
- logger.error("TOC_HEADERS '%s' is not a valid re\n%s",
- content.settings['TOC']['TOC_HEADERS'])
- raise e
-
- # Find TOC tag
- tocTag = soup.find('p', text='[TOC]')
- if tocTag:
- for header in tocTag.findAllNext(header_re):
- settoc = True
- node, new_header = node.add(header, all_ids)
- header.replaceWith(new_header) # to get our ids back into soup
-
- if settoc:
- print("Generating ToC for %s" % content.slug)
- tree_string = '{}'.format(tree)
- print("ToC: %s" % tree_string)
- tree_soup = BeautifulSoup(tree_string, 'html.parser')
- content.toc = tree_soup.decode(formatter='html')
- itoc = soup.find('p', text='[TOC]')
- if itoc:
- itoc.replaceWith(tree_soup)
-
- content._content = soup.decode(formatter='html')
-
-
-def register():
- signals.initialized.connect(init_default_config)
-
-
-signals.content_object_init.connect(generate_toc)