MRLookup

Extract BibTeX data automatically and modify BibTeX Key to AUTHOR_YEAR_TITLE.

目前為 2017-11-14 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @namespace     https://openuserjs.org/users/van141.abelgmail.com
// @name          MRLookup
// @description   Extract BibTeX data automatically and modify BibTeX Key to AUTHOR_YEAR_TITLE.
// @copyright     2017, Van Abel (https://openuserjs.org/users/van141.abelgmail.com)
// @license       OSI-SPDX-Short-Identifier
// @version       1.5
// @include     http://www.ams.org/mrlookup
// @include     https://mathscinet.ams.org/mrlookup
// @include     http://www.ams.org/mathscinet/search/publications.html?fmt=bibtex*
// @grant       GM_setClipboard
// ==/UserScript==

// ==OpenUserJS==
// @author Van Abel
// ==/OpenUserJS==

/**
  *
  * Please begin typing or paste your Userscript now.
  *
  */

/*The first word to ignore in title*/
var IgnoreStringInTitle = [
  'a',
  'an',
  'on',
  'the',
  'another'
];
function IgnoreStringToRegExp(arr) {
  var regexp = '^(';
  var arrlen = arr.length;
  for (var i = 0; i < arrlen; i++) {
    if (i == arrlen - 1) {
      regexp += '(' + arr[i] + ')';
    } else {
      regexp += '(' + arr[i] + ')|';
    }
  }
  regexp += ')\\s*';
  return regexp;
}//console.log(IgnoreStringToRegExp(IgnoreStringInTitle));
/*split bibdata*/

function parseBibTexLine(text) {
  var m = text.match(/^\s*(\S+)\s*=\s*/);
  if (!m) {
    console.log('line: "' + text + '"');
    throw new Error('Unrecogonised line format');
  }
  var name = m[1];
  var search = text.slice(m[0].length);
  var re = /[\n\r,{}]/g;
  var braceCount = 0;
  var length = m[0].length;
  do {
    m = re.exec(search);
    if (m[0] === '{') {
      braceCount++;
    } else if (m[0] === '}') {
      if (braceCount === 0) {
        throw new Error('Unexpected closing brace: "}"');
      }
      braceCount--;
    }
  } while (braceCount > 0);
  return {
    field: name,
    value: search.slice(0, re.lastIndex),
    length: length + re.lastIndex + m[0].length
  };
}
function parseBibTex(text) {
  var m = text.match(/^\s*@([^{]+){([^,\n]+)[,\n]/);
  if (!m) {
    throw new Error('Unrecogonised header format');
  }
  var result = {
    typeName: m[1].trim(),
    citationKey: m[2].trim()
  };
  text = text.slice(m[0].length).trim();
  while (text[0] !== '}') {
    var pair = parseBibTexLine(text);
    result[pair.field] = pair.value;
    text = text.slice(pair.length).trim();
  }
  return result;
}
var els = document.getElementsByTagName('pre');
for (var i = 0, l = els.length; i < l; i++) {
  var el = els[i];
  var bibdata = parseBibTex(el.innerHTML);
  /*Extract author*/
  //var aureg = new RegExp('(?:(\\w+),(?:[^,}](?!and))+)+', 'g');
  //console.log(audata.match(aureg));
  var audata = bibdata.AUTHOR;
  //clean author include \v+space and $\cmd$
  audata = audata.replace(/\\[a-z]\s|(\$.*?\$)|(\\")/gi, '');
  //console.log(audata);
  //remove doublw , in one name
  audata = audata.replace(/(?:(?:and)?(\w+,\s*\w+\.)(,.*?)?)+/g, '$1');
  //console.log(audata);
  //extract first name
  audata = audata.replace(/(?:(\w+),(?:[^,}](?!and))+)+/g, '$1');
  //console.log(audata);
  var cleanreg = new RegExp('\\s*and\\s*|[{}\\\\\'\\\\\\"]', 'g');
  //console.log(cleanreg);
  var au = audata.replace(cleanreg, '');
  //console.log(au);
  /*Extract Year*/
  var year = bibdata.YEAR.replace(cleanreg, '');
  //console.log(year);
  /*Extract Title*/
  var title = bibdata.TITLE;
  //clean \cmd+space
  title = title.replace(/\\\w+\s*/g, '');
  var titleclean = new RegExp(IgnoreStringToRegExp(IgnoreStringInTitle), 'gi');
  //we don't need to clean and, but we need to clean -,{,},: and ,
  //var cleanreg = new RegExp('[{}:-]|,|(\\r\\s*)|(\\n\\s*)', 'g');
  title = title.replace(/[\\\'\"{}:-]|,|(\r\s*)|(\n\s*)/g, '');
  //var cleandollar = new RegExp('\\$.*?\\$', 'g');
  title = title.replace(/\$.*?\$/g, '');
  var titlefinal = title.replace(titleclean, '');
  while (title != titlefinal) {
    //recursively remove the ignore word
    title = titlefinal;
    titlefinal = title.replace(titleclean, '');
  } //var titlereg = new RegExp('(\\w+)(\\s*\\w+)*', 'gi');

  title = title.replace(/(\w+).*$/gi, '$1').replace(/\s*/g, '');
  var bibkey = au + year + title;
  //console.log(bibkey);
  var bibkeyreg = new RegExp('MR\\d+', 'gi');
  el.innerHTML = el.innerHTML.replace(bibkeyreg, bibkey);
  /*click to copy to clipboard*/
  el.addEventListener('click', function () {
    //Actual new line break
    //var linebreakreg = new RegExp('\\r|\\n', 'g');
    var bibdata_lb = this.innerHTML.replace(/\r|\n/g, '\r\n').replace(/^\r\n/g, '').replace(/\s*$/g, '\r\n').replace(/\r\n\r\n/g, '\r\n');
    GM_setClipboard(bibdata_lb);
  });
}