Parse a feed document into articles. Handles RSS 2.0 (<item>) and Atom
(<entry>); a document containing both has both read, since some publishers
serve a hybrid.
Items with no title are skipped — there is nothing to show or score. Items with
no parseable date are kept with publishedAt: null, which is what lets the
caller report them rather than wonder where they went. Age filtering is a
separate step (filterByAge) precisely so that decision stays visible.
Parse a feed document into articles. Handles RSS 2.0 (
<item>) and Atom (<entry>); a document containing both has both read, since some publishers serve a hybrid.Items with no title are skipped — there is nothing to show or score. Items with no parseable date are kept with
publishedAt: null, which is what lets the caller report them rather than wonder where they went. Age filtering is a separate step (filterByAge) precisely so that decision stays visible.