| Index: src/com/dom_distiller/client/SchemaOrgParserAccessor.java
|
| diff --git a/src/com/dom_distiller/client/SchemaOrgParserAccessor.java b/src/com/dom_distiller/client/SchemaOrgParserAccessor.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1bc30a6f5c88d3213038822ad2e3ef216e884f7c
|
| --- /dev/null
|
| +++ b/src/com/dom_distiller/client/SchemaOrgParserAccessor.java
|
| @@ -0,0 +1,170 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package com.dom_distiller.client;
|
| +
|
| +import java.util.ArrayList;
|
| +import java.util.List;
|
| +
|
| +import com.google.gwt.dom.client.Element;
|
| +
|
| +/**
|
| + * This class instantiates SchemaOrgParser and implements MarkupParser.Parser interface to provide
|
| + * access to properties that SchemaOrgParser has parsed.
|
| + */
|
| +public class SchemaOrgParserAccessor implements MarkupParser.Parser {
|
| + private final SchemaOrgParser parser;
|
| +
|
| + /**
|
| + * The object that instantiates SchemaOrgParser and implements its MarkupParser.Parser
|
| + * interface.
|
| + */
|
| + public SchemaOrgParserAccessor(Element root) {
|
| + parser = new SchemaOrgParser(root);
|
| + }
|
| +
|
| + @Override
|
| + public String getTitle() {
|
| + String title = "";
|
| + List<SchemaOrgParser.ArticleItem> articles = parser.getArticleItems();
|
| +
|
| + // Get the "headline" property of the first article that has it.
|
| + for (int i = 0; i < articles.size() && title.isEmpty(); i++) {
|
| + title = articles.get(i).getStringProperty(SchemaOrgParser.HEADLINE_PROP);
|
| + }
|
| +
|
| + // If there's no "headline" property, use "name" property.
|
| + for (int i = 0; i < articles.size() && title.isEmpty(); i++) {
|
| + title = articles.get(i).getStringProperty(SchemaOrgParser.NAME_PROP);
|
| + }
|
| +
|
| + return title;
|
| + }
|
| +
|
| + @Override
|
| + public String getType() {
|
| + // TODO(kuan): consolidate/standardize types returned from all 3 parsers in MarkupParser.
|
| + // Returns ARTICLe if there's an article.
|
| + return parser.getArticleItems().isEmpty() ? "" : SchemaOrgParser.Type.ARTICLE.toString();
|
| + }
|
| +
|
| + @Override
|
| + public String getUrl() {
|
| + List<SchemaOrgParser.ArticleItem> articles = parser.getArticleItems();
|
| + return articles.isEmpty() ? "" :
|
| + articles.get(0).getStringProperty(SchemaOrgParser.URL_PROP);
|
| + }
|
| +
|
| + @Override
|
| + public MarkupParser.Image[] getImages() {
|
| + List<MarkupParser.Image> images = new ArrayList<MarkupParser.Image>();
|
| +
|
| + // First, get images from ArticleItem's.
|
| + List<SchemaOrgParser.ArticleItem> articleItems = parser.getArticleItems();
|
| + MarkupParser.Image imageOfArticle = null;
|
| + SchemaOrgParser.ImageItem associatedImageOfArticle = null;
|
| +
|
| + for (int i = 0; i < articleItems.size(); i++) {
|
| + SchemaOrgParser.ArticleItem articleItem = articleItems.get(i);
|
| + // If article has an associated image or the "image" property, remember them for now;
|
| + // they'll be added to the list later when the position in the list can be determined.
|
| + if (associatedImageOfArticle == null) {
|
| + associatedImageOfArticle = articleItem.getRepresentativeImageItem();
|
| + if (associatedImageOfArticle != null) continue;
|
| + }
|
| + MarkupParser.Image image = articleItem.getImage();
|
| + if (image == null) continue;
|
| + if (imageOfArticle == null) {
|
| + imageOfArticle = image;
|
| + } else {
|
| + images.add(image);
|
| + }
|
| + }
|
| +
|
| + // Then, get images from ImageItem's.
|
| + List<SchemaOrgParser.ImageItem> imageItems = parser.getImageItems();
|
| + boolean hasRepresentativeImage = false;
|
| +
|
| + for (int i = 0; i < imageItems.size(); i++) {
|
| + SchemaOrgParser.ImageItem imageItem = imageItems.get(i);
|
| + MarkupParser.Image image = imageItem.getImage();
|
| + // Insert |image| at beginning of list if it's the first image that's representative of
|
| + // page or it's the associated image of the first article.
|
| + if (!hasRepresentativeImage && (imageItem == associatedImageOfArticle ||
|
| + imageItem.isRepresentativeOfPage())) {
|
| + hasRepresentativeImage = true;
|
| + images.add(0, image);
|
| + } else {
|
| + images.add(image);
|
| + }
|
| + }
|
| +
|
| + // Prepend |imageOfArticle| to list if there's no image representative of page; append it
|
| + // otherwise.
|
| + if (imageOfArticle != null) {
|
| + if (!hasRepresentativeImage) images.add(0, imageOfArticle);
|
| + else images.add(imageOfArticle);
|
| + }
|
| +
|
| + if (images.isEmpty()) return null;
|
| +
|
| + return images.toArray(new MarkupParser.Image[images.size()]);
|
| + }
|
| +
|
| + @Override
|
| + public String getDescription() {
|
| + List<SchemaOrgParser.ArticleItem> articles = parser.getArticleItems();
|
| + return articles.isEmpty() ? "" :
|
| + articles.get(0).getStringProperty(SchemaOrgParser.DESCRIPTION_PROP);
|
| + }
|
| +
|
| + @Override
|
| + public String getPublisher() {
|
| + // Returns either the "publisher" or "copyrightHolder" property of the first article.
|
| + String publisher = "";
|
| + List<SchemaOrgParser.ArticleItem> articles = parser.getArticleItems();
|
| + if (!articles.isEmpty()) {
|
| + SchemaOrgParser.ArticleItem article = articles.get(0);
|
| + publisher = article.getPersonOrOrganizationName(SchemaOrgParser.PUBLISHER_PROP);
|
| + if (publisher.isEmpty()) {
|
| + publisher = article.getPersonOrOrganizationName(
|
| + SchemaOrgParser.COPYRIGHT_HOLDER_PROP);
|
| + }
|
| + }
|
| + return publisher;
|
| + }
|
| +
|
| + @Override
|
| + public String getCopyright() {
|
| + List<SchemaOrgParser.ArticleItem> articles = parser.getArticleItems();
|
| + return articles.isEmpty() ? "" : articles.get(0).getCopyright();
|
| + }
|
| +
|
| + @Override
|
| + public String getAuthor() {
|
| + String author = "";
|
| + List<SchemaOrgParser.ArticleItem> articles = parser.getArticleItems();
|
| + if (!articles.isEmpty()) {
|
| + SchemaOrgParser.ArticleItem article = articles.get(0);
|
| + author = article.getPersonOrOrganizationName(SchemaOrgParser.AUTHOR_PROP);
|
| + // If there's no "author" property, use "creator" property.
|
| + if (author.isEmpty()) {
|
| + author = article.getPersonOrOrganizationName(SchemaOrgParser.CREATOR_PROP);
|
| + }
|
| + }
|
| + // Otherwise, use "rel=author" tag.
|
| + return author.isEmpty() ? parser.getAuthorFromRel() : author;
|
| + }
|
| +
|
| + @Override
|
| + public MarkupParser.Article getArticle() {
|
| + List<SchemaOrgParser.ArticleItem> articles = parser.getArticleItems();
|
| + return articles.isEmpty() ? null : articles.get(0).getArticle();
|
| + }
|
| +
|
| + @Override
|
| + public boolean optOut() {
|
| + return false;
|
| + }
|
| +}
|
|
|