1// This program is free software: you can redistribute it and/or modify2// it under the terms of the GNU General Public License as published by3// the Free Software Foundation, either version 3 of the License, or4// (at your option) any later version.5//6// This program is distributed in the hope that it will be useful,7// but WITHOUT ANY WARRANTY; without even the implied warranty of8// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9// GNU General Public License for more details.10//11// You should have received a copy of the GNU General Public License12// along with this program. If not, see <http://www.gnu.org/licenses/>.13//14// This is a slightly modified version of 'encoding/xml/read_test.go'.15// Copyright 2009 The Go Authors. All rights reserved. Use of this16// source code is governed by a BSD-style license that can be found in17// the LICENSE file.1819package feedparser2021import (22 "bytes"23 "encoding/xml"24 "golang.org/x/net/html/charset"25 "time"26)2728// dateFormats describes multiple possible formats for dates.29// Originally imported from goread <https://github.com/mjibson/goread>.30var dateFormats = []string{31 "01-02-2006",32 "01/02/2006",33 "01/02/2006 - 15:04",34 "01/02/2006 15:04:05 MST",35 "01/02/2006 3:04 PM",36 "02-01-2006",37 "02/01/2006",38 "02.01.2006 -0700",39 "02/01/2006 - 15:04",40 "02.01.2006 15:04",41 "02/01/2006 15:04:05",42 "02.01.2006 15:04:05",43 "02-01-2006 15:04:05 MST",44 "02/01/2006 15:04 MST",45 "02 Jan 2006",46 "02 Jan 2006 15:04:05",47 "02 Jan 2006 15:04:05 -0700",48 "02 Jan 2006 15:04:05 MST",49 "02 Jan 2006 15:04:05 UT",50 "02 Jan 2006 15:04 MST",51 "02 Monday, Jan 2006 15:04",52 "06-1-2 15:04",53 "06/1/2 15:04",54 "1/2/2006",55 "1/2/2006 15:04:05 MST",56 "1/2/2006 3:04:05 PM",57 "1/2/2006 3:04:05 PM MST",58 "15:04 02.01.2006 -0700",59 "2006-01-02",60 "2006/01/02",61 "2006-01-02 00:00:00.0 15:04:05.0 -0700",62 "2006-01-02 15:04",63 "2006-01-02 15:04:05 -0700",64 "2006-01-02 15:04:05-07:00",65 "2006-01-02 15:04:05-0700",66 "2006-01-02 15:04:05 MST",67 "2006-01-02 15:04:05Z",68 "2006-01-02 at 15:04:05",69 "2006-01-02T15:04:05",70 "2006-01-02T15:04:05:00",71 "2006-01-02T15:04:05 -0700",72 "2006-01-02T15:04:05-07:00",73 "2006-01-02T15:04:05-0700",74 "2006-01-02T15:04:05:-0700",75 "2006-01-02T15:04:05-07:00",76 "2006-01-02T15:04:05-07:00:00",77 "2006-01-02T15:04:05Z",78 "2006-01-02T15:04-07:00",79 "2006-01-02T15:04Z",80 "2006-1-02T15:04:05Z",81 "2006-1-2",82 "2006-1-2 15:04:05",83 "2006-1-2T15:04:05Z",84 "2006 January 02",85 "2-1-2006",86 "2/1/2006",87 "2.1.2006 15:04:05",88 "2 Jan 2006",89 "2 Jan 2006 15:04:05 -0700",90 "2 Jan 2006 15:04:05 MST",91 "2 Jan 2006 15:04:05 Z",92 "2 January 2006",93 "2 January 2006 15:04:05 -0700",94 "2 January 2006 15:04:05 MST",95 "6-1-2 15:04",96 "6/1/2 15:04",97 "Jan 02, 2006",98 "Jan 02 2006 03:04:05PM",99 "Jan 2, 2006",100 "Jan 2, 2006 15:04:05 MST",101 "Jan 2, 2006 3:04:05 PM",102 "Jan 2, 2006 3:04:05 PM MST",103 "January 02, 2006",104 "January 02, 2006 03:04 PM",105 "January 02, 2006 15:04",106 "January 02, 2006 15:04:05 MST",107 "January 2, 2006",108 "January 2, 2006 03:04 PM",109 "January 2, 2006 15:04:05",110 "January 2, 2006 15:04:05 MST",111 "January 2, 2006, 3:04 p.m.",112 "January 2, 2006 3:04 PM",113 "Mon, 02 Jan 06 15:04:05 MST",114 "Mon, 02 Jan 2006",115 "Mon, 02 Jan 2006 15:04:05",116 "Mon, 02 Jan 2006 15:04:05 00",117 "Mon, 02 Jan 2006 15:04:05 -07",118 "Mon 02 Jan 2006 15:04:05 -0700",119 "Mon, 02 Jan 2006 15:04:05 --0700",120 "Mon, 02 Jan 2006 15:04:05 -07:00",121 "Mon, 02 Jan 2006 15:04:05 -0700",122 "Mon,02 Jan 2006 15:04:05 -0700",123 "Mon, 02 Jan 2006 15:04:05 GMT-0700",124 "Mon , 02 Jan 2006 15:04:05 MST",125 "Mon, 02 Jan 2006 15:04:05 MST",126 "Mon, 02 Jan 2006 15:04:05MST",127 "Mon, 02 Jan 2006, 15:04:05 MST",128 "Mon, 02 Jan 2006 15:04:05 MST -0700",129 "Mon, 02 Jan 2006 15:04:05 MST-07:00",130 "Mon, 02 Jan 2006 15:04:05 UT",131 "Mon, 02 Jan 2006 15:04:05 Z",132 "Mon, 02 Jan 2006 15:04 -0700",133 "Mon, 02 Jan 2006 15:04 MST",134 "Mon,02 Jan 2006 15:04 MST",135 "Mon, 02 Jan 2006 15 -0700",136 "Mon, 02 Jan 2006 3:04:05 PM MST",137 "Mon, 02 January 2006",138 "Mon,02 January 2006 14:04:05 MST",139 "Mon, 2006-01-02 15:04",140 "Mon, 2 Jan 06 15:04:05 -0700",141 "Mon, 2 Jan 06 15:04:05 MST",142 "Mon, 2 Jan 15:04:05 MST",143 "Mon, 2 Jan 2006",144 "Mon,2 Jan 2006",145 "Mon, 2 Jan 2006 15:04",146 "Mon, 2 Jan 2006 15:04:05",147 "Mon, 2 Jan 2006 15:04:05 -0700",148 "Mon, 2 Jan 2006 15:04:05-0700",149 "Mon, 2 Jan 2006 15:04:05 -0700 MST",150 "mon,2 Jan 2006 15:04:05 MST",151 "Mon 2 Jan 2006 15:04:05 MST",152 "Mon, 2 Jan 2006 15:04:05 MST",153 "Mon, 2 Jan 2006 15:04:05MST",154 "Mon, 2 Jan 2006 15:04:05 UT",155 "Mon, 2 Jan 2006 15:04 -0700",156 "Mon, 2 Jan 2006, 15:04 -0700",157 "Mon, 2 Jan 2006 15:04 MST",158 "Mon, 2, Jan 2006 15:4",159 "Mon, 2 Jan 2006 15:4:5 -0700 GMT",160 "Mon, 2 Jan 2006 15:4:5 MST",161 "Mon, 2 Jan 2006 3:04:05 PM -0700",162 "Mon, 2 January 2006",163 "Mon, 2 January 2006 15:04:05 -0700",164 "Mon, 2 January 2006 15:04:05 MST",165 "Mon, 2 January 2006, 15:04:05 MST",166 "Mon, 2 January 2006, 15:04 -0700",167 "Mon, 2 January 2006 15:04 MST",168 "Monday, 02 January 2006 15:04:05",169 "Monday, 02 January 2006 15:04:05 -0700",170 "Monday, 02 January 2006 15:04:05 MST",171 "Monday, 2 Jan 2006 15:04:05 -0700",172 "Monday, 2 Jan 2006 15:04:05 MST",173 "Monday, 2 January 2006 15:04:05 -0700",174 "Monday, 2 January 2006 15:04:05 MST",175 "Monday, January 02, 2006",176 "Monday, January 2, 2006",177 "Monday, January 2, 2006 03:04 PM",178 "Monday, January 2, 2006 15:04:05 MST",179 "Mon Jan 02 2006 15:04:05 -0700",180 "Mon, Jan 02,2006 15:04:05 MST",181 "Mon Jan 02, 2006 3:04 pm",182 "Mon Jan 2 15:04:05 2006 MST",183 "Mon Jan 2 15:04 2006",184 "Mon, Jan 2 2006 15:04:05 -0700",185 "Mon, Jan 2 2006 15:04:05 -700",186 "Mon, Jan 2, 2006 15:04:05 MST",187 "Mon, Jan 2 2006 15:04 MST",188 "Mon, Jan 2, 2006 15:04 MST",189 "Mon, January 02, 2006 15:04:05 MST",190 "Mon, January 02, 2006, 15:04:05 MST",191 "Mon, January 2 2006 15:04:05 -0700",192 time.ANSIC,193 time.RFC1123,194 time.RFC1123Z,195 time.RFC3339,196 time.RFC822,197 time.RFC822Z,198 time.RFC850,199 time.RubyDate,200 time.UnixDate,201}202203// unmarshal unmarshals an xml document to the given interface.204// It uses a custom charsetReader and therefore supports non-utf8205// xml encodings.206func unmarshal(data []byte, v interface{}) error {207 decoder := xml.NewDecoder(bytes.NewReader(data))208 decoder.CharsetReader = charset.NewReaderLabel209 return decoder.Decode(v)210}211212// parseTime tries to parse the given string as a date by trying213// various different date formats.214func parseTime(data string) (date time.Time, err error) {215 for _, format := range dateFormats {216 date, err = time.Parse(format, data)217 if err == nil {218 return219 }220 }221222 return223}