# Licensed to the Apache Software Foundation (ASF) under one or more
#  contributor license agreements.  The ASF licenses this file to You
# under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.  For additional information regarding
# copyright in this work, please see the NOTICE file in the top level
# directory of this distribution.


# Some RSS 0.91 feeds have pubDates in items

WireFeedParser.classes=org.apache.roller.planet.util.rome.PlanetRSS091UParser \
	                   org.apache.roller.planet.util.rome.PlanetRSS091NParser    
	                                
Converter.classes     =org.apache.roller.planet.util.rome.PlanetConverterForRSS091U \
	                   org.apache.roller.planet.util.rome.PlanetConverterForRSS091N \
	                   org.apache.roller.planet.util.rome.PlanetConverterForRSS20
	              
# Handle funky RSS (RSS 2.0 with <dc:date> and/or <content:encoded>)

rss_2.0.feed.ModuleGenerator.classes =com.rometools.rome.io.impl.DCModuleGenerator \
                                      org.apache.roller.planet.util.rome.ContentModuleGenerator
                                      
rss_2.0.item.ModuleGenerator.classes =com.rometools.rome.io.impl.DCModuleGenerator \
                                      org.apache.roller.planet.util.rome.ContentModuleGenerator
                                      
rss_2.0.feed.ModuleParser.classes    =com.rometools.rome.io.impl.DCModuleParser \
                                      org.apache.roller.planet.util.rome.ContentModuleParser
                                      
rss_2.0.item.ModuleParser.classes    =com.rometools.rome.io.impl.DCModuleParser \
                                      org.apache.roller.planet.util.rome.ContentModuleParser
                                      
# Handle <content:encoded> in RSS 1.0 

rss_1.0.feed.ModuleParser.classes    =com.rometools.rome.io.impl.DCModuleParser \
                                      org.apache.roller.planet.util.rome.ContentModuleParser
                                      
rss_1.0.item.ModuleParser.classes    =com.rometools.rome.io.impl.DCModuleParser \
                                      org.apache.roller.planet.util.rome.ContentModuleParser
                                      
rss_1.0.feed.ModuleGenerator.classes =com.rometools.rome.io.impl.DCModuleGenerator \
                                      org.apache.roller.planet.util.rome.ContentModuleGenerator

rss_1.0.item.ModuleGenerator.classes =com.rometools.rome.io.impl.DCModuleGenerator \
                                      org.apache.roller.planet.util.rome.ContentModuleGenerator
              