User:Tamas Bates/NetProto: Difference between revisions

From XPUB & Lens-Based wiki
No edit summary
No edit summary
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
=== RSS Feed plugin for Inkscape ===
__NOINDEX__
http://pzwart3.wdka.hro.nl/mediawiki/images/9/9a/RssFeedImporter.zip
[[/RSSInkscape | RSS Feed Plugin for Inkscape]]


A small plugin for Inkscape which will download and insert the content from an RSS feed into your SVG file. Supports some basic options to allow a user to customize the content pulled from the feed, determine whether entries should be added to their own layer groups and can attach the feed's content to a path selected by the user. Requires [http://code.google.com/p/feedparser/ FeedParser].
[[/PyAudio | Audio generation with Python]]


To install: extract the contents of the zip into Inkscape's /share/extensions directory.
[[/WebGL | WebGL Experiments]]
 
===== To-Do: =====
* Better error handling and friendly error messages
* More formatting and layout options (maybe some simple template support?)
 
<source lang="python">
#!/usr/bin/env python
 
import sys, os
if os.path.exists('/usr/share/inkscape/extensions'):
    sys.path.append('/usr/share/inkscape/extensions') # or another path, as necessary
from simplestyle import *
import random, math, uuid
import inkex
import feedparser
 
lineSpacing = 20 # default distance between subsequent lines of text
 
# attaches the given text element on the given path
def putTextOnPath(text, path):
    pathID = path.attrib['id']
    textPath = inkex.etree.SubElement(text, 'textPath')
    textPath.set(inkex.addNS('href', 'xlink'), '#%s' % (pathID))
    textSpan = inkex.etree.SubElement(textPath, 'tspan')
    textSpan.text = text.text
    text.text = ''
 
class RssFeedReaderEffect(inkex.Effect):
    def __init__(self):
        inkex.Effect.__init__(self)
        self.OptionParser.add_option("--tab", action="store", type="string",
            dest="tab", default="object")
        self.OptionParser.add_option('-u', '--url', action='store', type='string',
            dest='url', default='', help='You must specify a feed URL to pull from!')
        self.OptionParser.add_option('-n', '--nentries', action='store', type='int',
            dest='maxEntries', default=10)
        self.OptionParser.add_option('-t', '--printtitle', action='store', default='true')
        self.OptionParser.add_option('-a', '--printauthor', action='store', default='true')
        self.OptionParser.add_option('-d', '--printdesc', action='store', default='true')
        self.OptionParser.add_option('-l', '--printlink', action='store', default='true')
        self.OptionParser.add_option('-p', '--putonselection', action='store',
            default='false')
        self.OptionParser.add_option('-s', '--separateentries', action='store',
            default='true')
 
    # appends the list of text elements in text to the given layer, ensuring all text is added below top
    def addTextToLayerAt(self, text, layer, top, selection):
        for t in text:
            t.set('x', str(0))
            t.set('y', str(top))
            layer.append(t)
            if selection is not None:
                putTextOnPath(t, selection)
            top = top + lineSpacing # need to adjust by height of previous element to account for varying font sizes...
        return top
       
    def effect(self):
        feedUrl = self.options.url
        maxEntries = self.options.maxEntries
        printTitle = self.options.printtitle
        printAuthor = self.options.printauthor
        printDesc = self.options.printdesc
        printLink = self.options.printlink
        putOnSelection = True if self.options.putonselection and len(self.selected) == 1 else False
        selection = self.selected.popitem()[1] if putOnSelection else None
        separateEntries = self.options.separateentries # if true, creates new layer for each entry
       
 
        content = feedparser.parse(feedUrl)       
        svg = self.document.getroot()
        width = inkex.unittouu(svg.get('width'))
        height = inkex.unittouu(svg.get('height'))
 
        if separateEntries == 'false': # create a layer to hold all entries
            layer = inkex.etree.SubElement(svg, 'g')
            layer.set(inkex.addNS('label', 'inkscape'), 'Feed Entries')
            layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')
 
        top = 0
        for i in range(0, maxEntries if len(content.entries) > maxEntries else len(content.entries)):
            output = []
            if separateEntries == 'true': # create a new layer for each entry
                layer = inkex.etree.SubElement(svg, 'g')
                layer.set(inkex.addNS('label', 'inkscape'), '%s' % (content.entries[i].title))
                layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')
                top = 0
           
            if printTitle == 'true':
                titleText = inkex.etree.Element(inkex.addNS('text', 'svg'))
                titleText.set(inkex.addNS('label', 'inkscape'), 'Title')
                titleText.text = '%s' % (content.entries[i].title)
                output.append(titleText)
            if printAuthor == 'true':
                authorText = inkex.etree.Element(inkex.addNS('text', 'svg'))
                authorText.set(inkex.addNS('label', 'inkscape'), 'Author')
                authorText.text = '%s' % (content.entries[i].author)
                output.append(authorText)
            if printDesc == 'true':
                descText = inkex.etree.Element(inkex.addNS('text', 'svg'))
                descText.set(inkex.addNS('label', 'inkscape'), 'Description')
                descText.text = '%s' % (content.entries[i].description)
                output.append(descText)
            if printLink == 'true':
                linkText = inkex.etree.Element(inkex.addNS('text', 'svg'))
                linkText.set(inkex.addNS('label', 'inkscape'), 'Link')
                linkText.text = '%s' % (content.entries[i].link)
                output.append(linkText)
       
            top = self.addTextToLayerAt(output, layer, top, selection)
       
        #urltext = inkex.etree.Element(inkex.addNS('text', 'svg'))
        #urltext.text = '%s' % (content.feed.link)
       
        #urltext.set('x', str(width / 2))
        #urltext.set('y', str(height / 2))
 
       
 
        #layer.append(urltext)
 
       
 
effect = RssFeedReaderEffect()
effect.affect()
</source>

Latest revision as of 14:15, 2 February 2014