@@ -10,19 +10,13 @@ internal class AtomFeedHandler(
1010 private val baseFeedUrl : String? ,
1111) : FeedHandler {
1212
13- private var currentElement: String? = null
14-
1513 private var channelFactory = ChannelFactory ()
16- private var itemData: MutableMap <String , String > = mutableMapOf ()
17- private var channelData: MutableMap <String , String > = mutableMapOf ()
1814
1915 private var isInsideItem = false
2016 private var isInsideChannel = true
2117
2218 override fun didStartElement (startElement : String , attributes : Map <Any ?, * >) {
23- currentElement = startElement
24-
25- when (currentElement) {
19+ when (startElement) {
2620 AtomKeyword .ATOM .value -> isInsideChannel = true
2721 AtomKeyword .ENTRY_ITEM .value -> isInsideItem = true
2822
@@ -87,86 +81,109 @@ internal class AtomFeedHandler(
8781 }
8882 }
8983
90- override fun foundCharacters (characters : String ) {
91- val element = currentElement ? : return
92-
93- when {
94- isInsideItem -> itemData[element] = (itemData[element].orEmpty()) + characters
95- isInsideChannel -> channelData[element] = (channelData[element].orEmpty()) + characters
96- }
97- }
98-
99- override fun didEndElement (endElement : String ) {
84+ override fun didEndElement (endElement : String , text : String ) {
10085 when (endElement) {
10186 AtomKeyword .ATOM .value -> {
102- channelFactory.channelImageBuilder.url(
103- channelData[AtomKeyword .ICON .value]?.trim()
104- )
105- channelFactory.channelBuilder.lastBuildDate(
106- channelData[AtomKeyword .UPDATED .value]?.trim()
107- )
108- channelFactory.channelBuilder.description(
109- channelData[AtomKeyword .SUBTITLE .value]?.trim()
110- )
111- channelFactory.channelBuilder.title(
112- channelData[AtomKeyword .TITLE .value]?.trim()
113- )
114-
11587 isInsideChannel = false
11688 }
11789
11890 AtomKeyword .ENTRY_ITEM .value -> {
119- val pubDate = if (itemData[AtomKeyword .ENTRY_PUBLISHED .value] != null ) {
120- itemData[AtomKeyword .ENTRY_PUBLISHED .value]?.trim()
121- } else {
122- itemData[AtomKeyword .UPDATED .value]?.trim()
123- }
124- channelFactory.articleBuilder.pubDate(
125- pubDate
126- )
127- channelFactory.articleBuilder.title(
128- itemData[AtomKeyword .TITLE .value]?.trim()
129- )
130- channelFactory.articleBuilder.author(
131- itemData[AtomKeyword .ENTRY_AUTHOR .value]?.trim()
132- )
133- channelFactory.articleBuilder.guid(
134- itemData[AtomKeyword .ENTRY_GUID .value]?.trim()
135- )
136-
137- val content = itemData[AtomKeyword .ENTRY_CONTENT .value]?.trim()
138- channelFactory.articleBuilder.content(content)
139- channelFactory.setImageFromContent(content)
140-
141- val description = itemData[AtomKeyword .ENTRY_DESCRIPTION .value]?.trim()
142- channelFactory.articleBuilder.description(description)
143- channelFactory.setImageFromContent(description)
144-
145- val category = itemData[AtomKeyword .ENTRY_CATEGORY .value]?.trim()
146- if (! category.isNullOrEmpty()) {
147- channelFactory.articleBuilder.addCategory(category)
91+ channelFactory.buildArticle()
92+ isInsideItem = false
93+ }
94+
95+ AtomKeyword .ICON .value -> {
96+ if (isInsideChannel) {
97+ channelFactory.channelImageBuilder.url(text)
14898 }
99+ }
149100
150- // Youtube
101+ AtomKeyword .ENTRY_PUBLISHED .value -> {
102+ if (isInsideItem) {
103+ channelFactory.articleBuilder.pubDate(text)
104+ }
105+ }
151106
152- val channelId = itemData[AtomKeyword .YOUTUBE_CHANNEL_ID .value]?.trim()
153- channelFactory.youtubeChannelDataBuilder.channelId(channelId)
107+ AtomKeyword .UPDATED .value -> {
108+ when {
109+ isInsideItem -> channelFactory.articleBuilder.pubDateIfNull(text)
110+ isInsideChannel -> channelFactory.channelBuilder.lastBuildDate(text)
111+ }
112+ }
154113
155- val videoId = itemData[AtomKeyword .YOUTUBE_VIDEO_ID .value]?.trim()
156- channelFactory.youtubeItemDataBuilder.videoId(videoId)
114+ AtomKeyword .SUBTITLE .value -> {
115+ if (isInsideChannel) {
116+ channelFactory.channelBuilder.description(text)
117+ }
118+ }
157119
158- val title = itemData[AtomKeyword .YOUTUBE_MEDIA_GROUP_TITLE .value]?.trim()
159- channelFactory.youtubeItemDataBuilder.title(title)
120+ AtomKeyword .TITLE .value -> {
121+ when {
122+ isInsideItem -> channelFactory.articleBuilder.title(text)
123+ isInsideChannel -> channelFactory.channelBuilder.title(text)
124+ }
125+ }
160126
161- val videoDescription = itemData[AtomKeyword .YOUTUBE_MEDIA_GROUP_DESCRIPTION .value]?.trim()
162- channelFactory.youtubeItemDataBuilder.description(videoDescription)
127+ AtomKeyword .ENTRY_AUTHOR .value -> {
128+ if (isInsideItem) {
129+ channelFactory.articleBuilder.author(text)
130+ }
131+ }
163132
164- channelFactory.buildArticle()
165- itemData.clear()
133+ AtomKeyword .ENTRY_GUID .value -> {
134+ if (isInsideItem) {
135+ channelFactory.articleBuilder.guid(text)
136+ }
137+ }
138+
139+ AtomKeyword .ENTRY_CONTENT .value -> {
140+ if (isInsideItem) {
141+ channelFactory.articleBuilder.content(text)
142+ channelFactory.setImageFromContent(text)
143+ }
144+ }
145+
146+ AtomKeyword .ENTRY_DESCRIPTION .value -> {
147+ if (isInsideItem) {
148+ channelFactory.articleBuilder.description(text)
149+ channelFactory.setImageFromContent(text)
150+ }
151+ }
152+
153+ AtomKeyword .ENTRY_CATEGORY .value -> {
154+ if (isInsideItem && text.isNotEmpty()) {
155+ channelFactory.articleBuilder.addCategory(text)
156+ }
157+ }
158+
159+ AtomKeyword .YOUTUBE_CHANNEL_ID .value -> {
160+ channelFactory.youtubeChannelDataBuilder.channelId(text)
161+ }
162+
163+ AtomKeyword .YOUTUBE_VIDEO_ID .value -> {
164+ if (isInsideItem) {
165+ channelFactory.youtubeItemDataBuilder.videoId(text)
166+ }
167+ }
168+
169+ AtomKeyword .YOUTUBE_MEDIA_GROUP_TITLE .value -> {
170+ if (isInsideItem) {
171+ channelFactory.youtubeItemDataBuilder.title(text)
172+ }
173+ }
174+
175+ AtomKeyword .YOUTUBE_MEDIA_GROUP_DESCRIPTION .value -> {
176+ if (isInsideItem) {
177+ channelFactory.youtubeItemDataBuilder.description(text)
178+ }
166179 }
167180 }
168181 }
169182
170183 override fun buildRssChannel (): RssChannel =
171184 channelFactory.build()
185+
186+ override fun shouldClearTextBuilder (qName : String ): Boolean {
187+ return AtomKeyword .isValid(qName)
188+ }
172189}
0 commit comments