Refactor: split article source into provider and parser