Initial commit of LunaGen.

This commit is contained in:
Terry Hancock 2021-11-17 22:45:17 -06:00
commit b836bef771
231 changed files with 380150 additions and 0 deletions

7
.gitattributes vendored Normal file
View File

@ -0,0 +1,7 @@
*.png filter=lfs diff=lfs merge=lfs -text
*.otf filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
*.webp filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.blend filter=lfs diff=lfs merge=lfs -text
*.mp4 filter=lfs diff=lfs merge=lfs -text

339
LunaGen/doc/README.rst Normal file
View File

@ -0,0 +1,339 @@
LunaGen Guide
=============
..contents::
LunaGen is a static website generator for episodic media created
to support the "Lunatics_!" open animated series project. The site
structure it is designed for has:
* An index page with lists of episodes in (possibly) multiple series.
* A page for each episode, with structure determined by the theme and data.
* Additional special list pages for Characters, Settings, Sponsors, and Affiliates.
* Any additional hand-created pages desired.
The data driving the site is authored directly in YAML_ format.
The templates used for site generation (which can be overridden in themes) are
written in Jinja2_.
In addition, both theme and data also contain site "skeletons", which provide additional
files needed: most notably the CSS style sheets in the theme and the necessary images
and static HTML pages you want to use in your site source data directory.
It is very likely you will want to create a custom theme for your site. Please see
the `Theme Author Guide`_ for how to do that. This `Site Author Guide`_ is targeted
at users who simply want to use the package to generate a website using an existing
theme. Should you want to make changes to the code itself, you'll want to read the
`Developer Guide`.
Alternatives
------------
Is LunaGen for you? LunaGen sacrifices generality in order to provide an extremely
simple authoring environment for publishing episodic multimedia content.
I do not recommend it for publishing textual content simply because
it lacks any sophisticated markup language. It is also not a general purpose
content management system, as it is very specific to episodic data, and only
provides a few hard-coded special pages. Making all these assumptions allows
us to keep the data we have to write to update the site very short and simple,
but it also means we can't stretch the software much to do other tasks.
If you want a more text-intensive site, like a static blog listing, you should
probably check out more robust solutions like Pelican_ or Jekyll_, which are
optimized for that kind of use. Perhaps in the future we'll create some kind
of integration to allow LunaGen to be used along with other tools more easily.
We rejected those and designed our own generator because of the amount of
boilerplate we'd need to add to generate simple listings of the type we wanted
using a blog-oriented generator. Using YAML_ allows us to keep our information
field-oriented, with only a little descriptive text needed, but without the
overhead of a database-driven site.
Site Author Guide
-----------------
LunaGen site data consists primarily of a set of YAML_ files and a site skeleton
containing additional content files your site needs -- mostly images, but also
possibly static HTML pages that will simply be copied without modification to your
site.
In general, you should not include CSS files in your site skeleton. These should be
incorporated into a custom **theme** skeleton instead. However, any files you put in
your site skeleton will be copied to your site after the theme files, potentially
replacing them if there is a name collision. So you *can* override CSS this way, though
it's not recommended.
The YAML files for your site follow a very specific structure and some files are
mandatory. At the top level you will find:
``site.yaml``
This defines global variables needed throughout your site:
``sitename``
This is the name used for your entire site. Probably the name of the show.
It must be a simple identifier, and may be used to construct some filenames
or variables.
``sitetitle``
This is the fully-styled name for your site, which may contain punctuation
and spaces.
``imgdir``
This is the location where your images live in your site skeleton.
Whenever a template looks for an image, this will be prepended to the
URL. The exact location of the image below that will be determined by
the template and is theme-specific. So you can structure your images
anyway you like in a custom theme, but will need to learn the requirements
of a theme if you are using someone else's.
``stylesheets``
A list of stylesheets to be referenced by *every* page on your site.
This will be included first, followed by stylesheets requested in
other documents. TODO: this should really be in the theme.
``characters.yaml``
This is the data for a special page listing your series' characters.
TODO: should be optional.
``affiliates.yaml``
List of affiliate advertisements with ``name``, ``img``, and ``url`` fields
to generate the "affiliates banner". TODO: again, should be optional.
``products.yaml``
List of product ad images to advertise your merchandise storefront.
TODO: again, optional.
``software.yaml``
A list of software banners to call out your favorite production software,
advertising those projects so they get some support.
TODO: again, optional.
There is also an ``episodes`` directory, which contains the series and episode
data. Within it you will find:
``series.yaml``
This defines the available series of episodes, and defines several terms to
be used inside the episode files. It consists of a list of series, each of
which must define:
``name``
Name or title of the series, to be shown to the user.
``order``
This is an integer which is used to control the display order. It is
not directly shown, and does not have to be sequential (for example
we numbered our audiodrama series 100 to make sure it always appears
after the animated series). It also need not be in the same order
as the series are listed in your file.
``directory``
This is a brief identifier for the series, used as the directory name
for storing the episode files, and also as a key field.
``modes``
Defines the possible production modes for each episode. Should at least
contain a ``release`` mode for a finally-released episode, but it may
also have earlier workflow modes, such as ``fundraising`` or ``production``,
to show the state of the episode (and therefore what information will
be available for it). For each mode, there is a ``template`` value telling
what template the theme should use to format the episode.
TODO: this is theme-dependent, but I'm not sure how to separate it.
``credits``
This is a collection of definitions for credits blocks to be used in
your episode credits. It defines named blocks, for which the following
should be defined:
``order``
Controls the order of presentation of the fields.
``heading``
What heading to show in the credits listing on the output
page. For example, in our file, this tells us that ``animation_credits``
should be listed as "3D Models and Animation". Optional. If
no heading is provided, no heading will be shown.
``labels``
Controls how the credits will be listed. If this is a list,
it lists identifier and title pairs to be used in the listing.
The order of this list controls the order of the credits (they
may be identified in any order in the episode file).
The value may instead be one of the following strings:
``ordered``
Credits will simply be listed in the order presented in the
episode file, with labels expressed there.
``alpha``
Credits will be listed in alphabetized order.
The exact behavior of the labels value is controlled by the
credits template used, so may be theme-dependent.
``template``
Determines which template will be used to display this credits
block, determining layout behavior. The following are defined:
``centered_credits``
Credits will be listed in simple order, down the middle.
No columns are used, even on a wide screen. Typically used
for main credits.
``basic_credits``
Used for a variety of credit listings. Will try to save some
space by using columns to fill the screen better.
``cast_credits``
Designed to display paired credits, as in cast listings, with
character/actor pairings.
``music_credits``
This displays credits in blocks with named fields for each
title. This changes the interpretation of labels to refer
to the labels used in the individual blocks.
``sponsortypes``
Definitions for your sponsors. Determines what categories you have
and how they will be listed. Note that defining the sponsors here
means you can have a different system for different series.
For each type listed, the following fields may be defined:
``limit``
An integer expressing a limit on how many of this kind of sponsor
is accepted and will be listed (more than this will not be displayed).
``page``
An integer expressing the number of sponsors to be included in a single
block in the listing (this is used to space the sponsors out through
the credits).
``excludes``
The name of another sponsortype that can't be used on the same episode
as this one. Should suppress display of the other, but this isn't
implemented.
``template``
Template name to use for displaying a list of these sponsors.
``desc``
Description of the sponsor type. Will be used to create an informational
page for viewers and potential sponsors.
In the ``episodes`` directory, you will also find subdirectories for each series
using the directory names defined above. Inside each are files for each episode,
with episode-specific data:
*episode*``.yaml``
The following fields are required:
``series``
Backlink to the series identifier.
``episode``
The episode number -- an integer.
TODO: maybe change this to 'number' so we have episode.number instead
of episode.episode?
``mode``
Status of the episode, such as whether it's released, in-development,
in-production, etc. The value should be one of the values defined in
``modes`` in the ``series.yaml`` file. The value may also control
how other information in this file is handled and presented (and which
values are needed). In fact, this may be one way to handle information
that isn't available yet, such as animation credits for an episode that's
just in development.
``title``
The title presented for the episode. Used in several places.
``poster``
Image filename to be used to represent the episode. Ours are square
600x600 pixel images, but the format you use is theme-dependent.
``status``
A brief status message to be included under the title. Good for release
dates or fundraising messages.
``description``
One-paragraph description of the episode. The "blurb".
``credits``
The fields defined in this category must be the ones defined in the
series ``credits`` field. Here you will list the actual credits to
use, in a format determined by the template you listed.
``sponsors``
The actual sponsors, in formats determined by the templates you defined
in the series' ``sponsortypes`` fields. Typically includes ``name``,
``url``, and ``img`` fields for graphic sponsor types, or just a list of
strings for simple named credits (like Patrons or Backers).
``ordered`` and ``cast_credits`` require pairs to be defined of
credit name and credit, like this::
- - Director
- Terry Hancock
- - Writer
- Rosalyn Hunter
For credit blocks with listed labeled credits, the credits should
be given as mappings, using the identifiers you defined, like this::
mech_models:
- Chris Kuhn
Other fields are dependent on the mode, but may include:
``videos``
Videos to display in the video carousel for the episode page, typically
including at least a preview. Ours also include the full episode, a
brief explainer about our business model, and a thank-you message from
the creators. Each video need to define ``id``, ``name``, ``url``,
and ``btn``, needed by the video template.
``product``
Defines a product to pitch on the page. We use this to direct viewers to
the DVD or download bundle releases of our episode in our Gumroad store.
Values are defined by how they are used in the template. Ours provides:
``img``, ``url``, ``title``, and two message fields, ``msg1`` and ``msg2``
which are displayed under certain circumstances.
``funding``
A block defining fields for a crowdfunding campaign, which may include
multiple campaigns on separate platforms. This provides a combined display
of funds raised, and may include pre-sales, matching funds, sponsorships,
and fixed or flexible goal fundraising from crowdfunding platforms.
TODO:
Currently this is a display-only feature and requires manual updating, but
we might provide some kind of plugin system for updating this when the site
is regenerated.
Theme Author Guide
------------------
To be added: should explain the files, templates, and stylesheets a theme needs to
define and how they will be used.
Developer Guide
---------------
To be added: should explain how LunaGen works and how to contribute to it.
.. _Lunatics: http://lunatics.tv
.. _YAML: https://yaml.org/
.. _Jinja2: https://palletsprojects.com/p/jinja/
.. _Pelican: https://blog.getpelican.com/
.. _Jekyll: https://jekyllrb.com/

121
LunaGen/src/lunagen.py Executable file
View File

@ -0,0 +1,121 @@
#!/usr/bin/python3
# encoding: utf-8
'''
lunagen -- "Lunatics!" Project Release Site Generator
LunaGen generates a small static HTML website based on YAML
data documents containing the key release information. This
generates an index.html file containing the episode lists
for all series, individual release pages for each episode,
and additional pages for character list and story background.
This is meant to be a fan-focused site.
It also contains affiliate link, sponsor, advertising, and
other fundraising elements.
@author: Terry Hancock
@copyright: 2019 Anansi Spaceworks.
@license: GNU General Public License, version 2.0 or later. (Python code)
Creative Commons Attribution-ShareAlike, version 3.0 or later. (Website Templates).
@contact: digitante@gmail.com
'''
import os, sys
from optparse import OptionParser
import lunagen
def main(argv=None):
'''Command line options.'''
program_name = os.path.basename(sys.argv[0])
program_version = "v0.1"
program_build_date = "%s" % lunagen.Config.__updated__
program_version_string = '%%prog %s (%s)' % (program_version, program_build_date)
program_longdesc = '''\
LunaGen is a static HTML website generator designed for releasing
a series of episodes (technically: a series of series of episodes).
Data is authored using the YAML structured data language, which allows
for episode metadata and descriptions to be written in a human-friendly
format, which is then formatted into HTML using Jinja2 templates.
Once generated, the site is static and can simply be uploaded to a
standard web server with minimal or no configuration (like a static web host).
It was originally created to generate the release pages for
Anansi Spaceworks' "Lunatics!" series.
For details, please see the 'examples' and 'doc' directories.
'''
program_license = "Copyright 2019 Terry Hancock (Anansi Spaceworks) \
Licensed under the GNU General Public License, version 2.0\n"
if argv is None:
argv = sys.argv[1:]
#try:
# setup option parser
parser = OptionParser(version=program_version_string, epilog=program_longdesc, description=program_license)
parser.add_option("-i", "--in", dest="src", help="set input path [default: %default]", metavar="FILE")
parser.add_option("-o", "--out", dest="tgt", help="set output path [default: %default]", metavar="FILE")
parser.add_option("-v", "--verbose", dest="verbose", action="count", help="set verbosity level [default: %default]")
parser.add_option("-S", "--seed", dest="seed", help="set random number seed [default: None]", type="int")
# process options
(opts, args) = parser.parse_args(argv)
if opts.verbose:
verbose = opts.verbose
else:
verbose = 0
if verbose:
print("Opts = ", opts)
print("Args = ", args)
if opts.src:
src = opts.src
elif args:
src = args.pop(0)
else:
src = './site'
if opts.tgt:
tgt = opts.tgt
elif args:
tgt = args.pop(0)
else:
tgt = './build'
if verbose: print("Source = ", src)
if verbose: print("Target = ", tgt)
lunagen.LunaGen(src, tgt, verbose, opts.seed).gensite()
if __name__ == "__main__":
# if lunagen.Config.DEBUG:
# #sys.argv.append("-h")
# sys.argv.append("-v")
# if lunagen.Config.TESTRUN:
# import doctest
# doctest.testmod()
# if lunagen.Config.PROFILE:
# import cProfile
# import pstats
# profile_filename = 'lunagen_profile.txt'
# cProfile.run('main()', profile_filename)
# statsfile = open("profile_stats.txt", "wb")
# p = pstats.Stats(profile_filename, stream=statsfile)
# stats = p.strip_dirs().sort_stats('cumulative')
# stats.print_stats()
# statsfile.close()
# sys.exit(0)
sys.exit(main())

View File

@ -0,0 +1 @@
from .main import *

View File

@ -0,0 +1,70 @@
'''
Created on Oct 24, 2021
@author: terry
'''
import os
from distutils.dir_util import remove_tree, copy_tree
class LunaGenAddOn(object):
"""
Abstract base class for LunaGen Addons.
"""
name = 'my_addon' # Replace with string name of add-on (should match directory name).
desc = """\
An add-on to demonstrate add-on design.
Replace this text with a brief description of your add-on's purpose.
"""
@staticmethod
def load(site):
"""
Load the site data that the add-on needs to function.
Note that this is site data that the site designer has to provide,
which the addon will then interpret.
Client is the LunaGen instance, which subclasses jinja2.Environment.
Mandatory -- you must implement a loader.
"""
raise NotImplementedError
@classmethod
def copy_skeleton(cls, site):
skeleton = os.path.join(os.path.dirname(cls.file), 'skeleton')
#
print("Copying skeleton for %s from %s." % (cls.name, skeleton))
#
copy_tree(skeleton, site.tgtdir, verbose=site.verbose)
@staticmethod
def render(site):
"""
Render templates to images or do other tasks to prepare target site.
Optional.
- Focused on images or other binary data
- Should not be dependent on site data that might change
- may have additional dependencies (e.g. Inkscape or ImageMagick) on
software not installed on the server
- not run when RE-generating the site.
"""
pass
@staticmethod
def generate(site):
"""
Generate a page or pages in the target site.
Optional.
- Produces PAGES of HTML, SVG, etc.
- Uses templates provide by the chain of sources
- Should provide a default template, unless its using a standard site template
(i.e. don't leave it up to the theme)
- Dynamic. Regenerated in every site update.
"""
pass

View File

@ -0,0 +1,2 @@
# Addons should appear in this directory.
# Do not put code in this file.

View File

@ -0,0 +1,101 @@
/* Sponsorship Ad */
.sponsorship_packages_ad {
font-family: BioliniumBold;
font-size: 20pt;
text-align: center;
color: #ffffee;
transition: none;
border-style: solid;
border-width: 3pt;
border-color: blue;
background-color: #222233;
border-radius: 4vw;
margin: 1pt;
padding: 5pt;
}
/* Affiliate Ads */
.affiliate_carousel {
width: 100%;
min-width: 100%;
max-width: 100%;
height: 1.5in;
overflow: hidden;
display: block;
position: relative;
padding: 0px;
background-color: red;
}
.affiliate_content {
position: absolute;
top: 0in;
left: 0in;
width: 42in;
height: 1.5in;
padding: 0px;
margin: 0px;
display: flex;
justify-content: space-around;
align-content: center;
animation-name: affiliate_scroll;
animation-duration: 300s;
animation-iteration-count: infinite;
animation-timing-function: linear;
flex-shrink: 3in;
flex-grow: 18in;
background-color: black;
}
@keyframes affiliate_scroll {
from { left: 0in; }
to { left: -21in; }
}
.affiliate_item {
padding: 2px;
margin: 3px;
background-color: black;
width: 3in;
height: 1.5in;
position: relative;
color: black;
border-style: solid;
border-color: black;
border-width: 3pt;
}
.affiliate_image {
width: 3in;
height: 1.4in;
background-color: black;
position: absolute;
left: 0px;
top: 0px;
}
@media only screen and (max-width: 600px), (max-height: 600px) {
.affiliate_image,
.affiliate_item {
width: 4in;
height: 0.9in;
max-width: 1.9in;
min-width: 1.9in;
max-height: 0.9in;
min-height: 0.9in;
}
.affiliate_carousel {
height: 0.9in;
}
.affiliate_content {
width: 28in;
height: 1in;
}
@keyframes affiliate_scroll {
from { left: 0in; }
to { left: -14in; }
}
}

View File

@ -0,0 +1,45 @@
'''
Created on Oct 24, 2021
@author: terry
'''
import os, random
import yaml
import lunagen.addon
class Affiliates(lunagen.addon.LunaGenAddOn):
"""
Affiliates advertising bar.
"""
name = 'affiliates'
desc = """\
Randomly selects affiliate link ads from a list and sets them to
display on a scrolling bar on the page.
"""
file = __file__
@staticmethod
def load(site):
if site.verbose: print("Loading affiliates data.")
try:
with open(os.path.join(site.datadir, 'affiliates.yaml')) as aff_file:
affiliates = yaml.safe_load(aff_file)
stylesheets = site.sitedata['stylesheets']
site.sitedata.update(affiliates)
site.sitedata['stylesheets'] = site._collect_stylesheets(affiliates)
site.sitedata['affiliates'] = random.sample(
affiliates['affiliates'], min( int(affiliates['affiliates_at_once']),
len(affiliates['affiliates'])))
# Generates a single banner default:
site.sitedata['banners'] = iter(['affiliates_banner.j2'])
site._copy_skeleton(os.path.join(os.path.dirname(__file__), 'skeleton'))
except FileNotFoundError:
print("No affiliates.yaml file, so affiliates list is empty.")
site.sitedata['affiliates'] = []

View File

@ -0,0 +1,147 @@
# This file documents the sitedata values needed by the Affiliates Banner add-on.
---
stylesheets:
- affiliates
affiliates_at_once: 7 # How many banners do you want to rotate at a time?
affiliates_message: >
We benefit when you support these projects and services!
# A text caption that appears with the banner
affiliate_image_path: 'affiliates/'
# TODO: not yet implemented
# Relative path from site root to location affiliate banners are stored
affiliates: # Data for each banner - unlimited (randomly selected on generation)
- name: Ardour
url: https://ardour.org
img: ardour.png
type: Software We Use
- name: Audacity
url: https://audacityteam.org
img: audacity.png
type: Software We Use
- name: Blender
url: https://blender.org
img: blender.png
type: Software We Use
- name: Blender Cloud
url: https://cloud.blender.org
img: blender_cloud.png
type: Open Movie Platform
- name: BlendSwap
url: https://blendswap.com
img: blendswap.png
type: Shared Asset Archive
- name: Creative Commons
url: https://www.creativecommons.org
img: creativecommons.png
type: Free Culture Advocacy Group
- name: Debian
url: https://debian.org
img: debian.png
type: Software We Use
- name: Ethic Cinema
url: http://ethiccinema.org
img: ethiccinema.png
type: Free Culture Advocacy Group
- name: Free Software Foundation
url: https://www.fsf.org
img: freesoftwarefoundation.png
type: Free Software Advocacy Group
- name: Free Sound
url: https://freesound.org
img: freesound.png
type: Shared Asset Archive
- name: GIMP
url: https://gimp.org
img: gimp.png
type: Software We Use
- name: Inkscape
url: https://inkscape.org
img: inkscape.png
type: Software We Use
- name: Internet Archive
url: https://archive.org
img: internet_archive.png
type: Shared Asset Archive
- name: Jamendo
url: https://jamendo.com
img: jamendo.png
type: Shared Asset Archive
- name: Kdenlive
url: https://kdenlive.org
img: kdenlive.png
type: Software We Use
- name: Krita
url: https://krita.org
img: krita.png
type: Software We Use
- name: Mastodon
url: http://mastodon.social
img: mastodon.png
type: Social Media Platform We Use
- name: Morevna Project
url: https://morevnaproject.org
img: morevnaproject.png
type: Free Culture Project
- name: MusOpen
url: https://musopen.org
img: musopen.png
type: Shared Asset Archive
- name: Olive Video Editor
url: https://olivevideoeditor.org
img: olivevideoeditor.png
type: Software We Use
- name: Public Domain Files
url: http://www.publicdomainfiles.com
img: publicdomainfiles.png
type: Shared Asset Archive
- name: Public Knowledge
url: https://publicknowledge.org
img: publicknowledge.png
type: Free Culture Advocacy Group
- name: Question Copyright
url: https://questioncopyright.org
img: questioncopyright.png
type: Free Culture Advocacy Group
- name: Software Freedom Conservancy
url: https://sfconservancy.org
img: sfconservancy.png
type: Free Software Advocacy Group
- name: Ubuntu Studio
url: https://ubuntustudio.org
img: ubuntu_studio.png
type: Software We Use
- name: Urchn
url: https://urchn.org
img: urchn.png
type: Free Culture Studio

View File

@ -0,0 +1,25 @@
{# INCLUDE #}
{% if affiliates %}
<!-- Affiliate Links Banner Bar (INCLUDE) -->
<div id="AffiliateLinks" class="banner_bar">
<p class="fine_print">
{% if affiliates_message is defined %}
{{ affiliates_message }}</p>
{% else %}
Affiliate links: commissions support our project.</p>
{% endif %}
<div class="affiliate_carousel">
<div class="affiliate_content">
{% for i in range(2) %}
{% for affiliate in affiliates %}
<div class="affiliate_item">
<a href="{{affiliate.url}}" target="_blank" rel="nofollow" ><img src="{{imgdir}}/affiliates/{{affiliate.img}}"
alt="{{affiliate.name | escape}}" title="{{affiliate.name | escape}} - {{affiliate.type}}"
class="affiliate_image" /></a>
</div>
{% endfor %}
{% endfor %}
</div>
</div>
</div> <!-- AffiliateLinks -->
{% endif %}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,26 @@
/* Store products banner */
.store_banner {
width: 100%;
min-height: 0.5in;
max-height: 2in;
overflow: hidden;
display: flex;
flex-wrap: wrap;
flex-width: 2in;
justify-content: center;
}
.product_img {
width: 1in;
height: 0.5in;
display: inline-block;
padding: 0px;
margin: 0px;
}
@media only screen and (min-width: 7in) {
.product_img { width: 2in; height: 1in; }
}

View File

@ -0,0 +1,38 @@
'''
Created on Oct 27, 2021
@author: terry
'''
import os
import yaml
import lunagen.addon
class Products(lunagen.addon.LunaGenAddOn):
"""
Products with Banners.
"""
name = 'products'
desc = """\
Display a set of product banners for merch store.
"""
file = __file__
@staticmethod
def load(site):
if site.verbose: print("Loading store products data.")
try:
with open(os.path.join(site.datadir, 'products.yaml')) as prod_file:
products = yaml.safe_load(prod_file)
# stylesheets = site.sitedata['stylesheets']
site.sitedata.update(products)
site.sitedata['stylesheets'] = site._collect_stylesheets(products)
except FileNotFoundError:
print("No products.yaml file, so products list is empty.")
site.sitedata['products'] = []

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,11 @@
{# INCLUDE #}
<!-- Store Banner INCLUDE -->
<div id="store_banner" class="banner_bar">
<p class="fine_print">Lunatics! Shop: Profits support our project.</p>
<div class="store_banner">
{%- for product in products %}
<a href="{{product.url}}"><img src="{{imgdir}}/products/{{product.img}}" class="product_img"
alt="{{product.name}}" title="{{product.desc}}" /></a>
{%- endfor %}
</div>
</div>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 46 MiB

View File

@ -0,0 +1,291 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="88"
height="31"
viewBox="0 0 88 31"
version="1.1"
id="svg8"
inkscape:version="1.0.2 (1.0.2+r75+1)"
sodipodi:docname="eclipse.png.svg"
inkscape:export-filename="/project/terry/Dev/eclipse-workspace/LunaGen/src/lunagen/addons/softwarelist/skeleton/images/icons/eclipse.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2">
<linearGradient
id="vlpc"
x1="151"
x2="112"
y1="192.4"
y2="137.3"
gradientTransform="matrix(0.5625,0,0,0.568,-9.4,-5.305)"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#ffd43b"
offset="0"
id="stop875" />
<stop
style="stop-color:#ffe873"
offset="1"
id="stop877" />
</linearGradient>
<linearGradient
id="vlpb"
x1="26.65"
x2="135.7"
y1="20.6"
y2="114.4"
gradientTransform="matrix(0.5625,0,0,0.568,-9.4,-5.305)"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#5a9fd4"
offset="0"
id="stop880" />
<stop
style="stop-color:#306998"
offset="1"
id="stop882" />
</linearGradient>
<radialGradient
id="vlpa"
cx="61.52"
cy="132.3"
r="29.04"
gradientTransform="matrix(2.383e-8,-0.2964,1.437,4.684e-7,-128.5,150.5)"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#b8b8b8;stop-opacity:.498"
offset="0"
id="stop885" />
<stop
style="stop-color:#7f7f7f;stop-opacity:0"
offset="1"
id="stop887" />
</radialGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#878787"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="11.840909"
inkscape:cx="44.25254"
inkscape:cy="24.286204"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="true"
units="px"
inkscape:window-width="2880"
inkscape:window-height="1620"
inkscape:window-x="826"
inkscape:window-y="228"
inkscape:window-maximized="0">
<inkscape:grid
type="xygrid"
id="grid833"
originx="4"
originy="1"
spacingx="8"
spacingy="5" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g1091"
transform="matrix(0.18193017,0,0,0.18193017,-11.670632,-53.420151)">
<path
fill="#2c2255"
d="M 101.124,392.936 H 84.38 c 2.217,7.605 6.331,14.422 12.354,20.445 9.602,9.604 21.148,14.398 34.65,14.398 2.699,0 5.314,-0.201 7.854,-0.584 10.17,-1.535 19.074,-6.133 26.703,-13.814 6.062,-6.021 10.205,-12.84 12.439,-20.445 h -6.795 -9.936 z"
id="path991" />
<g
id="g997">
<path
fill="#2c2255"
d="m 91.891,370.194 h -8.747 c -0.32,1.922 -0.538,3.884 -0.637,5.896 h 10.396 5.215 75.275 6.871 c -0.1,-2.012 -0.318,-3.974 -0.641,-5.896"
id="path993" />
<path
fill="#2c2255"
d="m 82.507,381.565 c 0.099,2.013 0.316,3.975 0.637,5.896 h 9.094 6.893 73.648 6.846 c 0.322,-1.921 0.542,-3.883 0.642,-5.896"
id="path995" />
</g>
<path
fill="#2c2255"
d="m 178.382,364.718 c -2.232,-7.626 -6.376,-14.474 -12.441,-20.54 -7.609,-7.608 -16.488,-12.174 -26.625,-13.71 -2.564,-0.389 -5.205,-0.593 -7.932,-0.593 -13.502,0 -25.049,4.769 -34.65,14.303 -6.025,6.066 -10.141,12.914 -12.357,20.54"
id="path999" />
<g
id="g1003">
<path
fill="#f7941e"
d="m 79.6,378.829 c 0,-25.824 19.395,-47.281 44.626,-51.055 -0.626,-0.023 -1.255,-0.049 -1.887,-0.049 -28.314,0 -51.269,22.881 -51.269,51.104 0,28.224 22.954,51.103 51.269,51.103 0.634,0 1.263,-0.023 1.891,-0.047 C 98.995,426.111 79.6,404.654 79.6,378.829 Z"
id="path1001" />
</g>
<rect
x="350.664"
y="323.66299"
fill="#f7941e"
width="10.197"
height="12.912"
id="rect1005" />
<path
fill="#2c2255"
d="m 265.529,376.799 v 4.986 h -46.885 c 0.442,7.022 2.558,12.369 6.345,16.044 3.788,3.678 9.062,5.514 15.822,5.514 3.916,0 7.712,-0.479 11.39,-1.438 3.676,-0.959 7.322,-2.402 10.945,-4.324 v 9.645 c -3.658,1.553 -7.408,2.734 -11.251,3.549 -3.843,0.812 -7.74,1.219 -11.693,1.219 -9.901,0 -17.743,-2.881 -23.525,-8.646 -5.782,-5.764 -8.673,-13.556 -8.673,-23.384 0,-10.16 2.743,-18.225 8.229,-24.19 5.486,-5.967 12.886,-8.951 22.195,-8.951 8.351,0 14.954,2.688 19.812,8.063 4.86,5.37 7.289,12.676 7.289,21.913 m -10.197,-2.992 c -0.075,-5.578 -1.636,-10.03 -4.683,-13.354 -3.049,-3.326 -7.085,-4.988 -12.109,-4.988 -5.69,0 -10.244,1.607 -13.661,4.822 -3.418,3.213 -5.385,7.74 -5.902,13.576 z"
id="path1007" />
<path
fill="#2c2255"
d="m 318.422,350.698 v 9.53 c -2.883,-1.588 -5.773,-2.778 -8.673,-3.573 -2.901,-0.795 -5.829,-1.191 -8.785,-1.191 -6.614,0 -11.749,2.096 -15.405,6.289 -3.658,4.193 -5.487,10.078 -5.487,17.65 0,7.573 1.829,13.459 5.487,17.651 3.656,4.195 8.791,6.289 15.405,6.289 2.956,0 5.884,-0.396 8.785,-1.188 2.897,-0.795 5.79,-1.986 8.673,-3.576 V 408 c -2.846,1.33 -5.793,2.328 -8.84,2.992 -3.05,0.666 -6.289,0.998 -9.727,0.998 -9.348,0 -16.773,-2.938 -22.277,-8.812 -5.506,-5.873 -8.258,-13.798 -8.258,-23.774 0,-10.121 2.779,-18.084 8.34,-23.886 5.56,-5.799 13.182,-8.7 22.859,-8.7 3.142,0 6.208,0.325 9.202,0.971 2.992,0.645 5.892,1.616 8.701,2.909"
id="path1009" />
<rect
x="327.64301"
y="324.151"
fill="#2c2255"
width="10.199"
height="86.231003"
id="rect1011" />
<path
fill="#2c2255"
d="m 350.664,348.312 h 10.197 v 62.07 h -10.197 z"
id="path1013" />
<path
fill="#2c2255"
d="m 383.549,401.072 v 32.92 h -10.252 v -85.68 h 10.252 v 9.423 c 2.145,-3.693 4.852,-6.438 8.12,-8.23 3.271,-1.789 7.177,-2.688 11.722,-2.688 7.537,0 13.661,2.991 18.37,8.979 4.711,5.986 7.065,13.855 7.065,23.607 0,9.756 -2.354,17.625 -7.065,23.608 -4.709,5.984 -10.833,8.979 -18.37,8.979 -4.545,0 -8.451,-0.896 -11.722,-2.689 -3.271,-1.789 -5.978,-4.533 -8.12,-8.229 m 34.693,-21.669 c 0,-7.5 -1.543,-13.384 -4.628,-17.65 -3.085,-4.266 -7.324,-6.399 -12.72,-6.399 -5.396,0 -9.636,2.133 -12.719,6.399 -3.085,4.269 -4.629,10.15 -4.629,17.65 0,7.502 1.544,13.387 4.629,17.651 3.083,4.27 7.323,6.4 12.719,6.4 5.396,0 9.635,-2.133 12.72,-6.4 3.085,-4.264 4.628,-10.149 4.628,-17.651"
id="path1015" />
<path
fill="#2c2255"
d="m 476.788,350.143 v 9.644 c -2.884,-1.478 -5.875,-2.586 -8.979,-3.326 -3.104,-0.738 -6.317,-1.106 -9.643,-1.106 -5.062,0 -8.857,0.774 -11.39,2.327 -2.531,1.552 -3.794,3.879 -3.794,6.982 0,2.363 0.901,4.221 2.714,5.57 1.81,1.348 5.447,2.631 10.918,3.852 l 3.489,0.775 c 7.241,1.553 12.388,3.739 15.436,6.567 3.049,2.826 4.573,6.771 4.573,11.83 0,5.765 -2.282,10.326 -6.848,13.689 -4.562,3.359 -10.833,5.043 -18.812,5.043 -3.324,0 -6.789,-0.324 -10.394,-0.969 -3.603,-0.646 -7.396,-1.617 -11.389,-2.91 V 397.58 c 3.771,1.961 7.482,3.428 11.14,4.408 3.658,0.979 7.278,1.467 10.862,1.467 4.804,0 8.496,-0.82 11.084,-2.465 2.587,-1.646 3.878,-3.963 3.878,-6.955 0,-2.771 -0.932,-4.896 -2.796,-6.375 -1.867,-1.478 -5.959,-2.9 -12.278,-4.269 l -3.545,-0.829 c -6.316,-1.33 -10.881,-3.371 -13.688,-6.123 -2.809,-2.752 -4.212,-6.529 -4.212,-11.334 0,-5.839 2.068,-10.345 6.207,-13.521 4.138,-3.178 10.013,-4.768 17.623,-4.768 3.769,0 7.314,0.276 10.641,0.83 3.328,0.558 6.394,1.388 9.203,2.497"
id="path1017" />
<path
fill="#2c2255"
d="m 540.93,376.799 v 4.986 h -46.885 c 0.443,7.022 2.558,12.369 6.347,16.044 3.785,3.678 9.062,5.514 15.82,5.514 3.918,0 7.713,-0.479 11.39,-1.438 3.678,-0.959 7.323,-2.402 10.946,-4.324 v 9.645 c -3.659,1.553 -7.409,2.734 -11.252,3.549 -3.841,0.812 -7.739,1.219 -11.69,1.219 -9.903,0 -17.744,-2.881 -23.524,-8.646 -5.784,-5.764 -8.675,-13.556 -8.675,-23.384 0,-10.16 2.744,-18.225 8.229,-24.19 5.486,-5.968 12.889,-8.951 22.196,-8.951 8.349,0 14.954,2.688 19.812,8.063 4.856,5.37 7.286,12.676 7.286,21.913 m -10.197,-2.992 c -0.076,-5.578 -1.636,-10.03 -4.686,-13.354 -3.049,-3.326 -7.086,-4.988 -12.106,-4.988 -5.689,0 -10.244,1.607 -13.66,4.822 -3.418,3.213 -5.389,7.74 -5.903,13.576 z"
id="path1019" />
<g
id="g1042">
<linearGradient
id="SVGID_1_"
gradientUnits="userSpaceOnUse"
x1="502.3848"
y1="-40.075699"
x2="502.3848"
y2="-113.7106"
gradientTransform="translate(-371,474.5)">
<stop
offset="0.3033"
style="stop-color:#473788"
id="stop1021" />
<stop
offset="0.872"
style="stop-color:#2C2255"
id="stop1023" />
</linearGradient>
<path
fill="url(#SVGID_1_)"
d="m 164.653,376.089 c -0.164,-2.021 -0.504,-3.992 -1.012,-5.896 h -64.51 c -0.508,1.902 -0.849,3.874 -1.013,5.896 z"
id="path1026"
style="fill:url(#SVGID_1_)" />
<linearGradient
id="SVGID_2_"
gradientUnits="userSpaceOnUse"
x1="502.38571"
y1="-40.074699"
x2="502.38571"
y2="-113.7096"
gradientTransform="translate(-371,474.5)">
<stop
offset="0.3033"
style="stop-color:#473788"
id="stop1028" />
<stop
offset="0.872"
style="stop-color:#2C2255"
id="stop1030" />
</linearGradient>
<path
fill="url(#SVGID_2_)"
d="M 164.653,381.565 H 98.119 c 0.164,2.021 0.503,3.991 1.012,5.896 h 64.511 c 0.508,-1.904 0.847,-3.875 1.011,-5.896 z"
id="path1033"
style="fill:url(#SVGID_2_)" />
<linearGradient
id="SVGID_3_"
gradientUnits="userSpaceOnUse"
x1="502.38571"
y1="-40.077599"
x2="502.38571"
y2="-113.7071"
gradientTransform="translate(-371,474.5)">
<stop
offset="0.3033"
style="stop-color:#473788"
id="stop1035" />
<stop
offset="0.8631"
style="stop-color:#2C2255"
id="stop1037" />
</linearGradient>
<path
fill="url(#SVGID_3_)"
d="m 131.386,412.217 c 13.397,0 24.945,-7.893 30.263,-19.281 h -60.526 c 5.318,11.388 16.866,19.281 30.263,19.281 z"
id="path1040"
style="fill:url(#SVGID_3_)" />
</g>
<g
id="g1050">
<path
fill="#ffffff"
d="m 93.188,381.565 h 4.884 66.706 8.763 6.657 c 0.046,-0.871 0.072,-1.748 0.072,-2.632 0,-0.955 -0.035,-1.901 -0.089,-2.845 H 173.54 164.777 98.071 92.842 82.507 c -0.054,0.942 -0.089,1.89 -0.089,2.845 0,0.884 0.026,1.761 0.072,2.632 z"
id="path1044" />
<path
fill="#ffffff"
d="M 100.928,364.718 H 84.376 c -0.544,1.783 -0.895,3.612 -1.232,5.477 h 8.525 7.259 64.679 9.16 6.547 c -0.338,-1.863 -0.773,-3.692 -1.316,-5.477"
id="path1046" />
<path
fill="#ffffff"
d="m 173.026,387.46 h -9.16 -64.678 -6.912 -9.133 c 0.328,1.863 0.701,3.691 1.236,5.476 h 16.807 60.682 9.962 6.488 c 0.534,-1.783 0.965,-3.611 1.294,-5.476 z"
id="path1048" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1,190 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="88"
height="31"
viewBox="0 0 88 31"
version="1.1"
id="svg8"
inkscape:version="1.0.2 (1.0.2+r75+1)"
sodipodi:docname="jinja2.png.svg"
inkscape:export-filename="/project/terry/Dev/eclipse-workspace/LunaGen/src/lunagen/addons/softwarelist/skeleton/images/icons/jinja2.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2">
<linearGradient
id="vlpc"
x1="151"
x2="112"
y1="192.4"
y2="137.3"
gradientTransform="matrix(0.5625,0,0,0.568,-9.4,-5.305)"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#ffd43b"
offset="0"
id="stop875" />
<stop
style="stop-color:#ffe873"
offset="1"
id="stop877" />
</linearGradient>
<linearGradient
id="vlpb"
x1="26.65"
x2="135.7"
y1="20.6"
y2="114.4"
gradientTransform="matrix(0.5625,0,0,0.568,-9.4,-5.305)"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#5a9fd4"
offset="0"
id="stop880" />
<stop
style="stop-color:#306998"
offset="1"
id="stop882" />
</linearGradient>
<radialGradient
id="vlpa"
cx="61.52"
cy="132.3"
r="29.04"
gradientTransform="matrix(2.383e-8,-0.2964,1.437,4.684e-7,-128.5,150.5)"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#b8b8b8;stop-opacity:.498"
offset="0"
id="stop885" />
<stop
style="stop-color:#7f7f7f;stop-opacity:0"
offset="1"
id="stop887" />
</radialGradient>
<linearGradient
id="linearGradient6558">
<stop
style="stop-color:#575757;stop-opacity:1;"
offset="0"
id="stop6560" />
<stop
style="stop-color:#2f2f2f;stop-opacity:1;"
offset="1"
id="stop6562" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6558"
id="radialGradient6564"
cx="61.297766"
cy="60.910986"
fx="61.297766"
fy="60.910986"
r="44.688254"
gradientTransform="matrix(1,0,0,0.945104,0,3.343747)"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6558"
id="radialGradient6580"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.945104,0.355158,3.334402)"
cx="61.297766"
cy="60.910986"
fx="61.297766"
fy="60.910986"
r="44.688254" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6558"
id="linearGradient4173"
x1="255.15521"
y1="32.347946"
x2="279.8912"
y2="32.347946"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8073249,0,0,0.8073249,57.960878,7.4036303)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6558"
id="linearGradient5145"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7902775,0,0,0.82474,60.019977,8.0684132)"
x1="255.15521"
y1="32.347946"
x2="279.8912"
y2="32.347946" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#9bacc2"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="16.745574"
inkscape:cx="56.700057"
inkscape:cy="24.358228"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="true"
units="px"
inkscape:window-width="2760"
inkscape:window-height="1620"
inkscape:window-x="826"
inkscape:window-y="228"
inkscape:window-maximized="0">
<inkscape:grid
type="xygrid"
id="grid833"
originx="4"
originy="1"
spacingx="8"
spacingy="5" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
inkscape:label="Layer 1"
id="layer1-6"
transform="matrix(0.3125897,0,0,0.3125897,-2.5493525,-3.5275979)">
<path
style="font-style:normal;font-weight:normal;font-size:12px;font-family:'Bitstream Vera Sans';fill:#f4f4f4;fill-opacity:1;stroke:#e7e7e7;stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 165.36463,80.874808 v 0 H 153.32556 V 81.8344 h -5.67562 V 36.035583 h 17.71469 V 20.333129 c 5.21691,0.697954 7.7107,1.744785 7.48146,3.140492 -0.0574,0.581637 -0.63064,1.075973 -1.71985,1.483003 v 11.078959 h 17.97271 v 46.496703 h -5.76162 v -1.657478 h -12.21109 v 22.070672 h -5.76161 V 80.874808 M 153.32556,55.489173 v 0 h 12.03907 V 41.793146 h -12.03907 v 13.696027 m 17.80068,0 v 0 h 12.21109 V 41.793146 h -12.21109 v 13.696027 m 12.21109,5.844804 v 0 h -12.21109 v 13.696029 h 12.21109 V 61.333977 m -17.9727,0 v 0 h -12.03907 v 13.696029 h 12.03907 V 61.333977 m -32.50566,-1.919185 c 4.47172,3.722091 8.14072,8.520056 11.00721,14.393909 l -4.72964,3.576671 c -1.89187,-4.419927 -4.50034,-8.258302 -7.8254,-11.515132 v 37.07524 h -5.6756 V 68.57455 c -3.32512,3.373143 -7.10883,6.339157 -11.35118,8.89806 l -4.64367,-4.100084 c 11.86713,-6.28096 20.98243,-17.883314 27.34599,-34.807109 h -20.72447 v -5.844802 h 9.54533 V 20.333129 c 5.04491,0.697954 7.51007,1.715709 7.39545,3.053254 -0.0574,0.6398 -0.63064,1.163211 -1.71992,1.570241 v 7.763991 h 9.28736 l 2.83781,4.012854 c -2.9238,8.781791 -6.50687,16.342223 -10.74927,22.681323 m 121.25119,-9.944891 v 0 -29.136772 c 5.10227,0.697954 7.56739,1.715709 7.39546,3.053254 -0.0574,0.523486 -0.45863,0.959661 -1.2039,1.308534 -8e-5,6.9e-5 -8e-5,6.9e-5 0,0 v 0 l -0.51594,0.261707 v 24.513277 h 17.37074 v 5.75757 h -17.37074 v 38.558241 h 21.67038 v 5.844798 h -49.10238 v -5.844798 h 21.75638 V 55.227471 h -17.8867 v -5.75757 h 17.8867 m -28.54986,9.857653 c 5.56081,3.780244 10.06115,8.549139 13.50097,14.306681 l -4.2997,4.012844 c -3.15312,-5.466757 -6.93682,-9.712231 -11.35113,-12.736431 v 38.034832 h -5.6756 V 67.44049 c -4.81565,4.187341 -10.03262,7.589531 -15.65084,10.206589 l -4.21373,-4.449026 c 14.79091,-6.280952 26.14212,-17.825156 34.0535,-34.632636 h -26.57205 v -5.844802 h 12.64111 V 20.333129 c 5.04491,0.697954 7.51008,1.715709 7.39546,3.053254 -0.0574,0.6398 -0.63064,1.163211 -1.71992,1.570241 v 7.763991 h 12.55509 l 2.5798,4.012854 c -3.66905,8.781791 -8.08339,16.313142 -13.24296,22.594085"
id="text4761" />
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:44.0979px;line-height:125%;font-family:Candara;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#b41717;fill-opacity:1;stroke:#7f2828;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 149.14708,37.774469 c -0.16901,3.34343 -0.30182,7.049756 -0.39837,11.118987 -0.0724,4.069298 -0.36691,21.747872 -0.36687,26.630966 -4e-5,3.541373 -0.32596,6.466844 -0.97778,8.776413 -0.65187,2.309587 -1.67794,4.256236 -3.07821,5.839944 -1.37616,1.583715 -3.15063,2.760504 -5.32346,3.53036 -2.17286,0.769857 -4.78028,1.154796 -7.82225,1.154796 -2.34186,0 -4.44227,-0.230955 -6.30125,-0.692886 l 0.54321,-4.817119 c 1.71413,0.72587 3.50068,1.088804 5.35967,1.088803 2.07628,1e-6 3.88698,-0.263951 5.43213,-0.791857 1.56925,-0.549895 2.81261,-1.396743 3.73006,-2.540541 0.94154,-1.143787 1.60546,-2.551531 1.99176,-4.223235 0.41041,-1.671688 0.61562,-3.860289 0.61564,-6.565815 -2e-5,-9.986166 0.0772,-31.624028 -0.28495,-38.508816 h 6.88067 m 17.2379,42.958228 h -6.55474 c 0.33797,-4.399199 0.50699,-9.425285 0.50699,-15.078273 0,-6.356824 -0.42252,-11.690857 -1.2675,-16.002105 l 7.24284,-0.890836 c -0.28973,4.597196 -0.43458,10.228167 -0.43458,16.892941 0,5.279055 0.169,10.305141 0.50699,15.078273 m 1.52103,-41.242538 c -3e-5,1.121835 -0.39841,2.100656 -1.19511,2.936461 -0.79672,0.813895 -1.91935,1.220822 -3.3679,1.220779 -1.23128,4.3e-5 -2.197,-0.351895 -2.89712,-1.055804 -0.676,-0.725826 -1.014,-1.594668 -1.014,-2.606525 0,-1.099766 0.41043,-2.056585 1.23127,-2.870479 0.82084,-0.813811 1.95554,-1.220738 3.40412,-1.22078 1.18296,4.2e-5 2.11248,0.362972 2.78848,1.088798 0.70013,0.703917 1.05023,1.539764 1.05026,2.50755 m 38.82147,41.242538 h -6.59097 c 0.53112,-5.784948 0.79668,-12.097798 0.79669,-18.938575 -1e-5,-3.387366 -0.7605,-5.696945 -2.28146,-6.928751 -1.49687,-1.253741 -3.64555,-1.880624 -6.4461,-1.880657 -3.42833,3.3e-5 -6.59099,1.132821 -9.48811,3.398385 0,7.500662 0.0483,15.617188 0.14485,24.349598 h -6.59096 c 0.4104,-7.478639 0.61565,-12.889655 0.61565,-16.233065 0,-5.147043 -0.53117,-10.140139 -1.59344,-14.979293 l 6.37371,-0.824846 0.68805,4.025268 h 0.28972 c 3.57312,-2.947438 7.39972,-4.421169 11.47988,-4.421194 4.00766,2.5e-5 7.11,0.813887 9.30702,2.441551 2.19694,1.605745 3.29546,4.476216 3.29547,8.611445 -1e-5,0.417944 -0.0242,1.242799 -0.0724,2.474555 -0.0483,1.231797 -0.0725,2.056643 -0.0725,2.474552 -2e-5,3.673348 0.0483,9.150352 0.14486,16.431027 m 15.97043,-32.037204 c -0.41044,6.818789 -0.61566,13.659548 -0.61566,20.522287 0,1.825681 0.0604,4.245239 0.18107,7.258688 0.1449,2.991457 0.21728,5.026091 0.21731,6.103895 -3e-5,7.104705 -2.96958,11.415924 -8.90868,12.933661 l -1.81071,-2.50754 c 2.14871,-1.649718 3.47656,-3.409399 3.98354,-5.279053 0.74843,-2.683519 1.12265,-8.402478 1.12265,-17.156896 0,-9.392287 -0.48283,-16.409005 -1.44856,-21.050196 l 7.27904,-0.824846 m 1.55719,-9.205334 c 0,1.121835 -0.39837,2.100656 -1.19504,2.936461 -0.79674,0.813895 -1.91937,1.220822 -3.36793,1.220779 -1.23129,4.3e-5 -2.19698,-0.351895 -2.89713,-1.055804 -0.676,-0.725826 -1.014,-1.594668 -1.014,-2.606525 0,-1.099766 0.41044,-2.056585 1.23131,-2.870479 0.82085,-0.813811 1.95554,-1.220738 3.40409,-1.22078 1.183,4.2e-5 2.11249,0.362972 2.78852,1.088798 0.70011,0.703917 1.05018,1.539764 1.05018,2.50755 m 35.34498,41.242538 -5.68562,0.197964 c -0.28973,-1.077804 -0.43459,-2.100616 -0.43456,-3.068445 h -0.36216 c -2.96957,2.463556 -7.01347,3.69533 -12.13168,3.695331 -2.77644,-10e-7 -5.16656,-0.736865 -7.17043,-2.210599 -2.00385,-1.495727 -3.00575,-3.618341 -3.00575,-6.367849 0,-3.387375 1.56926,-6.103883 4.70781,-8.149525 3.13856,-2.067607 8.96898,-3.156414 17.49144,-3.266409 0.0724,-0.52789 0.10859,-1.132779 0.10861,-1.814668 -2e-5,-2.705494 -0.7967,-4.509161 -2.39009,-5.411023 -1.56933,-0.901813 -3.95946,-1.352727 -7.17044,-1.35276 -3.7904,3.3e-5 -7.52043,0.428954 -11.19011,1.28677 l 0.6156,-4.553183 c 3.62141,-0.945791 7.78603,-1.418709 12.49388,-1.418734 4.29737,2.5e-5 7.61701,0.813887 9.95887,2.441551 2.34183,1.605745 3.51274,4.355245 3.51279,8.248507 -5e-5,1.033844 -0.0604,2.914492 -0.18109,5.641983 -0.0966,2.705525 -0.14487,4.509198 -0.14485,5.411024 -2e-5,4.003281 0.32589,7.566633 0.97778,10.690065 m -6.40989,-6.400841 c -0.12074,-3.343387 -0.1811,-6.34584 -0.18106,-9.007372 -4.53886,1.4e-5 -7.99127,0.307959 -10.35726,0.923834 -3.95939,1.099813 -5.93909,3.20043 -5.93909,6.301859 0,2.991466 2.31766,4.487194 6.9531,4.487189 3.98354,5e-6 7.15828,-0.901832 9.52431,-2.70551"
id="text3736"
sodipodi:nodetypes="ccsscssccscccsccccsccsccsscsssccccscscccsccccscsssccscscccscccsscsssccccccscsccscsccscscsccccssc" />
<path
style="fill:url(#radialGradient6564);fill-opacity:1;fill-rule:evenodd;stroke:#323232;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 105.45673,18.675923 c 0,0 -17.244781,8.242538 -31.283896,10.061975 -14.039107,1.819435 -40.8124,3.639673 -46.127212,2.355358 -5.314804,-1.284315 -9.129977,-2.78406 -9.129977,-2.78406 l 1.105796,3.747387 -3.411928,2.995888 0.604887,1.069255 1.40352,0.105914 4.30981,0.534612 0.604891,1.926657 2.405354,0.216875 1.205046,4.065143 c 0,0 5.111743,0.428701 6.615932,0.428701 1.504189,0 4.513013,-0.211826 4.513013,-0.211826 l 0.09924,1.603855 1.1058,0.211838 v 1.820732 l -2.410085,2.143532 0.60489,0.105912 v 0.746456 c 0,0 -5.41635,0.43203 -7.622506,0.110963 -2.206144,-0.321084 -2.608554,-0.322804 -2.608554,-0.322804 l -0.198489,0.211841 -0.09924,0.963328 h 0.500925 l 0.198474,4.176089 11.133671,-0.4287 -0.803363,14.449903 -0.09925,1.815695 -9.4277,-0.534626 -0.09924,-3.853303 h 2.102918 l 0.203211,-1.497956 1.904434,-0.4287 0.302448,-0.423665 -7.12158,-1.714818 -5.415611,1.603855 0.902596,0.751503 h 0.902612 l 0.09924,1.286116 1.904445,0.105912 v 3.747387 l -2.102919,0.53463 0.401674,0.852369 0.500925,0.322785 v 2.889986 h 1.304284 v 13.375612 l -2.107646,0.322791 0.302437,3.853297 1.29956,0.216875 -0.198476,8.775868 5.718048,0.1059 -1.205036,-8.669926 8.624341,-0.211842 -0.600161,4.705689 -0.80336,3.318679 8.723576,0.10591 0.09924,-8.558977 6.015767,-0.534612 -0.29772,5.45717 -0.203201,3.207719 h 5.117899 l -0.20321,-8.775853 0.704123,0.110964 0.198485,-4.176105 h -0.803361 l -0.297723,-1.714818 -0.500924,-4.922556 0.198485,-5.668996 h 1.101071 v -3.424601 l -1.403517,0.10591 0.203199,-4.039919 1.630357,-0.161388 0.07561,-1.311334 0.926236,-0.136182 0.949857,-0.721236 -5.713334,-1.175154 -5.666072,1.255848 0.552898,0.907857 0.600162,-0.05044 0.699398,-0.02522 0.1276,1.654296 1.578368,-0.07565 0.02835,3.58095 -6.795506,-0.15635 0.226837,-3.828095 0.222099,-3.480075 v -4.574549 l 0.20321,-4.81663 13.609913,-0.696015 16.194854,-0.933059 0.151215,3.076591 -0.576523,7.383817 -0.250464,6.874418 -5.963796,-0.105915 -0.02835,-4.816629 2.206879,-0.08069 0.09925,-1.361781 0.902596,-0.136178 -0.04726,-0.267302 0.90261,-0.05044 0.500912,-0.670795 -6.743521,-1.578651 -6.719895,1.44247 0.477288,0.832193 0.751385,-0.05549 v 0.378277 h 0.926233 v 1.523161 l 1.980057,0.02522 -0.02364,4.226529 h -2.003678 l -0.02835,0.963331 0.704124,0.08069 -0.07561,3.666695 1.479132,0.08071 -0.174851,14.530598 -1.956419,0.398445 0.02363,0.696015 h 0.680499 v 3.72217 h 1.124707 l -0.297722,5.083953 -0.378048,4.438358 7.121569,0.1866 -0.226828,-3.853298 -0.524546,-3.207722 -0.103963,-2.784073 6.044121,-0.105914 -0.174851,4.307231 -0.02835,4.549316 3.411932,0.26731 4.635874,-0.1866 1.455507,-0.42872 -0.80337,-2.436048 -0.198478,-3.828092 -0.378047,-2.728585 5.765306,-0.211826 -0.250459,3.343904 -0.02363,5.245327 2.30612,0.21183 2.282498,-0.0504 1.101077,-0.348 -0.652135,-4.978015 -0.222116,-3.747394 0.978216,-0.105915 0.02363,-3.343902 0.274093,-0.05548 -0.04728,-0.721233 h -1.129421 l -0.226827,-2.461285 -0.09924,-10.677284 0.850626,-0.02522 v -3.505308 l 0.354416,0.05549 v -0.696017 l -1.25702,-0.110961 0.02835,-4.06514 2.102917,-0.186605 -0.122861,-1.366825 0.926237,-0.08069 -0.052,-0.267314 1.228675,-0.61532 -6.24261,-1.255849 -6.341832,1.286115 0.401673,0.746456 0.978213,-0.0807 0.05199,0.32279 h 0.826987 l 0.04726,1.603855 2.05567,-0.02522 0.174848,3.934007 -7.268076,-0.05547 -0.850624,-5.911092 -0.680487,-3.132083 -0.548183,-5.618557 0.326073,-3.288431 14.488882,-1.099496 0.04726,-4.897336 0.727755,-0.186608 -0.04724,-0.746454 -0.552908,-0.322787 c -1.14e-4,0 -7.922562,1.174894 -10.429546,1.442468 -0.706297,0.07537 -0.652807,0.07042 -1.228673,0.13113 l -0.07561,-0.907852 -2.996075,-1.568554 0.03781,-1.825778 1.030198,-0.03027 0.0756,-2.51171 c 0,0 6.139781,-0.402974 8.421138,-0.938108 2.281355,-0.535141 5.51485,-1.069244 5.51485,-1.069244 l 1.531113,-4.145836 3.033892,-0.882633 0.250451,-0.696015 6.86639,-1.901424 0.77974,-0.640542 -2.60858,-5.699265 0.25048,-1.286117 1.32792,-0.696013 0.95457,-2.915207 z m -32.989856,21.727805 -0.03781,2.072926 1.554746,0.06556 -0.09924,1.96701 -3.048061,1.997266 -0.189019,0.57497 1.228671,0.01009 -0.0095,0.484186 -9.31428,0.453923 0.06143,-1.37691 0.425312,-0.685933 0.02835,-0.438784 0.0095,-0.948193 0.264629,-0.630458 0.09924,-0.509392 v -0.363141 l 0.401684,-1.603871 z m -19.479186,1.765256 -0.226835,1.392043 0.727746,0.857404 -0.04725,1.497955 0.675763,1.044022 -0.17485,1.230631 0.500923,0.721234 -9.503313,0.373227 -0.02363,-0.317741 1.101086,-0.13618 0.05197,-0.403482 -2.405367,-1.3063 -0.127589,-2.088047 1.15306,-0.05547 0.09925,-2.249446 z m 14.063574,32.107534 5.765308,0.373224 -0.198471,7.762091 0.751371,6.365024 -6.115005,-0.211839 z m -38.608682,0.322786 9.229227,0.479138 -0.803361,5.35126 v 4.498891 l 0.652137,2.511709 -9.026014,0.428704 z m 59.066078,0.05044 V 87.92449 l -5.864545,0.428706 -0.203201,-7.010602 -0.652148,-6.531449 z m -44.421242,0.29757 6.819132,0.02522 0.07089,12.306371 -6.365468,0.110961 -0.326075,-3.989484 -0.02363,-3.959223 z"
id="path4735" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,163 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="88"
height="31"
viewBox="0 0 88 31"
version="1.1"
id="svg8"
inkscape:version="1.0.2 (1.0.2+r75+1)"
sodipodi:docname="python.png.svg"
inkscape:export-filename="/project/terry/Dev/eclipse-workspace/LunaGen/src/lunagen/addons/softwarelist/skeleton/images/icons/python.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2">
<linearGradient
id="vlpc"
x1="151"
x2="112"
y1="192.4"
y2="137.3"
gradientTransform="matrix(0.5625,0,0,0.568,-9.4,-5.305)"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#ffd43b"
offset="0"
id="stop875" />
<stop
style="stop-color:#ffe873"
offset="1"
id="stop877" />
</linearGradient>
<linearGradient
id="vlpb"
x1="26.65"
x2="135.7"
y1="20.6"
y2="114.4"
gradientTransform="matrix(0.5625,0,0,0.568,-9.4,-5.305)"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#5a9fd4"
offset="0"
id="stop880" />
<stop
style="stop-color:#306998"
offset="1"
id="stop882" />
</linearGradient>
<radialGradient
id="vlpa"
cx="61.52"
cy="132.3"
r="29.04"
gradientTransform="matrix(2.383e-8,-0.2964,1.437,4.684e-7,-128.5,150.5)"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#b8b8b8;stop-opacity:.498"
offset="0"
id="stop885" />
<stop
style="stop-color:#7f7f7f;stop-opacity:0"
offset="1"
id="stop887" />
</radialGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#f2f2f2"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="11.840909"
inkscape:cx="39.016852"
inkscape:cy="16.456077"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="true"
units="px"
inkscape:window-width="2880"
inkscape:window-height="1620"
inkscape:window-x="826"
inkscape:window-y="228"
inkscape:window-maximized="0">
<inkscape:grid
type="xygrid"
id="grid833"
originx="4"
originy="1"
spacingx="8"
spacingy="5" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g935"
transform="matrix(0.17720589,0,0,0.17720589,0.93636347,5.0256392)">
<path
d="m 184.6,61.93 c 0,-14.56 -4.152,-22.04 -12.46,-22.45 -3.304,-0.156 -6.531,0.3704 -9.669,1.589 -2.505,0.8967 -4.191,1.784 -5.078,2.68 v 34.76 c 5.312,3.334 10.03,4.883 14.14,4.64 8.704,-0.5751 13.06,-7.642 13.06,-21.22 z m 10.24,0.6043 c 0,7.398 -1.735,13.54 -5.224,18.42 -3.889,5.527 -9.279,8.373 -16.17,8.529 -5.195,0.1657 -10.55,-1.462 -16.05,-4.874 v 31.59 l -8.909,-3.178 v -70.12 c 1.462,-1.793 3.343,-3.334 5.624,-4.64 5.302,-3.09 11.75,-4.679 19.33,-4.757 l 0.1267,0.1267 c 6.93,-0.08773 12.27,2.758 16.02,8.529 3.499,5.293 5.254,12.08 5.254,20.37 z"
style="fill:#646464"
id="path892" />
<path
d="m 249.3,83.27 c 0,9.923 -0.9942,16.79 -2.983,20.62 -1.998,3.821 -5.8,6.872 -11.41,9.143 -4.552,1.793 -9.474,2.768 -14.76,2.934 l -1.472,-5.614 c 5.371,-0.731 9.153,-1.462 11.35,-2.193 4.318,-1.462 7.281,-3.704 8.909,-6.706 1.306,-2.447 1.949,-7.115 1.949,-14.03 v -2.32 c -6.092,2.768 -12.48,4.143 -19.15,4.143 -4.386,0 -8.256,-1.374 -11.59,-4.143 -3.743,-3.012 -5.614,-6.833 -5.614,-11.46 v -37.08 l 8.909,-3.051 v 37.32 c 0,3.987 1.287,7.057 3.86,9.211 2.573,2.154 5.907,3.187 9.991,3.109 4.084,-0.08773 8.46,-1.667 13.11,-4.757 v -43.54 h 8.909 v 48.41 z"
style="fill:#646464"
id="path894" />
<path
d="m 284.1,89 c -1.062,0.08772 -2.037,0.1267 -2.934,0.1267 -5.039,0 -8.967,-1.199 -11.77,-3.606 -2.797,-2.408 -4.201,-5.731 -4.201,-9.971 v -35.09 h -6.102 v -5.605 h 6.102 v -14.88 l 8.899,-3.168 v 18.05 h 10.01 v 5.605 h -10.01 v 34.85 c 0,3.343 0.8967,5.712 2.69,7.096 1.54,1.14 3.987,1.793 7.32,1.959 v 4.64 z"
style="fill:#646464"
id="path896" />
<path
d="m 338,88.27 h -8.909 V 53.88 c 0,-3.499 -0.8188,-6.511 -2.447,-9.026 -1.881,-2.846 -4.493,-4.269 -7.846,-4.269 -4.084,0 -9.192,2.154 -15.32,6.462 v 41.22 h -8.909 V 6.067 L 303.478,3.26 V 40.7 c 5.692,-4.143 11.91,-6.219 18.67,-6.219 4.718,0 8.538,1.589 11.46,4.757 2.934,3.168 4.396,7.115 4.396,11.83 v 37.19 z"
style="fill:#646464"
id="path898" />
<path
d="m 385.4,60.53 c 0,-5.595 -1.062,-10.21 -3.178,-13.87 -2.515,-4.454 -6.423,-6.803 -11.71,-7.047 -9.767,0.5653 -14.64,7.564 -14.64,20.98 0,6.15 1.014,11.29 3.061,15.41 2.612,5.254 6.531,7.846 11.76,7.759 9.806,-0.07798 14.71,-7.817 14.71,-23.23 z m 9.757,0.05848 c 0,7.963 -2.037,14.59 -6.102,19.88 -4.474,5.926 -10.65,8.899 -18.54,8.899 -7.817,0 -13.91,-2.973 -18.31,-8.899 -3.987,-5.293 -5.975,-11.92 -5.975,-19.88 0,-7.486 2.154,-13.78 6.462,-18.91 4.552,-5.439 10.54,-8.168 17.93,-8.168 7.398,0 13.42,2.729 18.06,8.168 4.308,5.127 6.462,11.42 6.462,18.91 z"
style="fill:#646464"
id="path900" />
<path
d="m 446.2,88.27 h -8.909 V 51.93 c 0,-3.987 -1.199,-7.096 -3.597,-9.338 -2.398,-2.232 -5.595,-3.314 -9.581,-3.226 -4.23,0.07798 -8.256,1.462 -12.08,4.143 v 44.76 h -8.909 v -45.86 c 5.127,-3.733 9.845,-6.17 14.15,-7.31 4.065,-1.062 7.651,-1.589 10.74,-1.589 2.115,0 4.104,0.2047 5.975,0.6141 3.499,0.809 6.345,2.31 8.538,4.513 2.447,2.437 3.665,5.361 3.665,8.782 v 40.85 z"
style="fill:#646464"
id="path902" />
<path
d="M 60.51,6.398 C 55.926,6.4193 51.549,6.8102 47.7,7.492 36.35,9.497 34.29,13.692 34.29,21.432 v 10.22 H 61.1 v 3.406 H 34.29 24.23 c -7.792,0 -14.62,4.684 -16.75,13.59 -2.462,10.21 -2.571,16.59 0,27.25 1.906,7.938 6.458,13.59 14.25,13.59 h 9.219 v -12.25 c 0,-8.85 7.657,-16.66 16.75,-16.66 h 26.78 c 7.455,0 13.41,-6.138 13.41,-13.62 v -25.53 c 0,-7.266 -6.13,-12.72 -13.41,-13.94 C 69.873,6.7213 65.094,6.373 60.509,6.394 Z m -14.5,8.219 c 2.77,0 5.031,2.299 5.031,5.125 -2e-6,2.816 -2.262,5.094 -5.031,5.094 -2.779,-10e-7 -5.031,-2.277 -5.031,-5.094 -10e-7,-2.826 2.252,-5.125 5.031,-5.125 z"
style="fill:url(#vlpb)"
id="path904" />
<path
d="m 91.23,35.05 v 11.91 c 0,9.231 -7.826,17 -16.75,17 H 47.7 c -7.336,0 -13.41,6.278 -13.41,13.62 v 25.53 c 0,7.266 6.319,11.54 13.41,13.62 8.487,2.496 16.63,2.947 26.78,0 6.75,-1.954 13.41,-5.888 13.41,-13.62 V 92.89 H 61.11 v -3.406 h 26.78 13.41 c 7.792,0 10.7,-5.435 13.41,-13.59 2.799,-8.399 2.68,-16.48 0,-27.25 -1.926,-7.757 -5.604,-13.59 -13.41,-13.59 H 91.24 Z M 76.17,99.71 c 2.779,3e-6 5.031,2.277 5.031,5.094 -2e-6,2.826 -2.252,5.125 -5.031,5.125 -2.77,0 -5.031,-2.299 -5.031,-5.125 2e-6,-2.816 2.262,-5.094 5.031,-5.094 z"
style="fill:url(#vlpc)"
id="path906" />
<path
d="m 463.6,26.91 h 1.562 v -9.796 h 3.7 V 15.946 H 459.9 v 1.168 h 3.7 v 9.796 m 6.647,0 h 1.334 v -8.947 l 2.896,8.946 h 1.486 l 3.018,-8.916 v 8.917 h 1.456 V 15.95 h -1.926 l -3.298,9.393 -2.813,-9.393 h -2.153 v 10.96"
style="fill:#646464"
id="path908" />
<path
transform="matrix(0.7341,0,0,0.8095,16.25,27.01)"
d="m 110.5,132.3 a 48.95,8.607 0 1 1 -97.9,0 48.95,8.607 0 1 1 97.9,0 z"
style="opacity:0.4438;fill:url(#vlpa)"
id="path910" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -0,0 +1,142 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="88"
height="31"
viewBox="0 0 88 31"
version="1.1"
id="svg8"
inkscape:version="1.0.2 (1.0.2+r75+1)"
sodipodi:docname="yaml.png.svg"
inkscape:export-filename="/project/terry/Dev/eclipse-workspace/LunaGen/src/lunagen/addons/softwarelist/skeleton/images/icons/yaml.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2">
<linearGradient
id="vlpc"
x1="151"
x2="112"
y1="192.4"
y2="137.3"
gradientTransform="matrix(0.5625,0,0,0.568,-9.4,-5.305)"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#ffd43b"
offset="0"
id="stop875" />
<stop
style="stop-color:#ffe873"
offset="1"
id="stop877" />
</linearGradient>
<linearGradient
id="vlpb"
x1="26.65"
x2="135.7"
y1="20.6"
y2="114.4"
gradientTransform="matrix(0.5625,0,0,0.568,-9.4,-5.305)"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#5a9fd4"
offset="0"
id="stop880" />
<stop
style="stop-color:#306998"
offset="1"
id="stop882" />
</linearGradient>
<radialGradient
id="vlpa"
cx="61.52"
cy="132.3"
r="29.04"
gradientTransform="matrix(2.383e-8,-0.2964,1.437,4.684e-7,-128.5,150.5)"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#b8b8b8;stop-opacity:.498"
offset="0"
id="stop885" />
<stop
style="stop-color:#7f7f7f;stop-opacity:0"
offset="1"
id="stop887" />
</radialGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#fff986"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="16.745574"
inkscape:cx="45.927489"
inkscape:cy="31.26044"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="true"
units="px"
inkscape:window-width="2760"
inkscape:window-height="1620"
inkscape:window-x="826"
inkscape:window-y="228"
inkscape:window-maximized="0">
<inkscape:grid
type="xygrid"
id="grid833"
originx="4"
originy="1"
spacingx="8"
spacingy="5" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g1739"
transform="matrix(0.26044222,0,0,0.26044222,2.4594659,1.1756779)">
<polygon
points="73,1 258,1 258,19 318,109 1,109 "
style="fill:#ffffff;stroke:#000000;stroke-width:1"
id="polygon1716" />
<polygon
points="25,109 1,109 37,55 1,1 25,1 49,37 73,1 97,1 "
style="fill:#000000;stroke:#000000;stroke-width:1"
id="polygon1718" />
<polygon
points="103,109 127,109 127,1 103,1 31,109 55,109 103,37 "
style="fill:#000000;stroke:#000000;stroke-width:1"
id="polygon1720" />
<polygon
points="156,1 132,1 132,109 156,109 156,37 180,73 204,37 204,109 228,109 228,1 198,1 180,37 "
style="fill:#000000;stroke:#000000;stroke-width:1"
id="polygon1722" />
<polygon
points="258,1 234,1 234,109 318,109 302,85 258,85 "
style="fill:#000000;stroke:#000000;stroke-width:1"
id="polygon1724" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="88"
height="31"
viewBox="0 0 88 31"
version="1.1"
id="svg8"
inkscape:version="1.0.2 (1.0.2+r75+1)"
sodipodi:docname="software_banner-88x31.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16.745574"
inkscape:cx="39.74974"
inkscape:cy="16.148352"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="true"
units="px"
inkscape:window-width="2880"
inkscape:window-height="1620"
inkscape:window-x="826"
inkscape:window-y="228"
inkscape:window-maximized="0">
<inkscape:grid
type="xygrid"
id="grid833"
originx="4"
originy="1"
spacingx="8"
spacingy="5" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,7 @@
{# Software List INCLUDE #}
<div id="software_icon_array" class="software_icon_array">
{%- for software in softwarelist %}
<a href="{{software.url}}" target="blank" rel="nofollow" ><img src="{{imgdir}}/icons/{{software.img}}" width="88" height="31" border="0"
alt="{{software.name}}" title="{{software.name}} - {{software.desc}}" /></a>
{%- endfor %}
</div><!--software_block-->

View File

@ -0,0 +1,139 @@
# Software list
---
softwarelist:
- name: Aegisub
desc: Subtitle editor
url: http://www.aegisub.org/
img: aegisub.png
- name: Ansible
desc: Provisioning automation system
url: https://www.ansible.com/
img: ansible.png
- name: Ardour
desc: Digital audio workstation
url: http://ardour.org/
img: ardour.png
- name: Audacity
desc: Audio recorder and editor
url: http://web.audacityteam.org/
img: audacity.png
- name: Brasero
desc: Optical disk burning utility
url: https://wiki.gnome.org/Apps/Brasero
img: brasero.png
- name: DVDStyler
desc: DVD mastering tool
url: https://www.dvdstyler.org/en/
img: dvdstyler.png
- name: GIMP
desc: Image Manipulation Package
url: http://www.gimp.org/
img: gimp.png
- name: Inkscape
desc: 2D vector graphic editing application
url: http://www.inkscape.org/
img: inkscape.png
- name: Kdenlive
desc: Non-linear video editor
url: http://kdenlive.org/
img: kdenlive.png
- name: Krita
desc: Digital painting application
url: http://www.krita.org/
img: krita.png
- name: LibreOffice
desc: Office Suite
url: https://www.libreoffice.org
img: libreoffice.png
- name: MediaWiki
desc: Collaborative document editing platform
url: http://mediawiki.org/
img: mediawiki.png
- name: Mumble
desc: VOIP teleconferencing package
url: https://wiki.mumble.info/
img: mumble.png
- name: MyPaint
desc: Digital painting application
url: http://mypaint.org/about/
img: mypaint.png
- name: OBS Studio
desc: Screencasting package
url: https://obsproject.com/
img: obs.png
- name: Papagayo-NG
desc: Lipsinc animation editor
url: https://morevnaproject.org/papagayo-ng/
img: papagayo-ng.png
- name: RapidSVN
desc: Subversion (version control) client
url: https://rapidsvn.org/
img: rapidsvn.png
- name: RenderChan
desc: Render management system
url: https://morevnaproject.org/renderchan
img: renderchan.png
- name: Resource Space
desc: Digital asset management system
url: https://www.resourcespace.com/
img: resourcespace.png
- name: Subversion
desc: Version control system
url: https://subversion.apache.org/
img: subversion.png
- name: Synfig
desc: 2D animation package
url: http://synfig.org/
img: synfig.png
- name: TACTIC
desc: Digital asset and project management system
url: https://southpawtech.com/tactic-open-source/
img: tactic.png
- name: Trac
desc: Version control web interface (for Subversion)
url: https://trac.edgewall.org/
img: trac.png
- name: Ubuntu Studio
desc: Multimedia distribution of GNU/Linux
url: https://ubuntustudio.org/
img: ubuntustudio.png
- name: VLC
desc: Media player
url: https://www.videolan.org/index.html
img: vlc.png
- name: Vokoscreen
desc: Screencasting software
url: http://linuxecke.volkoh.de/vokoscreen/vokoscreen.html
img: vokoscreen.png
- name: Wordpress
desc: Content management system
url: https://wordpress.org/
img: wordpress.png

View File

@ -0,0 +1,37 @@
'''
Created on Oct 27, 2021
@author: terry
'''
import os, random
import yaml
import lunagen.addon
class SoftwareList(lunagen.addon.LunaGenAddOn):
"""
Software List with Banners.
"""
name = 'softwarelist'
desc = """\
Display a set of selected software mini-banners.
"""
file = __file__
@staticmethod
def load(site):
if site.verbose: print("Loading software data.")
try:
with open(os.path.join(site.datadir, 'software.yaml')) as sw_file:
softwarelist = yaml.safe_load(sw_file)
# stylesheets = []
# if 'stylesheets' in site.sitedata:
# stylesheets.extend(site.sitedata['stylesheets'])
site.sitedata.update(softwarelist)
site.sitedata['stylesheets'] = site._collect_stylesheets(softwarelist)
except FileNotFoundError:
print("No software.yaml file, so software list is empty.")
site.sitedata['softwarelist'] = []

444
LunaGen/src/lunagen/main.py Normal file
View File

@ -0,0 +1,444 @@
'''
Created on Oct 23, 2021
@author: terry
'''
import os, random, importlib
#from shutil import copytree, rmtree
from distutils.dir_util import remove_tree, copy_tree
from collections import OrderedDict
import yaml
import jinja2
import lunagen.addon
print("Addon variable:")
print(repr(lunagen.addon))
def demo():
print("Am able to load and run code from 'lunagen' library.")
class Config(object):
"""
Installation configuration variables.
TODO: Probably change this to load from a YAML file in the future.
"""
__all__ = []
__version__ = 0.1
__date__ = '2019-09-19'
__updated__ = '2019-09-19'
DEBUG = True
TESTRUN = False
PROFILE = False
THEMES = '../themes'
class LunaGen(jinja2.Environment):
"""
Generator for a LunaGen site, based on contents of srcdir:
<srcdir>/data - YAML files (handwritten content)
<srcdir>/templates - Jinja2 site templates
<srcdir>/skeleton - unchanging parts of the site (copied)
The new site is created in <tgtdir>.
"""
def __init__(self, srcdir, tgtdir=None, verbosity=0, seed=None):
self.srcdir = os.path.abspath(srcdir)
if not tgtdir:
self.tgtdir = os.path.join(self.srcdir, 'site')
else:
self.tgtdir = os.path.abspath(tgtdir)
self.datadir = os.path.join(self.srcdir, 'data')
self.templates = os.path.join(self.srcdir, 'templates')
self.skeleton = os.path.join(self.srcdir, 'skeleton')
if verbosity:
self.verbose = verbosity
else:
self.verbose = 0
if seed is not None:
if self.verbose: print("Setting random number seed to %d", seed)
# Useful for testing
random.seed(seed)
if self.verbose:
print("Verbose mode %d" % self.verbose)
print("Source directory: %s" % self.srcdir)
print("Target directory: %s" % self.tgtdir)
print("YAML content should be in: %s" % self.datadir)
print("Jinja2 templates should be in: %s" % self.templates)
print("Skeleton website should be in: %s" % self.skeleton)
#TODO: Could make sure these directories exist
# Create the internal "queues" dictionary
self._queues = {}
# Load up the data from YAML files:
self._load_sitedata()
self._load_theme()
self.template_paths = [
self.templates, # Designer's own templates override all
self.theme['path'], # Theme templates
]
self.load_site_addons()
self.template_paths.append(
os.path.join(os.path.dirname(__file__), 'templates')
)
if self.verbose:
print("Template source paths:")
for template_path in self.template_paths:
print(" %s" % template_path)
print("\n")
# TODO: The following are the loaders we want to move into add-ons
#self._load_affiliates()
#self._load_softwarelist()
#self._load_products()
self._load_serieslist()
super().__init__(
loader=jinja2.ChoiceLoader(
[jinja2.FileSystemLoader(p) for p in self.template_paths]
),
autoescape=jinja2.select_autoescape(['html','xml'])
)
@staticmethod
def _paginate(seq, pagesize):
"""
Given a sequence of objects, break it into a book of
pages, each containing no more than pagesize objects:
>>> test = [1,'2','three', 4, 5, 'six', 'seven', 8, 9, True, False, None, 0]
>>> LunaGen._paginate(test, 4)
[[1, '2', 'three', 4], [5, 'six', 'seven', 8], [9, True, False, None], [0]]
>>>
"""
book = []
page = []
for i,ob in enumerate(seq):
if i%pagesize==0:
if i>0: book.append(page)
page = []
page.append(ob)
if len(page)>0:
book.append(page)
return book
@staticmethod
def _paginate_sponsors(series, episode):
"""
Regroup sponsors into pages which:
- Contain only one kind of sponsor
- Contain no more than the 'page' limit number of sponsors per page
- Are tagged with the sponsortype so we can find the right template for them:
>>> series = {'sponsortypes':
... {'A':{'page':1,'limit':1},
... 'B':{'page':3, 'limit':10},
... 'C':{'page':4, 'limit':20}}}
...
>>> episode = {'sponsors':
... {'A':list(range(2)),
... 'B':list(range(7)),
... 'C':list(range(22))}}
...
>>> LunaGen._paginate_sponsors(series, episode)
[('A', [0]), ('B', [0, 1, 2]), ('B', [3, 4, 5]), ('B', [6]), ('C', [0, 1, 2, 3]), ('C', [4, 5, 6, 7]), ('C', [8, 9, 10, 11]), ('C', [12, 13, 14, 15]), ('C', [16, 17, 18, 19])]
>>>
"""
paged_sponsors = []
for spkey, sponsortype in series['sponsortypes'].items():
if spkey not in episode['sponsors']:
episode['sponsors'][spkey] = []
#if 'excludes' in sponsortype:
# for excluded in sponsortype['excludes']:
# if excluded in episode['sponsors'] and episode['sponsors'][excluded]:
# print("WARNING: excluded sponsortype %s will be ignored, because of existing %s." %
# (excluded, spkey))
if 'page'in sponsortype:
paged = LunaGen._paginate(
episode['sponsors'][spkey][:sponsortype['limit']],
sponsortype['page'])
tags = [spkey] * len(paged)
paged_sponsors.extend(zip(tags, paged))
return paged_sponsors
@staticmethod
def _fix_series(series):
"""
Modify series data to correct certain datatypes that are not
natively supported by YAML (like OrderedDict):
>>> series = {'credits':{
... 'a':{'labels':'ordered'},
... 'b':{'labels':[['A','-A-'],['B','-B-']]}}}
...
>>> LunaGen._fix_series(series)
>>> series['credits']['b']['labels']
OrderedDict([('A', '-A-'), ('B', '-B-')])
>>>
"""
for key, credit in series['credits'].items():
if type(credit['labels']) != type(''):
credit['labels']=OrderedDict(credit['labels'])
def _collect_stylesheets(self, *extras):
"""
Collect a list of unique stylesheets from various stylesheet
requirements from theme, site, and data from extra pages.
"""
stylesheets = []
if 'stylesheets' in self.theme:
stylesheets.extend(self.theme['stylesheets'])
if 'stylesheets' in self.sitedata:
stylesheets.extend(self.sitedata['stylesheets'])
for extra in extras:
if 'stylesheets' in extra:
stylesheets.extend(extra['stylesheets'])
stylesheets = [s for i,s in enumerate(stylesheets) if s not in stylesheets[:i]]
return stylesheets
def _load_sitedata(self):
if self.verbose: print("Loading global site data.")
with open(os.path.join(self.datadir, 'site.yaml'), 'rt') as sitedatafile:
self.sitedata = yaml.safe_load(sitedatafile)
def _load_theme(self):
if self.verbose: print("Loading theme data.")
self.theme = { 'stylesheets':[] } # Default values
themedir = os.path.join(Config.THEMES, self.sitedata['theme'])
if not os.path.exists(themedir):
raise FileNotFoundError("Theme directory %s not found!" % themedir)
with open(os.path.join(themedir, 'theme.yaml'), 'rt') as themedatafile:
self.theme.update(yaml.safe_load(themedatafile))
self.theme['path'] = themedir
def load_site_addons(self):
"""
Load the addons listed in the site.yaml file, in
the order specified.
"""
self.addons = []
if 'addons' in self.sitedata and self.sitedata['addons']:
for addon_name in self.sitedata['addons']:
# Import the add-on module
if self.verbose: print("Add-on to load: %s" % addon_name)
addon_mod = importlib.import_module(
'.' + '.'.join(('addons', addon_name, addon_name)),
package='lunagen')
# Register location for templates:
self.template_paths.append(os.path.join(os.path.dirname(__file__),
'addons', addon_name))
# Find, instantiate, register, and initialize addon classes
for name in addon_mod.__dict__:
ob = addon_mod.__dict__[name]
if (isinstance(ob, type) and
issubclass(ob, lunagen.addon.LunaGenAddOn) and
ob.name in self.sitedata['addons']):
self.addons.append(ob())
for ob in self.addons:
ob.load(self)
ob.render(self)
if self.verbose:
for addon in self.addons:
print ("Add-on '%s' data loaded and rendered." % addon.name)
def _load_serieslist(self):
if self.verbose: print("Loading series data")
try:
with open(os.path.join(self.datadir, 'episodes', 'series.yaml'),'rt') as seriesfile:
self.serieslist = yaml.safe_load(seriesfile)['serieslist']
#
print("serieslist: ", self.serieslist)
#
for series in self.serieslist:
self._fix_series(series)
episodes = []
seriesdir = os.path.join(self.datadir, 'episodes', series['directory'])
episode_filenames = [f for f in os.listdir(seriesdir) if f.endswith('.yaml')]
for episode_filename in episode_filenames:
if self.verbose: print("Loading episode from %s" % episode_filename)
with open(os.path.join(seriesdir, episode_filename), 'rt') as episode_file:
episodes.append(yaml.safe_load(episode_file))
# Sort by episode number specified in the files:
try:
episodes.sort(key=lambda a: int(a['episode']))
except KeyError:
print("Some episode YAML files may not have an 'episode' number entry?")
series['episodes'] = episodes
except FileNotFoundError:
print("No series.yaml file, so no series loaded.")
#self.sitedata['serieslist'] = []
self.serieslist = []
def _copy_skeleton(self, skeleton=None):
if not skeleton:
skeleton = self.skeleton
if os.path.exists(self.tgtdir):
remove_tree(self.tgtdir, verbose=self.verbose)
if self.verbose: print("Copying source skeleton.")
copy_tree(os.path.join(self.srcdir, 'skeleton'), self.tgtdir, verbose=self.verbose)
if self.verbose: print("Copying add-on skeletons.")
for ao in self.addons:
ao.copy_skeleton(self)
if self.verbose: print("Copying the theme skeleton.")
copy_tree(os.path.join(self.theme['path'], 'skeleton'), self.tgtdir, verbose=self.verbose)
if self.verbose: print("Copying the skeleton site.")
copy_tree(skeleton, self.tgtdir, verbose=self.verbose)
if self.verbose: print("Copying add-on skeletons.")
def _gen_simple_page(self, pagename, stylesheets=()):
"""
Generates a simple page with 1:1:1 Jinja2+YAML+CSS.
The YAML and CSS pages are optional. If no file exists
for them, they will be ignored and the page generated
with only the template and global data and/or style.
"""
if self.verbose: print("Creating '%s' page" % pagename)
jinja2_name = pagename + '.j2'
yaml_path = os.path.join(self.datadir, pagename+'.yaml')
css_path = os.path.join(self.tgtdir, pagename+'.css')
# Assumes skeleton already copied
data = {} # Defaults can be set here
data.update(self.sitedata) # Global data
if os.path.exists(yaml_path):
with open(yaml_path, 'rt') as yaml_file:
data.update(yaml.safe_load(yaml_file)) # Page data
data['stylesheets'] = self._collect_stylesheets(data)
# Add CSS if not already present:
if os.path.exists(css_path) and pagename not in data['stylesheets']:
data['stylesheets'].append(pagename)
if self.verbose: print("Generating '%s.html' from template." % pagename)
html = self.get_template(jinja2_name).render(data)
with open(os.path.join(self.tgtdir, pagename+'.html'), 'wt') as page:
page.write(html)
def _gen_index(self):
"""
Generate an index page, if the skeleton doesn't already have one.
"""
if not os.path.exists(os.path.join(self.tgtdir, 'index.html')):
if self.verbose: print("Generating the Index page.")
#
if 'affiliates' in self.sitedata:
print("affiliates = %s" % repr(self.sitedata['affiliates']))
else:
print("No 'affiliates' value in sitedata.")
#
data = {}
data.update(self.sitedata)
data['next'] = next # Adds iterator capability
data['stylesheets'] = self._collect_stylesheets() #self.sitedata['stylesheets'])
if 'episode_as_index' in self.sitedata and self.sitedata['episode_as_index']:
data['serieslist'] = self.serieslist
data['banners'] = iter(['affiliates_banner.j2',
'store_banner.j2',
'sponsoropps_banner.j2'])
data['stylesheets'].extend(self._collect_stylesheets(
self.sitedata['episode_list_page']))
html = self.get_template('index.j2').render(data)
with open(os.path.join(self.tgtdir, 'index.html'), 'wt') as page:
page.write(html)
else:
if self.verbose: print("Found 'index.html', so not generated.")
def _gen_episode_list_page(self):
"""
Generate a page linking to all of the individual episodes,
grouped into "series" (or "seasons").
#Currently hard-coded to be saved as 'index.html' for the site.
"""
if self.verbose: print("Generating the Index (Episode List) page.")
if 'render_as' in self.sitedata['episode_list_page']:
render_as = self.sitedata['episode_list_page']['render_as']
else:
render_as = 'index.html'
data = {}
data.update(self.sitedata)
data['serieslist'] = self.serieslist
data['banners'] = iter(['affiliates_banner.j2', 'store_banner.j2', 'sponsoropps_banner.j2'])
data['stylesheets'] = self._collect_stylesheets(self.sitedata['episode_list_page'])
data['next'] = next # Adds iterator capability
html = self.get_template('episode_list.j2').render(data)
with open(os.path.join(self.tgtdir, render_as), 'wt') as page:
page.write(html)
def _gen_episode_pages(self):
"""
Generate a page for each episode in each series.
"""
if self.verbose: print("Generating episode pages...")
if 'stylesheets' in self.sitedata['episode_pages']:
stylesheets = self.sitedata['episode_pages']['stylesheets']
else:
stylesheets = []
for series in self.serieslist:
for episode in series['episodes']:
paged_sponsors = self._paginate_sponsors(series, episode)
episode['paged_sponsors'] = iter(paged_sponsors)
data = {}
data.update(self.sitedata)
data['series'] = series
data['episode'] = episode
data['stylesheets'] = self._collect_stylesheets(self.sitedata['episode_pages'],episode)
data['next'] = next # Expose built-in function
data['banners'] = ['affiliates_banner.j2']
html = self.get_template('episode_page.j2').render(data)
filename = episode['series'] +'E' + ('%2.2d' % int(episode['episode'])) + '.html'
os.makedirs(os.path.join(self.tgtdir, series['directory']), exist_ok=True)
with open(os.path.join(self.tgtdir, series['directory'], filename), 'wt') as page:
page.write(html)
def gensite(self):
"""
Generate the site, using the data we've accumulated.
"""
self._copy_skeleton()
self.regen_site()
def regen_site(self):
if 'simple_pages' in self.sitedata and self.sitedata['simple_pages']:
for page in self.sitedata['simple_pages']:
self._gen_simple_page(page)
#if 'serieslist' in self.sitedata and self.sitedata['serieslist']:
if self.serieslist:
self._gen_episode_list_page()
self._gen_episode_pages()
else:
print("Not generating series & episode pages: serieslist empty.")
self._gen_index()
if __name__ == '__main__':
pass

235
LunaGen/src/skeleton/w3.css Normal file
View File

@ -0,0 +1,235 @@
/* W3.CSS 4.15 December 2020 by Jan Egil and Borge Refsnes */
html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}
/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */
html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}
article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item}
audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline}
audio:not([controls]){display:none;height:0}[hidden],template{display:none}
a{background-color:transparent}a:active,a:hover{outline-width:0}
abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}
b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000}
small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}
code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible}
button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold}
button,input{overflow:visible}button,select{text-transform:none}
button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}
button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}
button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}
fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}
legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}
[type=checkbox],[type=radio]{padding:0}
[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}
[type=search]{-webkit-appearance:textfield;outline-offset:-2px}
[type=search]::-webkit-search-decoration{-webkit-appearance:none}
::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}
/* End extract */
html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden}
h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}
.w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace}
h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px}
hr{border:0;border-top:1px solid #eee;margin:20px 0}
.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit}
.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc}
.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1}
.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1}
.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center}
.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top}
.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px}
.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap}
.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}
.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none}
.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none}
.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%}
.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none}
.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block}
.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s}
.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%}
.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc}
.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer}
.w3-dropdown-hover:hover .w3-dropdown-content{display:block}
.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000}
.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000}
.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1}
.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px}
.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto}
.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%}
.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%}
.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px}
.w3-main,#main{transition:margin-left .4s}
.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)}
.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px}
.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto}
.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0}
.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left}
.w3-bar .w3-button{white-space:normal}
.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0}
.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%}
.w3-responsive{display:block;overflow-x:auto}
.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before,
.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both}
.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%}
.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%}
.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%}
.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%}
@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%}
.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%}
.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}}
@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%}
.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%}
.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}}
.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px}
.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px}
.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell}
.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom}
.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important}
@media (max-width:1205px){.w3-auto{max-width:95%}}
@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px}
.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative}
.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center}
.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}}
@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}}
@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}}
@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}}
@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}}
.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0}
.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2}
.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0}
.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0}
.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}
.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)}
.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)}
.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none}
.w3-display-position{position:absolute}
.w3-circle{border-radius:50%}
.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px}
.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px}
.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px}
.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px}
.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word}
.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%}
.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)}
.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)}
.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}
.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}}
.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}}
.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}}
.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}}
.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}}
.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}}
.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}}
.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important}
.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1}
.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75}
.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)}
.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)}
.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)}
.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important}
.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important}
.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important}
.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important}
.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important}
.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important}
.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important}
.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important}
.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important}
.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important}
.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important}
.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important}
.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important}
.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important}
.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important}
.w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important}
.w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important}
.w3-left{float:left!important}.w3-right{float:right!important}
.w3-button:hover{color:#000!important;background-color:#ccc!important}
.w3-transparent,.w3-hover-none:hover{background-color:transparent!important}
.w3-hover-none:hover{box-shadow:none!important}
/* Colors */
.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important}
.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important}
.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important}
.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important}
.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important}
.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important}
.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important}
.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important}
.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important}
.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important}
.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important}
.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important}
.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important}
.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important}
.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important}
.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important}
.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important}
.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important}
.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important}
.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important}
.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important}
.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important}
.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important}
.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important}
.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important}
.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important}
.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important}
.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important}
.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important}
.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important}
.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important}
.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important}
.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important}
.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important}
.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important}
.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important}
.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important}
.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important}
.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important}
.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important}
.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important}
.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important}
.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important}
.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important}
.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important}
.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important}
.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important}
.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important}
.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important}
.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important}
.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important}
.w3-text-white,.w3-hover-text-white:hover{color:#fff!important}
.w3-text-black,.w3-hover-text-black:hover{color:#000!important}
.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important}
.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important}
.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important}
.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important}
.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important}
.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important}
.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important}
.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important}
.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important}
.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important}
.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important}
.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important}
.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important}
.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important}
.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important}
.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important}
.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important}
.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important}
.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important}
.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important}
.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important}
.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important}
.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important}
.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important}
.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important}
.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important}
.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important}
.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important}
.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important}
.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important}
.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important}

View File

@ -0,0 +1,142 @@
# Affiliates Ad data
# This is a MOCK-UP, using popular Free Culture / Open Source projects
# We do not have any actual affiliation with these sites
#
---
stylesheets:
- affiliates
# It's awkward to have too many affiliate links at one time, so
# the script will choose a number of them at random on each refresh
# we need to tell it how many we want:
affiliates_at_once: 7
affiliates_message: >
We benefit when you support these projects and services!
affiliates:
- name: Ardour
url: https://ardour.org
img: ardour.png
type: Software We Use
- name: Audacity
url: https://audacityteam.org
img: audacity.png
type: Software We Use
- name: Blender
url: https://blender.org
img: blender.png
type: Software We Use
- name: BlendSwap
url: https://blendswap.com
img: blendswap.png
type: Shared Asset Archive
- name: Creative Commons
url: https://www.creativecommons.org
img: creativecommons.png
type: Free Culture Advocacy Group
- name: Debian
url: https://debian.org
img: debian.png
type: Software We Use
- name: Ethic Cinema
url: http://ethiccinema.org
img: ethiccinema.png
type: Free Culture Advocacy Group
- name: Free Software Foundation
url: https://www.fsf.org
img: freesoftwarefoundation.png
type: Free Software Advocacy Group
- name: Free Sound
url: https://freesound.org
img: freesound.png
type: Shared Asset Archive
- name: GIMP
url: https://gimp.org
img: gimp.png
type: Software We Use
- name: Inkscape
url: https://inkscape.org
img: inkscape.png
type: Software We Use
- name: Internet Archive
url: https://archive.org
img: internet_archive.png
type: Shared Asset Archive
- name: Jamendo
url: https://jamendo.com
img: jamendo.png
type: Shared Asset Archive
- name: Kdenlive
url: https://kdenlive.org
img: kdenlive.png
type: Software We Use
- name: Krita
url: https://krita.org
img: krita.png
type: Software We Use
- name: Mastodon
url: http://mastodon.social
img: mastodon.png
type: Social Media Platform We Use
- name: Morevna Project
url: https://morevnaproject.org
img: morevnaproject.png
type: Free Culture Project
- name: MusOpen
url: https://musopen.org
img: musopen.png
type: Shared Asset Archive
- name: Olive Video Editor
url: https://olivevideoeditor.org
img: olivevideoeditor.png
type: Software We Use
- name: Public Domain Files
url: http://www.publicdomainfiles.com
img: publicdomainfiles.png
type: Shared Asset Archive
- name: Public Knowledge
url: https://publicknowledge.org
img: publicknowledge.png
type: Free Culture Advocacy Group
- name: Question Copyright
url: https://questioncopyright.org
img: questioncopyright.png
type: Free Culture Advocacy Group
- name: Software Freedom Conservancy
url: https://sfconservancy.org
img: sfconservancy.png
type: Free Software Advocacy Group
- name: Ubuntu Studio
url: https://ubuntustudio.org
img: ubuntu_studio.png
type: Software We Use
- name: Urchn
url: https://urchn.org
img: urchn.png
type: Free Culture Studio

View File

@ -0,0 +1,13 @@
# Global data for the site
# ALL templates will have access to these
---
sitename: affiliates
sitetitle: Affiliates Banner Example
imgdir: images
theme: default
stylesheets:
- affiliates
addons:
- affiliates

Some files were not shown because too many files have changed in this diff Show More