package org.terst.feedreader.opml import android.util.Xml import org.terst.feedreader.data.FeedEntity import org.xmlpull.v1.XmlPullParser import java.io.InputStream import java.io.OutputStream data class OpmlFeed(val title: String, val xmlUrl: String, val htmlUrl: String?) /** * OPML import/export. Any folder nesting ( containing other * elements instead of an xmlUrl) is flattened -- this app has no * folder concept, per the "simple design" scope, so a folder's contents * are just imported as a flat list of feeds. */ object Opml { fun parse(input: InputStream): List { val parser = Xml.newPullParser() parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false) parser.setInput(input, null) val feeds = mutableListOf() var eventType = parser.eventType while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG && parser.name.equals("outline", ignoreCase = true)) { val xmlUrl = parser.getAttributeValue(null, "xmlUrl") if (xmlUrl != null) { val title = parser.getAttributeValue(null, "title") ?: parser.getAttributeValue(null, "text") ?: xmlUrl val htmlUrl = parser.getAttributeValue(null, "htmlUrl") feeds += OpmlFeed(title, xmlUrl, htmlUrl) } } eventType = parser.next() } return feeds } fun write(feeds: List, output: OutputStream) { val serializer = Xml.newSerializer() serializer.setOutput(output, "UTF-8") serializer.startDocument("UTF-8", true) serializer.startTag(null, "opml") serializer.attribute(null, "version", "2.0") serializer.startTag(null, "head") serializer.startTag(null, "title") serializer.text("Feeds subscriptions") serializer.endTag(null, "title") serializer.endTag(null, "head") serializer.startTag(null, "body") for (feed in feeds) { serializer.startTag(null, "outline") serializer.attribute(null, "text", feed.title) serializer.attribute(null, "title", feed.title) serializer.attribute(null, "type", "rss") serializer.attribute(null, "xmlUrl", feed.id) feed.siteUrl?.let { serializer.attribute(null, "htmlUrl", it) } serializer.endTag(null, "outline") } serializer.endTag(null, "body") serializer.endTag(null, "opml") serializer.endDocument() serializer.flush() } }