Git Product home page Git Product logo

app-rss's Introduction

RSS app

Beta software!

This Enonic XP application adds RSS capabilities to your Enonic XP site. With it you can create RSS feeds (as content) and map them to any Content Type (so you can have multiple feeds).

The App adds:

  • one content type (RSS-feed)
  • one page controller (creates the XML)
  • a filter to insert RSS meta data
  • page template must be created manually after installation!

Installation

Head to the Enonic Market and read all about how to install this app. You have multiple choices.

How to use this app

After installing the app on your XP server, this is how you set it up to use it.

  1. Add App to any site
  2. Create a new Page Template in Content Studio
  3. Select RSS page controller for the new template
  4. Select "RSS feed" content type in "Supports" field for the new template
  5. Create a new content of type "RSS Feed"
  6. Configure this content to map the content type you want to fetch
  7. Done

Page Template

First you must create a Page Template supporting the new RSS content type and use the bundled page controller "RSS Page". After that you're good to go. Time to create our first feed!

Feed configuration - Important!

Configuring this app is somewhat tricky the first time as it is powerful and dynamic enough to let you list any type of content inside your RSS-feeds. But read this carefully when setting up your first RSS.

Content type

Select from the list of all content types which one to use in this feed. We cannot filter this list so it shows every installed content type for all sites and apps.

Paths

Add any path you want to specifically include (omit all the rest) or exclude. The paths are automatically prepended with the base path for the current site, with any child of it also included/excluded automatically. The search string in the back is built up like this: $site/[YOUR_SETTING]/*

Just use the "Add" button to create multiple paths to include/exclude.

Fields

To make this all work you must map any fields from the content type you want a feed for. We need you to map the fields for title, description, publish date, and body. Version 0.10 of this app doesn't output body.

We use a waterfall technique on fields to use so that if you use the most common field names in your content type then you don't need to set anything up. These are the automatic mappings, from left to right, that the app automatically checks for. If not in this list, add it as a string (like data.name or data['publish-date']) to map to your fields (it maps to the results.hits[i] json path from a query-search).

Title: [Your setting], data.title, displayName
Thumbnail: [Your setting], data.thumbnail, data.picture, data.photo
Description/excerpt: [Your setting], data.preface, data.description, data.summary
Author: [Your setting], data.author, content creator displayName
Categories: [Your setting], data.category, data.categories, data.tags
Publish date: [Your setting], data.publishDate, createdTime
Timezone: [Your setting], Etc/UTC
Full body: BETA - not used!

  • Remember to start with data. when mapping custom fields from your content type.
  • If your field name contains special characters, like -, then wrap the name correctly: data['My-super-field!']

Author and category mapping is "smart". It will handle mapped fields just containing strings (as-is), but it will also handle related content (extracting their displayName value). In addition, the author data will handle being sent a specific user (like with the content creator data) if the format is something like user:system:su and then extract that user's name.

Disclaimer

App is still in BETA! It works, but some much needed features are needed, as well as increased usability, more testing, and minor issues needs fixing. Use it in production at your own risk.

Known issues

  • RSS feed's settings for RSS "SY" is not used.
  • App's default settings for RSS "SY" is not used.
  • "Full body" setting is not used, nor displayed in RSS feeds.
  • If no description found for feed item, it will be empty.
  • Setting for TimeZone on each RSS content is temporary, it will be removed/replaced.

Releases and Compatibility

Version XP version
1.0.x 7.0.0
0.13.x 6.13.1
0.12.0 6.9.3 - 6.12
0.11.0 6.9.3
0.10.2 6.7.3
0.10.1 6.5.0
0.10.0 6.5.0
0.9.0 6.5.0

Changelog

Version 1.0.0

  • Upgrade to XP7

Version 0.13.1

  • Upgrade dependencies with XSLT library to output error descriptions.

Version 0.13.0

  • Upgrade to XP 6.13.
  • Upgrade to Gradle 4.
  • Styling improvements to invalid content-view.

Version 0.12.5

  • Fixed bug with unsafe use of data on owner (used as fallback in 0.12.x when no author field defined). If you had deleted a user that owned a content, and used this fallback, the RSS feed would crash.

Version 0.12.4

  • Don't use 0.12.0, 0.12.1, 0.12.2, or 0.12.3!
  • Fix for date format, was not valid RSS on the timezone part
  • Improved code for date and time handling

Version 0.12.0

  • Added support to timezone (using moment.js). For a complete list of time zones that can be used, see: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  • Added support for author mapping
  • Added support for category mapping
  • Added support for controlling number of feed items to generate
  • Proper handling of RSS feed title (from content title)
  • Critical: Fixed a bug that breaks the RSS feed if the Published Date property is a DateTime with timezone
  • Fix so that controller does not run if content is not a RSS Page (avoids crash)
  • Upgrade to Gradle 3.4
  • Breaking change: removed the field "title" from RSS content type (using displayName instead).
  • Future breaking change: added a quickfix setting for TimeZone selection on RSS content. This will be removed in next release as there are better ways to solve this.

Version 0.11.0

  • Added support for displaying images for each feed item
  • Refactor XML rendering code to more efficient
  • Multiple minor fixes/adjustments/cleanups/speedups/refactoring
  • Upgrade XP required version to 6.9
  • Breaking change: now using the built-in setting from XP for "publish date" in RSS feed. If you still depend on old custom fields you must revise your app settings for this field.

Version 0.10.2

  • Upgrade to 6.7.3
  • Escape title output in XML

Version 0.10.1

  • Finish readme (config instructions)
  • Simplify content type
  • Launch beta

Version 0.10.0

  • Add correct meta tags to all page headers (html head) for each RSS feed on current site
  • Ability to add include-paths in settings of each RSS to filter search even further

Version 0.9.0

App works, but work in progress. Missing some tweaks and minor functionality, and documentation.

app-rss's People

Contributors

alansemenov avatar anatol-sialitski avatar ashklianko avatar bellfalasch avatar dependabot[bot] avatar github-actions[bot] avatar lucasilgo avatar pvmerlo avatar reisfmb avatar robert-larsen avatar rymsha avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

app-rss's Issues

Implement SY Update period/frequency

Actually use the fields/settings for update period and frequency. With override support from the app itself.

SY Update period
SY Update frequency

Setting for including full content in feed yes/no

Setting to turn off the inclusion of full body in RSS feed. Just an excerpt will be used.

Note: In the beta, only excerpt is added as a standard, no body/full text is added at all. We should add the full body, but a setting is needed to actually insert it (per rss content). Default value: false.

Timezone and datetime handling in general is bad

Timezone handling and settings, reading from content, and output in RSS feed, is handled poorly in this app. This needs much more thinking and testing. It works now, but it is only tested on very few different scenarios, and it is all quick fixes.

Option to turn off injection of feed meta data in html head

Some might want to turn off the filter that adds RSS meta tags in the head of each page. Perhaps per app and per RSS.

Per app: default on
Per rss (content): default on

If app says "off" and content says "on", the result for this should be "on". The feed will be added to head.
If app says "on" and content says "off", the result for that feed is "off". It will not be added to head.

As a side-note, make sure when adding multiple RSS feeds that all of them are actually added to head and not just one of them.

Support author tag in RSS

Needs mapping to find where name of author is stored ... not very simple probably. But the RSS tags are there if we want to use them.

Support for feed icon

Ability to upload image to use (or use default set on app) for a website's RSS feeds. Add in RSS xml output.

  • Find out the format of such an icon.
  • Idea: To ease config, can we use any favicon or touch icon already added to site?
  • If we must then add setting to app site.xml for this icon.

Don't run controller code when viewing template directly in Content Studio

Code will crash when running the controller without any content specifications. Simple to safe guard and check before running. Make sure we don't crash things. Rather show some instructions here? Like "Go and create a new content of type RSS on your site and configure it, resort to our readme/docs for help".

Update lib-xslt

new lib-xslt is updated to the latest Saxon library.
Helps to improve stability

Appen fungerer ikke i 6.15.5

Enonic version: 6.15.5

Jeg legger til RSS-appen fra Enonic Market og følger instruksjonene, men får bare feilmeldinger i loggen:

java.lang.RuntimeException: javax.xml.transform.TransformerConfigurationException: Failed to compile stylesheet. 1 error detected.
at com.google.common.base.Throwables.propagate(Throwables.java:160)
at com.enonic.lib.xslt.XsltProcessor.handleError(XsltProcessor.java:114)
at com.enonic.lib.xslt.XsltProcessor.handleError(XsltProcessor.java:88)
at com.enonic.lib.xslt.XsltProcessor.process(XsltProcessor.java:80)
at jdk.nashorn.internal.scripts.Script$Recompilation$418$596AA$xslt.L:1#render(com.enonic.app.rss:/lib/xslt.js:25)
at jdk.nashorn.internal.scripts.Script$Recompilation$304$2092A$rss.L:1#get(com.enonic.app.rss:/site/pages/rss/rss.js:275)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:639)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
at jdk.nashorn.api.scripting.ScriptObjectMirror.call(ScriptObjectMirror.java:117)
at com.enonic.xp.script.impl.value.FunctionScriptValue.call(FunctionScriptValue.java:36)
at com.enonic.xp.script.impl.executor.ScriptExportsImpl.executeMethod(ScriptExportsImpl.java:56)
at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.doExecute(ControllerScriptImpl.java:71)
at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.lambda$execute$0(ControllerScriptImpl.java:36)
at com.enonic.xp.trace.Tracer.traceEx(Tracer.java:72)
at com.enonic.xp.trace.Tracer.trace(Tracer.java:51)
at com.enonic.xp.trace.Tracer.trace(Tracer.java:98)
at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.execute(ControllerScriptImpl.java:36)
at com.enonic.xp.portal.impl.rendering.PageRenderer.doRender(PageRenderer.java:48)
at com.enonic.xp.portal.impl.rendering.PageRenderer.doRender(PageRenderer.java:27)
at com.enonic.xp.portal.impl.rendering.PostProcessingRenderer.render(PostProcessingRenderer.java:25)
at com.enonic.xp.portal.impl.handler.render.PageHandlerWorker.execute(PageHandlerWorker.java:128)
at com.enonic.xp.portal.impl.handler.render.PageHandler.doHandle(PageHandler.java:62)
at com.enonic.xp.portal.impl.handler.render.PageHandler.doHandle(PageHandler.java:22)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:66)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.portal.handler.BasePortalHandler.doHandle(BasePortalHandler.java:48)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:66)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.impl.trace.TraceWebFilter.doHandle(TraceWebFilter.java:38)
at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:66)
at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
at com.enonic.xp.web.impl.handler.WebDispatcherImpl.dispatch(WebDispatcherImpl.java:50)
at com.enonic.xp.web.impl.handler.WebDispatcherServlet.doHandle(WebDispatcherServlet.java:135)
at com.enonic.xp.web.impl.handler.WebDispatcherServlet.service(WebDispatcherServlet.java:63)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at com.enonic.xp.web.impl.dispatch.mapping.ServletDefinitionImpl.service(ServletDefinitionImpl.java:39)
at com.enonic.xp.web.impl.dispatch.pipeline.ServletPipelineImpl.service(ServletPipelineImpl.java:30)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:45)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
at com.enonic.xp.portal.impl.auth.AuthFilter.doHandle(AuthFilter.java:45)
at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:40)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
at com.enonic.xp.web.impl.auth.BasicAuthFilter.doHandle(BasicAuthFilter.java:33)
at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:40)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
at com.enonic.xp.web.impl.context.ContextFilter.lambda$doHandle$0(ContextFilter.java:33)
at com.enonic.xp.context.ContextImpl.callWith(ContextImpl.java:101)
at com.enonic.xp.web.impl.context.ContextFilter.doHandle(ContextFilter.java:32)
at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:40)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:26)
at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:40)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
at com.enonic.xp.web.impl.dos.DosFilterWrapper.doFilter(DosFilterWrapper.java:64)
at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:40)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterPipelineImpl.filter(FilterPipelineImpl.java:29)
at com.enonic.xp.web.impl.dispatch.DispatchServletImpl.service(DispatchServletImpl.java:35)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:860)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:535)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:420)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:203)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:73)
at com.enonic.xp.web.vhost.impl.VirtualHostFilter.doHandle(VirtualHostFilter.java:50)
at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:40)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
at com.enonic.xp.web.impl.dos.DosFilterWrapper.doFilter(DosFilterWrapper.java:64)
at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:40)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
at com.enonic.xp.web.impl.dispatch.pipeline.FilterPipelineImpl.filter(FilterPipelineImpl.java:29)
at com.enonic.xp.web.impl.dispatch.DispatchServletImpl.service(DispatchServletImpl.java:35)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:860)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:535)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:527)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler.java:240)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:530)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:347)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:256)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:247)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:140)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:382)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626)
at java.lang.Thread.run(Thread.java:748)
Caused by: javax.xml.transform.TransformerConfigurationException: Failed to compile stylesheet. 1 error detected.
at net.sf.saxon.PreparedStylesheet.prepare(PreparedStylesheet.java:249)
at net.sf.saxon.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:142)
at net.sf.saxon.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:97)
at com.enonic.lib.xslt.XsltProcessor.createTransformer(XsltProcessor.java:153)
at com.enonic.lib.xslt.XsltProcessor.doProcess(XsltProcessor.java:132)
at com.enonic.lib.xslt.XsltProcessor.process(XsltProcessor.java:71)
... 153 more

ContentSelector for selecting paths to include/exclude

Upgrade the way we include/exclude paths from RSS feeds. It's now done with normal strings in TextLine fields, needs to be done with ContentSelectors instead so that the user can navigate/search for branches in their content instead. Way easier to use.

Should also use occurances for adding more branches to add/subtract.

Multiple "Paths to include" values

It seems like "Paths to include" attribute does not handle more than one value. It is a multi field, but if I add more than 1 value the feed becomes empty.

Setting for "injecting" promo-text in all RSS content

RSS feeds are sometimes read by external sites where they use the content as-is. This is not good for the actual content producer unless they can get links back. Other vendors solve this by appending a text at the end of the text (description or full text).

  • HtmlArea on site.xml with possibility to overwrite it per each rss content.
  • This field can contain texts like "This post appeared first on [link:webagility.com]".
  • Default can be that specific text just mentioned, but dynamic site URL ofc.
  • Default setting is to not activate this feature (use option-set).

Use controller mapping to make template setup obsolete

We now need to create a template manually mapping to a single controller (supplied by this app). It is possible with controller mappings in XP to now automate this connection between CTY and controller. Makes setup easier.

Will possibly be problematic for existing users. Needs testing. Might need 2.0 and upgrade script?

Make lang tag on RSS feed dynamic

Fetch this setting from the content, and/or site? Perhaps with waterfall logic too Feed > Content > Site ... something. Also do the transformation from all the different formats to the one format RSS feeds accept: "en-US".

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.