[gimp-web/gimp-web-static] Finally got static hierachy URLs working.



commit 3ab2d24d55880938e423451d4df76f8ab397f3b8
Author: Pat David <patdavid gmail com>
Date:   Wed Aug 5 15:28:49 2015 -0500

    Finally got static hierachy URLs working.
    
    Had to use and abuse a plugin to make it work, but discrete
    content inside nested folders will now build properly.  Still
    testing, so don't expect it to be safe just yet...

 content/{pages => features}/features.md       |    0
 pelicanconf.py                                |   13 ++-
 plugins/page_hierarchy_gimp/.hgignore         |    3 +
 plugins/page_hierarchy_gimp/README.md         |   75 +++++++++++++++
 plugins/page_hierarchy_gimp/__init__.py       |    1 +
 plugins/page_hierarchy_gimp/page_hierarchy.py |  120 +++++++++++++++++++++++++
 themes/newgimp/templates/page.html            |   31 ++++++-
 7 files changed, 235 insertions(+), 8 deletions(-)
---
diff --git a/content/pages/features.md b/content/features/features.md
similarity index 100%
rename from content/pages/features.md
rename to content/features/features.md
diff --git a/pelicanconf.py b/pelicanconf.py
index 1e1a76b..e197a97 100644
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -2,6 +2,10 @@
 # -*- coding: utf-8 -*- #
 from __future__ import unicode_literals
 
+#Plugins
+PLUGIN_PATHS = ["plugins"]
+PLUGINS = ["page_hierarchy_gimp"]
+
 AUTHOR = u'Pat David'
 SITENAME = u'GIMP'
 SITEURL = ''
@@ -41,7 +45,8 @@ DEFAULT_PAGINATION = False
 # This will copy over these folders w/o modification
 STATIC_PATHS = ['images', 'pages', 'tutorials', 'about']
 
-PAGE_PATHS = ['pages', 'tutorials', 'about']
+#PAGE_PATHS = ['pages', 'tutorials', 'about']
+PAGE_PATHS = ['tutorials', 'about']
 
 THEME = "./themes/newgimp"
 
@@ -50,10 +55,8 @@ THEME = "./themes/newgimp"
 #see: https://github.com/getpelican/pelican/issues/1128#issuecomment-63251758
 #PATH_METADATA = r'.*?\\(?P<test>(.+\\)?).*' 
 PATH_METADATA = r'(?P<test>.*/)'
-#########
-# the way to do this correctly was to simply create the folders
-# and point STATIC_PATHS and PAGE_PATHS to pick them up.
-#########
+PATH_METADATA = r'(?P<test>.*\\)'
+
 
 # Still working on this...
 #PAGE_URL = "{test}{slug}/"
diff --git a/plugins/page_hierarchy_gimp/.hgignore b/plugins/page_hierarchy_gimp/.hgignore
new file mode 100644
index 0000000..bb6d589
--- /dev/null
+++ b/plugins/page_hierarchy_gimp/.hgignore
@@ -0,0 +1,3 @@
+syntax: glob
+
+*.pyc
diff --git a/plugins/page_hierarchy_gimp/README.md b/plugins/page_hierarchy_gimp/README.md
new file mode 100644
index 0000000..e87b71a
--- /dev/null
+++ b/plugins/page_hierarchy_gimp/README.md
@@ -0,0 +1,75 @@
+Page Hierarchy
+==============
+*Author: Ahmad Khayyat (<akhayyat gmail com>)*
+
+A [Pelican][1] plugin that creates a URL hierarchy for pages that
+matches the filesystem hierarchy of their sources.
+
+For example, to have the following filesystem structure of page
+sources result in the URLs listed next to each file,
+
+```text
+└── content/pages/           #   PAGE_DIR
+    ├── about.md             # URL: pages/about/
+    ├── projects.md          # URL: pages/projects/
+    ├── projects/            #   (directory)
+    │   ├── p1.md            # URL: pages/projects/p1/
+    │   ├── p2.md            # URL: pages/projects/p2/
+    │   └── p2/              #   (directory)
+    │       └── features.md  # URL: pages/projects/p2/features/
+    └── contact.md           # URL: pages/contact/
+```
+
+you can use this plugin with the following Pelican settings:
+
+```python
+# pelicanconf.py
+PAGE_URL = '{slug}/'
+PAGE_SAVE_AS = '{slug}/index.html'
+SLUGIFY_SOURCE = 'basename'
+```
+
+When generating the `url` and `save_as` attributes, the plugin
+prefixes the page's `slug` by its relative path. Although the initial
+`slug` is generated from the page's `title` by default, it can be
+generated from the source file basename by setting the
+`SLUGIFY_SOURCE` setting to `'basename'`, as shown in the settings
+snippet above. The `slug` can also be set using [`PATH_METADATA`][2].
+
+This plugin is compatible with [Pelican translations][3].
+
+Parent and Children Pages
+-------------------------
+This plugin also adds three attributes to each page object:
+
+- `parent`: the immediate parent page. `None` if the page is
+  top-level. If a translated page has no parent, the default-language
+  parent is used.
+
+- `parents`: a list of all ancestor pages, starting from the top-level
+  ancestor.
+
+- `children`: a list of all immediate child pages, in no specific
+  order.
+
+These attributes can be used to generate breadcrumbs or nested
+navigation menus. For example, this is a template excerpt for
+breadcrumbs:
+
+```html
+<ul class="breadcrumb">
+  <li><a href="{{ SITEURL }}/" title="{{ SITENAME }}">
+    <i class="fa fa-home fa-lg"></i>
+  </a></li>
+  {% for parent in page.parents %}
+  <li><a href="{{ SITEURL }}/{{ parent.url }}">{{ parent.title }}</a></li>
+  {% endfor %}
+  <li class="active">{{ page.title }}</li>
+</ul>
+
+```
+
+
+[1]: http://getpelican.com/
+[2]: http://docs.getpelican.com/en/latest/settings.html#path-metadata
+[3]: http://docs.getpelican.com/en/latest/settings.html#translations
diff --git a/plugins/page_hierarchy_gimp/__init__.py b/plugins/page_hierarchy_gimp/__init__.py
new file mode 100644
index 0000000..6a28b3e
--- /dev/null
+++ b/plugins/page_hierarchy_gimp/__init__.py
@@ -0,0 +1 @@
+from .page_hierarchy import *
diff --git a/plugins/page_hierarchy_gimp/page_hierarchy.py b/plugins/page_hierarchy_gimp/page_hierarchy.py
new file mode 100644
index 0000000..d917266
--- /dev/null
+++ b/plugins/page_hierarchy_gimp/page_hierarchy.py
@@ -0,0 +1,120 @@
+from pelican import signals, contents
+import os.path
+from copy import copy
+from itertools import chain
+
+'''
+This plugin creates a URL hierarchy for pages that matches the
+directory hierarchy of their sources.
+'''
+
+'''
+It's been modified by me, Pat David, to do what I need for wgo
+don't try to make any sense of it.  I don't know what I'm doing.
+'''
+
+class UnexpectedException(Exception): pass
+
+def get_path(page, settings):
+    ''' Return the dirname relative to PAGE_PATHS prefix. '''
+    path = os.path.split(page.get_relative_source_path())[0] + '/'
+    path = path.replace( os.path.sep, '/' )
+    # Try to lstrip the longest prefix first
+    for prefix in sorted(settings['PAGE_PATHS'], key=len, reverse=True):
+        if not prefix.endswith('/'): prefix += '/'
+        if path.startswith(prefix):
+            return path[len(prefix):-1]
+    raise UnexpectedException('Page outside of PAGE_PATHS ?!?')
+
+def in_default_lang(page):
+    # page.in_default_lang property is undocumented (=unstable) interface
+    return page.lang == page.settings['DEFAULT_LANG']
+
+def override_metadata(content_object):
+    if type(content_object) is not contents.Page:
+        return
+    page = content_object
+    print( "page.get_relative_source_path():" )
+    print( "####################" )
+    print( page.get_relative_source_path() )
+    print( "####################" )
+    print( "manual path:" )
+    print( os.path.split(page.get_relative_source_path())[0] )
+    #path = get_path(page, page.settings)
+    path = os.path.split(page.get_relative_source_path())[0]
+    path = path.replace( os.path.sep, '/' )
+    print( "override_metadata, path:" )
+    print( path )
+
+    def _override_value(page, key):
+        metadata = copy(page.metadata)
+        # We override the slug to include the path up to the filename
+        metadata['slug'] = os.path.join(path, page.slug)
+        print( "_override_value, page.slug:" )
+        print( page.slug )
+        print( "_override_value, metadata['slug']:")
+        print( metadata['slug'] )
+        print( "_override_value, metadata['slug'] (2):")
+        print( metadata['slug'] )
+
+        # PLD: this is my doing, sorry...
+        # ok, if path is empty, use page.slug
+        # if path is not empty, use path
+        # still need to test if lang works properly after this
+        if path:
+            print( "got path" )
+            print( path )
+            metadata['slug'] = path
+        else:
+            print( "path empty!" )
+            print( page.slug )
+            metadata['slug'] = page.slug
+
+        # We have to account for non-default language and format either,
+        # e.g., PAGE_SAVE_AS or PAGE_LANG_SAVE_AS
+        infix = '' if in_default_lang(page) else 'LANG_'
+        return page.settings['PAGE_' + infix + key.upper()].format(**metadata)
+
+    for key in ('save_as', 'url'):
+        if not hasattr(page, 'override_' + key):
+            setattr(page, 'override_' + key, _override_value(page, key))
+
+def set_relationships(generator):
+    def _all_pages():
+        return chain(generator.pages, generator.translations)
+
+    # initialize parents and children lists
+    for page in _all_pages():
+        page.parent = None
+        page.parents = []
+        page.children = []
+
+    # set immediate parents and children
+    for page in _all_pages():
+        # Parent of /a/b/ is /a/, parent of /a/b.html is /a/
+        parent_url = os.path.dirname(page.url[:-1])
+        if parent_url: parent_url += '/'
+        for page2 in _all_pages():
+            if page2.url == parent_url and page2 != page:
+                page.parent = page2
+                page2.children.append(page)
+        # If no parent found, try the parent of the default language page
+        if not page.parent and not in_default_lang(page):
+            for page2 in generator.pages:
+                if (page.slug == page2.slug and
+                    os.path.dirname(page.source_path) ==
+                    os.path.dirname(page2.source_path)):
+                    # Only set the parent but not the children, obviously
+                    page.parent = page2.parent
+
+    # set all parents (ancestors)
+    for page in _all_pages():
+        p = page
+        while p.parent:
+            page.parents.insert(0, p.parent)
+            p = p.parent
+
+
+def register():
+    signals.content_object_init.connect(override_metadata)
+    signals.page_generator_finalized.connect(set_relationships)
diff --git a/themes/newgimp/templates/page.html b/themes/newgimp/templates/page.html
index 680924d..142c92d 100644
--- a/themes/newgimp/templates/page.html
+++ b/themes/newgimp/templates/page.html
@@ -31,9 +31,34 @@
        {% endif %}
 
 
-    <div>
-        <p>url: {{ page.url }} </p>
-        <p>metadata regex test: {{ page.test }}</p>
+    <div style="border: dotted 1px #ccc; ;" class='page_content'>
+        <p>Debug stuff.  Ignore</p>
+        <small>
+            <p>
+                url: {{ page.url }} <br/>
+                metadata regex test: {{ page.test }}<br/>
+                slug: {{ page.slug }}<br/>
+                page parent: {{ page.parent }}<br/>
+                page parent url: {{ page.parent.url }} <br/>
+                page parent title: {{ page.parent.title }}
+            </p>
+        
+            <p>page parents</p>
+        <ul>
+            {% for parent in page.parents %}
+            <li>url: {{ parent.url }} - title: {{ parent.title }}<br/>
+                <a href="{{ SITEURL }}/{{ parent.url }}">{{ parent.title }}</a></li>
+            {% endfor %}
+        </ul>
+        <p>page children</p>
+        <ul>
+            {% for child in page.children %}
+            <li>url: {{ child.url }} - title: {{ child.title }}<br/>
+                <a href="{{ SITEURL }}/{{ child.url }}">{{ child.title }}</a></li>
+            {% endfor %}
+        </ul>
+        </p>
+        </small>
     </div>
 
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]