Permalink
Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign up
Fetching contributors…
Cannot retrieve contributors at this time
{ | |
"translatorID": "57a00950-f0d1-4b41-b6ba-44ff0fc30289", | |
"label": "Google Scholar", | |
"creator": "Simon Kornblith, Frank Bennett, Aurimas Vinckevicius", | |
"target": "^https?://scholar[-.]google[-.](com|cat|(com?[-.])?[a-z]{2})(\\.[^/]+)?/(scholar(_case)?\\?|citations\\?)", | |
"minVersion": "3.0", | |
"maxVersion": "", | |
"priority": 100, | |
"inRepository": true, | |
"translatorType": 4, | |
"browserSupport": "gcsibv", | |
"lastUpdated": "2018-11-16 05:56:18" | |
} | |
// attr()/text() v2 | |
function attr(docOrElem,selector,attr,index){var elem=index?docOrElem.querySelectorAll(selector).item(index):docOrElem.querySelector(selector);return elem?elem.getAttribute(attr):null;}function text(docOrElem,selector,index){var elem=index?docOrElem.querySelectorAll(selector).item(index):docOrElem.querySelector(selector);return elem?elem.textContent:null;} | |
function detectWeb(doc, url) { | |
/* Detection for law cases, but not "How cited" pages, | |
* e.g. url of "how cited" page: | |
* http://scholar.google.co.jp/scholar_case?about=1101424605047973909&q=kelo&hl=en&as_sdt=2002 | |
*/ | |
if (url.indexOf('/scholar_case?') != -1 | |
&& url.indexOf('about=') == -1 | |
) { | |
return "case"; | |
} else if (url.indexOf('/citations?') != -1) { | |
if (getProfileResults(doc, true)) { | |
return "multiple"; | |
} | |
//individual saved citation | |
var link = ZU.xpathText(doc, '//a[@class="gsc_vcd_title_link"]/@href'); | |
if (!link) return; | |
if (link.indexOf('/scholar_case?') != -1) { | |
return 'case'; | |
} else { | |
//Can't distinguish book from journalArticle | |
//Both have "Journal" fields | |
return 'journalArticle'; | |
} | |
} else if (getSearchResults(doc, true)) { | |
return "multiple"; | |
} | |
} | |
function getSearchResults(doc, checkOnly) { | |
var items = {}; | |
var found = false; | |
var rows = doc.querySelectorAll('.gs_r[data-cid]'); | |
for (var i=0; i<rows.length; i++) { | |
var href = rows[i].dataset.cid; | |
var title = text(rows[i], '.gs_rt'); | |
if (!href || !title) continue; | |
if (checkOnly) return true; | |
found = true; | |
items[href] = title; | |
} | |
return found ? items : false; | |
} | |
function getProfileResults(doc, checkOnly) { | |
var items = {}; | |
var found = false; | |
var rows = doc.querySelectorAll('a.gsc_a_at'); | |
for (var i=0; i<rows.length; i++) { | |
var href = rows[i].dataset.href; | |
var title = rows[i].textContent; | |
if (!href || !title) continue; | |
if (checkOnly) return true; | |
found = true; | |
items[href] = title; | |
} | |
return found ? items : false; | |
} | |
function doWeb(doc, url) { | |
var type = detectWeb(doc, url); | |
if (type == "multiple") { | |
if (getSearchResults(doc, true)) { | |
Zotero.selectItems(getSearchResults(doc, false), function (items) { | |
if (!items) { | |
return true; | |
} | |
var ids = []; | |
for (var i in items) { | |
ids.push(i); | |
} | |
//here it is enough to know the ids and we can call scrape directly | |
scrape(doc, ids); | |
}); | |
} else if (getProfileResults(doc, true)) { | |
Zotero.selectItems(getProfileResults(doc, false), function (items) { | |
if (!items) { | |
return true; | |
} | |
var articles = []; | |
for (var i in items) { | |
articles.push(i); | |
} | |
//here we need open these pages before calling scrape | |
ZU.processDocuments(articles, scrape); | |
}); | |
} | |
} else { | |
//e.g. https://scholar.google.de/citations?view_op=view_citation&hl=de&user=INQwsQkAAAAJ&citation_for_view=INQwsQkAAAAJ:u5HHmVD_uO8C | |
scrape(doc, url, type); | |
} | |
} | |
function scrape(doc, idsOrUrl, type) { | |
if (Array.isArray(idsOrUrl)) { | |
scrapeIds(doc, idsOrUrl); | |
} else { | |
if (type && type=="case") { | |
scrapeCase(doc, idsOrUrl); | |
} else { | |
var related = ZU.xpathText(doc, '//a[contains(@href, "q=related:")]/@href'); | |
if (!related) { | |
throw new Error("Could not locate related URL"); | |
} | |
var itemID = related.match(/=related:([^:]+):/); | |
if (itemID) { | |
scrapeIds(doc, [itemID[1]]); | |
} else { | |
Z.debug("Can't find itemID. related URL is " + related); | |
throw new Error("Cannot extract itemID from related link"); | |
} | |
} | |
} | |
} | |
function scrapeIds(doc, ids) { | |
for (let i=0; i<ids.length; i++) { | |
// We need here 'let' to access ids[i] later in the nested functions | |
let context = doc.querySelector('.gs_r[data-cid="' + ids[i] + '"]'); | |
if (!context && ids.length==1) context = doc; | |
var citeUrl = '/scholar?q=info:' + ids[i] + ':scholar.google.com/&output=cite&scirp=1'; | |
// For 'My Library' we check the search field at the top | |
// and then in these cases change the citeUrl accordingly. | |
var scilib = attr(doc, '#gs_hdr_frm input[name="scilib"]', 'value') | |
if (scilib && scilib==1) { | |
var citeUrl = '/scholar?scila=' + ids[i] + '&output=cite&scirp=1'; | |
} | |
ZU.doGet(citeUrl, function(citePage) { | |
var m = citePage.match(/href="((https?:\/\/[a-z\.]*)?\/scholar.bib\?[^"]+)/); | |
if (!m) { | |
//Saved lists and possibly other places have different formats for BibTeX URLs | |
//Trying to catch them here (can't add test bc lists are tied to google accounts) | |
m = citePage.match(/href="(.+?)">BibTeX<\/a>/); | |
} | |
if (!m) { | |
var msg = "Could not find BibTeX URL"; | |
var title = citePage.match(/<title>(.*?)<\/title>/i); | |
if (title) { | |
if (title) msg += ' Got page with title "' + title[1] +'"'; | |
} | |
throw new Error(msg); | |
} | |
var bibUrl = ZU.unescapeHTML(m[1]); | |
ZU.doGet(bibUrl, function(bibtex) { | |
var translator = Zotero.loadTranslator("import"); | |
translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4"); | |
translator.setString(bibtex); | |
translator.setHandler("itemDone", function(obj, item) { | |
//these two variables are extracted from the context | |
var titleLink = attr(context, 'h3 a, #gsc_vcd_title a', 'href'); | |
var secondLine = text(context, '.gs_a') || ''; | |
//case are not recognized and can be characterized by the | |
//titleLink, or that the second line starts with a number | |
//e.g. 1 Cr. 137 - Supreme Court, 1803 | |
if ((titleLink && titleLink.indexOf('/scholar_case?')>-1) || | |
secondLine && ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].indexOf(secondLine[0])>-1) { | |
item.itemType = "case"; | |
item.caseName = item.title; | |
item.reporter = item.publicationTitle; | |
item.reporterVolume = item.volume; | |
item.dateDecided = item.date; | |
item.court = item.publisher; | |
} | |
//patents are not recognized but are easily detected | |
//by the titleLink or second line | |
if ((titleLink && titleLink.indexOf('google.com/patents/')>-1) || secondLine.indexOf('Google Patents')>-1) { | |
item.itemType = "patent"; | |
//authors are inventors | |
for (var i=0, n=item.creators.length; i<n; i++) { | |
item.creators[i].creatorType = 'inventor'; | |
} | |
//country and patent number | |
if (titleLink) { | |
let m = titleLink.match(/\/patents\/([A-Za-z]+)(.*)$/); | |
if (m) { | |
item.country = m[1]; | |
item.patentNumber = m[2]; | |
} | |
} | |
} | |
//fix titles in all upper case, e.g. some patents in search results | |
if (item.title.toUpperCase() == item.title) { | |
item.title = ZU.capitalizeTitle(item.title); | |
} | |
//delete "others" as author | |
if (item.creators.length) { | |
var lastCreatorIndex = item.creators.length-1, | |
lastCreator = item.creators[lastCreatorIndex]; | |
if (lastCreator.lastName === "others" && (lastCreator.fieldMode === 1 ||lastCreator.firstName === "")) { | |
item.creators.splice(lastCreatorIndex, 1); | |
} | |
} | |
//clean author names | |
for (var j=0, m=item.creators.length; j<m; j++) { | |
if (!item.creators[j].firstName) continue; | |
item.creators[j] = ZU.cleanAuthor( | |
item.creators[j].lastName + ', ' + | |
item.creators[j].firstName, | |
item.creators[j].creatorType, | |
true); | |
} | |
//attach linked document as attachment if available | |
var documentLinkTarget = attr(context, '.gs_or_ggsm a, #gsc_vcd_title_gg a', 'href'); | |
var documentLinkTitle = text(context, '.gs_or_ggsm a, #gsc_vcd_title_gg a'); | |
if (documentLinkTarget) { | |
//Z.debug(documentLinkTarget); | |
attachment = { | |
title: "Full Text", | |
url: documentLinkTarget | |
}; | |
var m = documentLinkTitle.match(/^\[(\w+)\]/); | |
if (m) { | |
var mimeTypes = { | |
'PDF': 'application/pdf', | |
'DOC': 'application/msword', | |
'HTML': 'text/html' | |
}; | |
if (Object.keys(mimeTypes).indexOf(m[1].toUpperCase())>-1) { | |
attachment.mimeType = mimeTypes[m[1]]; | |
} | |
} | |
item.attachments.push(attachment); | |
} | |
// Attach linked page as snapshot if available | |
if (titleLink && titleLink != documentLinkTarget) { | |
item.attachments.push({ | |
url: titleLink, | |
title: "Snapshot", | |
mimeType: "text/html" | |
}); | |
} | |
item.complete(); | |
}); | |
translator.translate(); | |
}); | |
}); | |
} | |
} | |
/* | |
* ######################### | |
* ### Scraper Functions ### | |
* ######################### | |
*/ | |
var bogusItemID = 1; | |
var scrapeCase = function (doc, url) { | |
// Citelet is identified by | |
// id="gsl_reference" | |
var refFrag = doc.evaluate('//div[@id="gsl_reference"] | //div[@id="gs_reference"]', | |
doc, null, XPathResult.ANY_TYPE, null).iterateNext(); | |
if (refFrag) { | |
// citelet looks kind of like this | |
// Powell v. McCormack, 395 US 486 - Supreme Court 1969 | |
var item = new Zotero.Item("case"); | |
var attachmentPointer = url; | |
if (Zotero.isMLZ) { | |
var block = doc.getElementById("gs_opinion_wrapper"); | |
if (block) { | |
attachmentPointer = block; | |
} | |
} | |
var factory = new ItemFactory(doc, refFrag.textContent, [attachmentPointer]); | |
factory.repairCitelet(); | |
factory.getDate(); | |
factory.getCourt(); | |
factory.getVolRepPag(); | |
if (!factory.hasReporter()) { | |
// Look for docket number in the current document | |
factory.getDocketNumber(doc); | |
} | |
factory.getTitle(); | |
factory.saveItem(); | |
} | |
}; | |
/* | |
* #################### | |
* ### Item Factory ### | |
* #################### | |
*/ | |
var ItemFactory = function (doc, citeletString, attachmentLinks, titleString /*, bibtexLink*/) { | |
// var strings | |
this.v = {}; | |
this.v.title = titleString; | |
this.v.number = false; | |
this.v.court = false; | |
this.v.extra = false; | |
this.v.date = undefined; | |
this.v.jurisdiction = false; | |
this.v.docketNumber = false; | |
this.vv = {}; | |
this.vv.volRepPag = []; | |
// portable array | |
this.attachmentLinks = attachmentLinks; | |
this.doc = doc; | |
// working strings | |
this.citelet = citeletString; | |
/** handled outside of item factory | |
this.bibtexLink = bibtexLink; | |
this.bibtexData = undefined; | |
*/ | |
this.trailingInfo = false; | |
// simple arrays of strings | |
this.hyphenSplit = false; | |
this.commaSplit = false; | |
}; | |
ItemFactory.prototype.repairCitelet = function () { | |
if (!this.citelet.match(/\s+-\s+/)) { | |
this.citelet = this.citelet.replace(/,\s+([A-Z][a-z]+:)/, " - $1"); | |
} | |
}; | |
ItemFactory.prototype.repairTitle = function () { | |
// All-caps words of four or more characters probably need fixing. | |
if (this.v.title.match(/(?:[^a-z]|^)[A-Z]{4,}(?:[^a-z]|$)/)) { | |
this.v.title = ZU.capitalizeTitle(this.v.title.toLowerCase(), true) | |
.replace(/([^0-9a-z])V([^0-9a-z])/, "$1v$2"); | |
} | |
}; | |
ItemFactory.prototype.hasUsefulData = function () { | |
if (this.getDate()) { | |
return true; | |
} | |
if (this.hasInitials()) { | |
return true; | |
} | |
return false; | |
}; | |
ItemFactory.prototype.hasInitials = function () { | |
if (this.hyphenSplit.length && this.hyphenSplit[0].match(/[A-Z] /)) { | |
return true; | |
} | |
return false; | |
}; | |
ItemFactory.prototype.hasReporter = function () { | |
if (this.vv.volRepPag.length > 0) { | |
return true; | |
} | |
return false; | |
}; | |
ItemFactory.prototype.getDate = function () { | |
var i, m; | |
// Citelet parsing, step (1) | |
if (!this.hyphenSplit) { | |
if (this.citelet.match(/\s+-\s+/)) { | |
this.hyphenSplit = this.citelet.split(/\s+-\s+/); | |
} else { | |
m = this.citelet.match(/^(.*),\s+([^,]+Court,\s+[^,]+)$/); | |
if (m) { | |
this.hyphenSplit = [m[1], m[2]]; | |
} else { | |
this.hyphenSplit = [this.citelet]; | |
} | |
} | |
this.trailingInfo = this.hyphenSplit.slice(-1); | |
} | |
if (!this.v.date && this.v.date !== false) { | |
this.v.date = false; | |
for (i = this.hyphenSplit.length - 1; i > -1; i += -1) { | |
m = this.hyphenSplit[i].match(/(?:(.*)\s+)*([0-9]{4})$/); | |
if (m) { | |
this.v.date = m[2]; | |
if (m[1]) { | |
this.hyphenSplit[i] = m[1]; | |
} else { | |
this.hyphenSplit[i] = ""; | |
} | |
this.hyphenSplit = this.hyphenSplit.slice(0, i + 1); | |
break; | |
} | |
} | |
} | |
// If we can find a more specific date in the case's centered text then use it | |
var nodesSnapshot = this.doc.evaluate('//div[@id="gs_opinion"]/center', this.doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null ); | |
for ( var iNode = 0; iNode < nodesSnapshot.snapshotLength; iNode++ ) { | |
var specificDate = nodesSnapshot.snapshotItem(iNode).textContent.trim(); | |
// Remove the first word through the first space | |
// if it starts with "Deci" or it doesn't start with the first three letters of a month | |
// and if it doesn't start with Submitted or Argued | |
// (So, words like "Decided", "Dated", and "Released" will be removed) | |
specificDate = specificDate.replace(/^(?:Deci|(?!Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|Submitted|Argued))[a-z]+[.:]?\s*/i,"") | |
// Remove the trailing period, if it is there | |
.replace(/\.$/,""); | |
// If the remaining text is a valid date... | |
if (!isNaN(Date.parse(specificDate))) { | |
// ...then use it | |
this.v.date = specificDate; | |
break; | |
} | |
} | |
return this.v.date; | |
}; | |
ItemFactory.prototype.getCourt = function () { | |
var s, m; | |
// Citelet parsing, step (2) | |
s = this.hyphenSplit.pop().replace(/,\s*$/, "").replace(/\u2026\s*$/, "Court"); | |
var court = null; | |
var jurisdiction = null; | |
m = s.match(/(.* Court),\s+(.*)/); | |
if (m) { | |
court = m[1]; | |
jurisdiction = m[2]; | |
} | |
if (!court) { | |
m = s.match(/(?:([a-zA-Z]+):\s*)*(.*)/); | |
if (m) { | |
court = m[2].replace(/_/g, " "); | |
jurisdiction = m[1]; | |
} | |
} | |
if (court) { | |
this.v.court = court; | |
} | |
if (jurisdiction) { | |
this.v.extra = "{:jurisdiction: " + jurisdiction + "}"; | |
} | |
}; | |
ItemFactory.prototype.getVolRepPag = function () { | |
var i, m; | |
// Citelet parsing, step (3) | |
if (this.hyphenSplit.length) { | |
this.commaSplit = this.hyphenSplit.slice(-1)[0].split(/\s*,\s+/); | |
var gotOne = false; | |
for (i = this.commaSplit.length - 1; i > -1; i += -1) { | |
m = this.commaSplit[i].match(/^([0-9]+)\s+(.*)\s+(.*)/); | |
if (m) { | |
var volRepPag = {}; | |
volRepPag.volume = m[1]; | |
volRepPag.reporter = m[2]; | |
volRepPag.pages = m[3].replace(/\s*$/, ""); | |
this.commaSplit.pop(); | |
if (!volRepPag.pages.match(/[0-9]$/) && (i > 0 || gotOne)) { | |
continue; | |
} | |
gotOne = true; | |
this.vv.volRepPag.push(volRepPag); | |
} else { | |
break; | |
} | |
} | |
} | |
}; | |
ItemFactory.prototype.getTitle = function () { | |
// Citelet parsing, step (4) [optional] | |
if (this.commaSplit) { | |
this.v.title = this.commaSplit.join(", "); | |
} | |
}; | |
ItemFactory.prototype.getDocketNumber = function (doc) { | |
var docNumFrag = doc.evaluate( | |
'//center[preceding-sibling::center//h3[@id="gsl_case_name"]]\ | |
| //div[@class="gsc_value" and preceding-sibling::div[text()="Docket id"]]', | |
doc, null, XPathResult.ANY_TYPE, null).iterateNext(); | |
if (docNumFrag) { | |
this.v.docketNumber = docNumFrag.textContent | |
.replace(/^\s*[Nn][Oo](?:.|\s+)\s*/, "") | |
.replace(/\.\s*$/, ""); | |
} | |
}; | |
ItemFactory.prototype.getAttachments = function (doctype) { | |
var i, ilen, attachments; | |
var attachmentTitle = "Google Scholar " + doctype; | |
attachments = []; | |
for (i = 0, ilen = this.attachmentLinks.length; i < ilen; i += 1) { | |
if (!this.attachmentLinks[i]) continue; | |
if ("string" === typeof this.attachmentLinks[i]) { | |
attachments.push({ | |
title: attachmentTitle, | |
url:this.attachmentLinks[i], | |
type:"text/html" | |
}); | |
} else { | |
// DOM fragment and parent doc | |
var block = this.attachmentLinks[i]; | |
var doc = block.ownerDocument; | |
// String content (title, url, css) | |
var title = doc.getElementsByTagName("title")[0].textContent; | |
var url = doc.documentURI; | |
var css = "*{margin:0;padding:0;}div.mlz-outer{width: 60em;margin:0 auto;text-align:left;}body{text-align:center;}p{margin-top:0.75em;margin-bottom:0.75em;}div.mlz-link-button a{text-decoration:none;background:#cccccc;color:white;border-radius:1em;font-family:sans;padding:0.2em 0.8em 0.2em 0.8em;}div.mlz-link-button a:hover{background:#bbbbbb;}div.mlz-link-button{margin: 0.7em 0 0.8em 0;}"; | |
// head element | |
var head = doc.createElement("head"); | |
head.innerHTML = '<title>' + title + '</title>'; | |
head.innerHTML += '<style type="text/css">' + css + '</style>'; | |
var attachmentdoc = Zotero.Utilities.composeDoc(doc, head, block); | |
attachments.push({ | |
title: attachmentTitle, | |
document:attachmentdoc | |
}); | |
// URL for this item | |
this.item.url = url; | |
} | |
} | |
return attachments; | |
}; | |
ItemFactory.prototype.pushAttachments = function (doctype) { | |
this.item.attachments = this.getAttachments(doctype); | |
}; | |
/* | |
ItemFactory.prototype.getBibtexData = function (callback) { | |
if (!this.bibtexData) { | |
if (this.bibtexData !== false) { | |
Zotero.Utilities.doGet(this.bibtexLink, function(bibtexData) { | |
if (!bibtexData.match(/title={{}}/)) { | |
this.bibtexData = bibtexData; | |
} else { | |
this.bibtexData = false; | |
} | |
callback(this.bibtexData); | |
}); | |
return; | |
} | |
} | |
callback(this.bibtexData); | |
}; | |
*/ | |
ItemFactory.prototype.saveItem = function () { | |
var i, ilen, key; | |
if (this.v.title) { | |
this.repairTitle(); | |
if (this.vv.volRepPag.length) { | |
var completed_items = []; | |
for (i = 0, ilen = this.vv.volRepPag.length; i < ilen; i += 1) { | |
this.item = new Zotero.Item("case"); | |
for (key in this.vv.volRepPag[i]) { | |
if (this.vv.volRepPag[i][key]) { | |
this.item[key] = this.vv.volRepPag[i][key]; | |
} | |
} | |
this.saveItemCommonVars(); | |
if (i === (this.vv.volRepPag.length - 1)) { | |
this.pushAttachments("Judgement"); | |
} | |
this.item.itemID = "" + bogusItemID; | |
bogusItemID += 1; | |
completed_items.push(this.item); | |
} | |
if (completed_items.length === 0) { | |
throw new Error("Failed to parse \"" + this.citelet + "\""); | |
} | |
for (i = 0, ilen = completed_items.length; i < ilen; i += 1) { | |
for (j = 0, jlen = completed_items.length; j < jlen; j += 1) { | |
if (i === j) { | |
continue; | |
} | |
completed_items[i].seeAlso.push(completed_items[j].itemID); | |
} | |
completed_items[i].complete(); | |
} | |
} else { | |
this.item = new Zotero.Item("case"); | |
this.saveItemCommonVars(); | |
this.pushAttachments("Judgement"); | |
this.item.complete(); | |
} | |
} else { | |
throw new Error("Failed to find title in \"" + this.citelet + "\""); | |
} | |
}; | |
ItemFactory.prototype.saveItemCommonVars = function () { | |
for (key in this.v) { | |
if (this.v[key]) { | |
this.item[key] = this.v[key]; | |
} | |
} | |
}; | |
/* | |
Test Case Descriptions: (these have not been included in the test case JSON below as per | |
aurimasv's comment on https://github.com/zotero/translators/pull/833) | |
"description": "Legacy test case", | |
"url": "http://scholar.google.com/scholar?q=marbury&hl=en&btnG=Search&as_sdt=1%2C22&as_sdtp=on", | |
"description": "Legacy test case", | |
"url": "http://scholar.google.com/scholar?hl=en&q=kelo&btnG=Search&as_sdt=0%2C22&as_ylo=&as_vis=0", | |
"description": "Legacy test case", | |
"url": "http://scholar.google.com/scholar?hl=en&q=smith&btnG=Search&as_sdt=0%2C22&as_ylo=&as_vis=0", | |
"description": "Legacy test case", | |
"url": "http://scholar.google.com/scholar?hl=en&q=view+of+the+cathedral&btnG=Search&as_sdt=0%2C22&as_ylo=&as_vis=0", | |
"description": "Legacy test case", | |
"url": "http://scholar.google.com/scholar?hl=en&q=clifford&btnG=Search&as_sdt=0%2C22&as_ylo=&as_vis=0", | |
"description": "Legacy test case", | |
"url": "http://scholar.google.com/scholar_case?case=9834052745083343188&q=marbury+v+madison&hl=en&as_sdt=2,5", | |
"description": "Decided date not preceded by any word or any other date line", | |
"url": "http://scholar.google.com/scholar_case?case=11350538941232186766", | |
"description": "Decided date preceded by 'Dated'", | |
"url": "http://scholar.google.com/scholar_case?case=4250138655935640563", | |
"description": "Decided date preceded by 'Released'", | |
"url": "http://scholar.google.com/scholar_case?case=8121501341214166807", | |
"description": "Decided date preceded by 'Decided' and also by a 'Submitted' date line", | |
"url": "http://scholar.google.com/scholar_case?case=834584264358299037", | |
"description": "Decided date preceded by 'Decided' and also by an 'Argued' date line", | |
"url": "http://scholar.google.com/scholar_case?case=15235797139493194004", | |
"description": "Decided date preceded by 'Decided' and also by an 'Argued' date line and followed by an 'As Modified' line; most citers of this case appear to use the Decided date, not the As Modified date", | |
"url": "http://scholar.google.com/scholar_case?case=163483131267446711", | |
*/ | |
/** BEGIN TEST CASES **/ | |
var testCases = [ | |
{ | |
"type": "web", | |
"url": "http://scholar.google.com/scholar?q=marbury&hl=en&btnG=Search&as_sdt=1%2C22&as_sdtp=on", | |
"items": "multiple" | |
}, | |
{ | |
"type": "web", | |
"url": "http://scholar.google.com/scholar?hl=en&q=kelo&btnG=Search&as_sdt=0%2C22&as_ylo=&as_vis=0", | |
"items": "multiple" | |
}, | |
{ | |
"type": "web", | |
"url": "http://scholar.google.com/scholar?hl=en&q=smith&btnG=Search&as_sdt=0%2C22&as_ylo=&as_vis=0", | |
"items": "multiple" | |
}, | |
{ | |
"type": "web", | |
"url": "http://scholar.google.com/scholar?hl=en&q=view+of+the+cathedral&btnG=Search&as_sdt=0%2C22&as_ylo=&as_vis=0", | |
"items": "multiple" | |
}, | |
{ | |
"type": "web", | |
"url": "http://scholar.google.com/scholar?hl=en&q=clifford&btnG=Search&as_sdt=0%2C22&as_ylo=&as_vis=0", | |
"items": "multiple" | |
}, | |
{ | |
"type": "web", | |
"url": "http://scholar.google.com/scholar_case?case=9834052745083343188&q=marbury+v+madison&hl=en&as_sdt=2,5", | |
"items": [ | |
{ | |
"itemType": "case", | |
"caseName": "Marbury v. Madison", | |
"creators": [], | |
"dateDecided": "1803", | |
"court": "Supreme Court", | |
"firstPage": "137", | |
"itemID": "1", | |
"reporter": "US", | |
"reporterVolume": "5", | |
"attachments": [ | |
{ | |
"title": "Google Scholar Judgement", | |
"type": "text/html" | |
} | |
], | |
"tags": [], | |
"notes": [], | |
"seeAlso": [] | |
} | |
] | |
}, | |
{ | |
"type": "web", | |
"url": "http://scholar.google.com/scholar_case?case=11350538941232186766", | |
"items": [ | |
{ | |
"itemType": "case", | |
"caseName": "Meier ex rel. Meier v. Sun Intern. Hotels, Ltd.", | |
"creators": [], | |
"dateDecided": "April 19, 2002", | |
"court": "Court of Appeals, 11th Circuit", | |
"firstPage": "1264", | |
"itemID": "1", | |
"reporter": "F. 3d", | |
"reporterVolume": "288", | |
"attachments": [ | |
{ | |
"title": "Google Scholar Judgement", | |
"type": "text/html" | |
} | |
], | |
"tags": [], | |
"notes": [], | |
"seeAlso": [] | |
} | |
] | |
}, | |
{ | |
"type": "web", | |
"url": "http://scholar.google.com/scholar_case?case=4250138655935640563", | |
"items": [ | |
{ | |
"itemType": "case", | |
"caseName": "Patio Enclosures, Inc. v. Four Seasons Marketing Corp.", | |
"creators": [], | |
"dateDecided": "September 21, 2005", | |
"court": "Court of Appeals, 9th Appellate Dist.", | |
"extra": "{:jurisdiction: Ohio}", | |
"firstPage": "4933", | |
"itemID": "1", | |
"reporter": "Ohio", | |
"reporterVolume": "2005", | |
"attachments": [ | |
{ | |
"title": "Google Scholar Judgement", | |
"type": "text/html" | |
} | |
], | |
"tags": [], | |
"notes": [], | |
"seeAlso": [] | |
} | |
] | |
}, | |
{ | |
"type": "web", | |
"url": "http://scholar.google.com/scholar_case?case=8121501341214166807", | |
"items": [ | |
{ | |
"itemType": "case", | |
"caseName": "Click v. Estate of Click", | |
"creators": [], | |
"dateDecided": "June 13, 2007", | |
"court": "Court of Appeals, 4th Appellate Dist.", | |
"extra": "{:jurisdiction: Ohio}", | |
"firstPage": "3029", | |
"itemID": "1", | |
"reporter": "Ohio", | |
"reporterVolume": "2007", | |
"attachments": [ | |
{ | |
"title": "Google Scholar Judgement", | |
"type": "text/html" | |
} | |
], | |
"tags": [], | |
"notes": [], | |
"seeAlso": [] | |
} | |
] | |
}, | |
{ | |
"type": "web", | |
"url": "http://scholar.google.com/scholar_case?case=834584264358299037", | |
"items": [ | |
{ | |
"itemType": "case", | |
"caseName": "Kenty v. Transamerica Premium Ins. Co.", | |
"creators": [], | |
"dateDecided": "July 5, 1995", | |
"court": "Supreme Court", | |
"extra": "{:jurisdiction: Ohio}", | |
"firstPage": "415", | |
"itemID": "1", | |
"reporter": "Ohio St. 3d", | |
"reporterVolume": "72", | |
"attachments": [ | |
{ | |
"title": "Google Scholar Judgement", | |
"type": "text/html" | |
} | |
], | |
"tags": [], | |
"notes": [], | |
"seeAlso": [] | |
} | |
] | |
}, | |
{ | |
"type": "web", | |
"url": "http://scholar.google.com/scholar_case?case=15235797139493194004", | |
"items": [ | |
{ | |
"itemType": "case", | |
"caseName": "Tinker v. Des Moines Independent Community School Dist.", | |
"creators": [], | |
"dateDecided": "February 24, 1969", | |
"court": "Supreme Court", | |
"firstPage": "503", | |
"itemID": "1", | |
"reporter": "US", | |
"reporterVolume": "393", | |
"attachments": [ | |
{ | |
"title": "Google Scholar Judgement", | |
"type": "text/html" | |
} | |
], | |
"tags": [], | |
"notes": [], | |
"seeAlso": [] | |
} | |
] | |
}, | |
{ | |
"type": "web", | |
"url": "http://scholar.google.com/scholar_case?case=163483131267446711", | |
"items": [ | |
{ | |
"itemType": "case", | |
"caseName": "Kaimowitz v. Board of Trustees of U. of Illinois", | |
"creators": [], | |
"dateDecided": "December 23, 1991", | |
"court": "Court of Appeals, 7th Circuit", | |
"firstPage": "765", | |
"itemID": "1", | |
"reporter": "F. 2d", | |
"reporterVolume": "951", | |
"attachments": [ | |
{ | |
"title": "Google Scholar Judgement", | |
"type": "text/html" | |
} | |
], | |
"tags": [], | |
"notes": [], | |
"seeAlso": [] | |
} | |
] | |
}, | |
{ | |
"type": "web", | |
"url": "https://scholar.google.com/scholar_case?case=608089472037924072", | |
"items": [ | |
{ | |
"itemType": "case", | |
"caseName": "Kline v. Mortgage Electronic Security Systems", | |
"creators": [], | |
"dateDecided": "February 27, 2013", | |
"court": "Dist. Court", | |
"docketNumber": "Case No. 3:08cv408", | |
"extra": "{:jurisdiction: SD Ohio}", | |
"attachments": [ | |
{ | |
"title": "Google Scholar Judgement", | |
"type": "text/html" | |
} | |
], | |
"tags": [], | |
"notes": [], | |
"seeAlso": [] | |
} | |
] | |
}, | |
{ | |
"type": "web", | |
"url": "https://scholar.google.de/citations?view_op=view_citation&hl=de&user=INQwsQkAAAAJ&citation_for_view=INQwsQkAAAAJ:u5HHmVD_uO8C", | |
"items": [ | |
{ | |
"itemType": "journalArticle", | |
"title": "Linked data-the story so far", | |
"creators": [ | |
{ | |
"firstName": "Christian", | |
"lastName": "Bizer", | |
"creatorType": "author" | |
}, | |
{ | |
"firstName": "Tom", | |
"lastName": "Heath", | |
"creatorType": "author" | |
}, | |
{ | |
"firstName": "Tim", | |
"lastName": "Berners-Lee", | |
"creatorType": "author" | |
} | |
], | |
"date": "2009", | |
"itemID": "bizer2009linked", | |
"libraryCatalog": "Google Scholar", | |
"pages": "205–227", | |
"publicationTitle": "Semantic services, interoperability and web applications: emerging concepts", | |
"attachments": [ | |
{ | |
"title": "Snapshot" | |
}, | |
{ | |
"title": "Fulltext", | |
"mimeType": "application/pdf" | |
} | |
], | |
"tags": [], | |
"notes": [], | |
"seeAlso": [] | |
} | |
] | |
}, | |
{ | |
"type": "web", | |
"url": "https://scholar.google.de/citations?user=INQwsQkAAAAJ&hl=de&oi=sra", | |
"items": "multiple" | |
}, | |
{ | |
"type": "web", | |
"url": "https://scholar.google.be/scholar?hl=en&as_sdt=1,5&as_vis=1&q=%22transformative+works+and+cultures%22&scisbd=1", | |
"items": "multiple" | |
} | |
] | |
/** END TEST CASES **/ |