LT Copy Book - LibraryThing

Copies book data and automatically pastes it to a manual entry.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name           LT Copy Book - LibraryThing
// @namespace      http://userscripts.org/users/brightcopy
// @description    Copies book data and automatically pastes it to a manual entry.
// @include        http*://*.librarything.tld/work*/details/*
// @include        http*://*.librarything.tld/addnew.php
// @grant          GM_setValue
// @grant          GM_getValue
// @grant          GM_deleteValue
// @version        2
// ==/UserScript==

var ltcbTitle       = { key:'ltcbTitle'       , id:'bookedit_title'         , field:'form_title'          };
var ltcbAuthor      = { key:'ltcbAuthor'      , id:'bookedit_authorunflip'  , field:'form_authorunflip'   };
var ltcbDate        = { key:'ltcbDate'        , id:'bookedit_date'          , field:'form_date'           };
var ltcbPublication = { key:'ltcbPublication' , id:'bookedit_publication'   , field:'form_publication'    };
var ltcbISBN        = { key:'ltcbISBN'        , id:'bookedit_ISBN'          , field:'form_ISBN'           };
var ltcbLCCN        = { key:'ltcbLCCN'        , id:'bookedit_lccallnumber'  , field:'form_lccallnumber'   };
var ltcbDewey       = { key:'ltcbDewey'       , id:'bookedit_dewey'         , field:'form_dewey'          };
var ltcbLanguage    = { key:'ltcbLanguage'    , id:'bookedit_lang'          , field:'field_lang'          };
var ltcbLanguage2   = { key:'ltcbLanguage2'   , id:'bookedit_lang2'         , field:'field_lang2'         };
var ltcbLanguageO   = { key:'ltcbLanguageO'   , id:'bookedit_lang_original' , field:'field_lang_original' };
//var ltcbVolumes     = { key:'ltcbVolumes'     , id:'bookedit_numVolumes'    , field:'numVolumes'          , path:'//td[text()="Number of Volumes"]/../td[@class="bookeditfield"]'};
//var ltcbPages       = { key:'ltcbPages'       , id:'bookedit_pagecount'     , field:'pagecount'           , path:'//td[text()="Pages"]/../td[@class="bookeditfield"]'};

var ltcbCollection       = { key:'ltcbCollection'       };
var ltcbAddToLibrary     = { key:'ltcbAddToLibrary'     };
var ltcbAddToWishlist    = { key:'ltcbAddToWishlist'    };

var ltcbOtherAuthorCount = { key:'ltcbOtherAuthorCount'                     };
var ltcbOtherAuthorRole  = { key:'ltcbOtherAuthorRole'  , field:'person_role-' };
var ltcbOtherAuthorName  = { key:'ltcbOtherAuthorName'  , field:'person_name-' };
var ltcbAuthorRole       = { key:'ltcbAuthorRole'       , field:'person_role_main' };

function getById(setting) {
  var e = document.getElementById(setting.id);
  return e ? e.textContent : '';
}

function save(setting, callback) {
  var value = getById(setting);
  if (callback)
    value = callback(value);
  
  GM_setValue(setting.key, value);
}

function setNonGreen(setting) {
  var e = document.getElementById(setting.id);
  var value = (e && e.innerHTML == e.textContent) ? e.textContent : '';
  GM_setValue(setting.key, value);
}

function load(form, setting, opt) {
  var key = setting.key + (opt != undefined ? opt : '');
  var field = setting.field + (opt != undefined ? opt : '');
  var value = GM_getValue(key);
  var elem = form.elements.namedItem(field);

//  console.log('load: ' + key + ', ' + field + ', ' + value);
  
  if (elem)
    elem.value = value;
}

function loadRole(form, setting, opt) {
  if (!loadOption(form, setting, opt)) {
    var key = setting.key + (opt != undefined ? opt : '');
    var field = setting.field + (opt != undefined ? opt : '');
    var menu = form.elements.namedItem(field);
    if (menu) {
      var value = GM_getValue(key);
  
      var lastoption = menu.options.length;
      menu.options[lastoption - 2] = new Option(value, value);
      menu.options[lastoption - 1] = new Option("--------------", "");
      menu.options[lastoption] = new Option("Other...", "");
      menu.options.selectedIndex = lastoption - 2; 
    }
  }
}

function loadOption(form, setting, opt) {
  var key = setting.key + (opt != undefined ? opt : '');
  var field = setting.field + (opt != undefined ? opt : '');
  
  var value = GM_getValue(key);

  var select = form.elements.namedItem(field);
  if (select == null)
    return false;
  
  var option = $x1('option[text() = "' + value + '"]', select);

  if (option) {
    select.value = option.value;
    return true;
  }
  else
    return false;
}

function fixAuthorName(value) {
  var newvalue = value.replace(
      /^(.+) ([^ ,]+),? (JR|SR|III|IV|V|VI|VII|VIII|IX)(.?)$/i, '$2, $1, $3$4');
  if (newvalue != value)
    value = newvalue;
  else
    value = value.replace(/^(.+) ([^ ]+)$/, '$2, $1');

  return value;
}

function addToLibraryClick(e) {
  addToClick(1);
}

function addToWishlistClick() {
  addToClick(4)
}

function fixLang(value) {
  if (value == '')
    value = '(blank)';
  
  return value;
}

function addToClick(c) {
  GM_setValue(ltcbCollection.key, c);
  
  save(ltcbTitle);
  save(ltcbPublication);
  save(ltcbLanguage, fixLang);
  save(ltcbLanguage2, fixLang);
  save(ltcbLanguageO, fixLang);

  save(ltcbDate,
      function (value) {
        if (value == '?')
          value = '';
        
        return value;
      }
  );

  save(ltcbISBN,
      function (value) {
        return (value + ' / ').split(' / ')[0];
      }
  );

  var authorTD = document.getElementById(ltcbAuthor.id);
  if (authorTD) {
    GM_setValue(ltcbAuthor.key, fixAuthorName(authorTD.firstChild.textContent));

    var elem = authorTD.lastChild;
    if (elem.nodeType == 3) //Node.TEXT_NODE
      GM_setValue(ltcbAuthorRole.key, elem.textContent.replace(/^ \((.+)\)$/, '$1'))
    else
      GM_setValue(ltcbAuthorRole.key, '');
  }
  
  
  // fields with possible green text
  setNonGreen(ltcbLCCN);
  setNonGreen(ltcbDewey);
  
  
  // Other Authors
  var others = $x("//div[@class='bookeditPerson']/span[@class='book_langLabel']");
  
  GM_setValue(ltcbOtherAuthorCount.key, others.snapshotLength);
  
  for (var i = 0; i < others.snapshotLength; i++) {
    var role = others.snapshotItem(i);
    var roleText = role.textContent;
    GM_setValue(ltcbOtherAuthorRole.key + i, roleText.substring(0, roleText.length - 3));
    
    var author = role.nextSibling;
    while (author && author.tagName != 'SPAN') {
      author = author.nextSibling;
    }
    if (author)
      GM_setValue(ltcbOtherAuthorName.key + i, author.textContent);
  }
}    

function createAddTo(id, text, bg) {
  return '<span class="ltbtn ltbtn-inline-block sp16  ltbtn-ff3 " style="margin-left: 0.5em;">'+
    '<a id="' + id + '" href="/addnew.php">'+
      '<div class="ltbtn-outer-box ltbtn-inline-block">'+
        '<div class="ltbtn-inner-box ltbtn-inline-block">'+
          '<div class="ltbtn-pos">'+
            '<div class="ltbtn-top-shadow"></div>' + 
            '<div class="ltbtn-content">'+
              '<div style="margin-right: 2px;" class="ltbtn-body ">'+
                '<span style="background-position: ' + bg + ';" class="sp_c  sp16 "></span>'+
                'Copy to ' + text + 
              '</div>'+
            '</div>'+
          '</div>'+
        '</div>'+
      '</div>'+
    '</a>' + 
  '</span>';
}

function readData() {
  if (document.getElementById('ltcbButtons') == null) {
    // Create Buttons
    var elem = $x1('//div[@class="book_bitHeadContent"]/table[@class="book_bitTable"]/tbody/tr');

    if (elem) {
      var td = document.createElement('td');
  
      var div = document.createElement('div');
      div.setAttribute('style', 'float: right');
      div.setAttribute('id', 'ltcbButtons');
      
      td.appendChild(div);
      elem.appendChild(td);
      div.innerHTML = 
        '<span style="font-size: 9px; font-weight: normal;">' +
          createAddTo(ltcbAddToLibrary.key, 'your library', '-17px -68px') +
          createAddTo(ltcbAddToWishlist.key, 'your wishlist', '-34px -68px') +
        '</span>';
  
      document.getElementById(ltcbAddToLibrary.key).addEventListener('click', addToLibraryClick, false);  
      document.getElementById(ltcbAddToWishlist.key).addEventListener('click', addToWishlistClick, false);  
    }
  }
}

/* ===== Click on an element (borrowed from Facebook Fixer, @namespace http://userscripts.org/people/14536) ===== */
function click(elm) {
     var evt = document.createEvent('MouseEvents');
     evt.initMouseEvent('click', true, true, window, 0, 1, 1, 1, 1, false, false, false, false, 0, null);
     elm.dispatchEvent(evt);
} 
  
function writeData() {
  var collection = GM_getValue(ltcbCollection.key);
  if (collection != undefined) {
    var f = document.getElementById('book_editForm');
    
    $x1('//td[@id="bookedit_tags"]//input[@value=' + collection + ']').checked = true;

    if (collection != 1) { // your library
      try {
        $x1('//td[@id="bookedit_tags"]//input[@value=1]').checked = false;
        click($x1('//div[@class="collectionListFooter"]/span[@id!=""]').firstChild);
      } catch (e) {
        console.log(e);
      }
    }

    load(f, ltcbTitle);
    load(f, ltcbAuthor);
    load(f, ltcbDate);
    load(f, ltcbPublication);
    load(f, ltcbISBN);
    load(f, ltcbLCCN);
    load(f, ltcbDewey);

    loadRole(f, ltcbAuthorRole);

    var otherAuthorCount = GM_getValue(ltcbOtherAuthorCount.key);

    if (otherAuthorCount)
      unsafeWindow.pcount = 1;
    
    for (var i = 0; i < otherAuthorCount; i++) {
      if (i)
        unsafeWindow.addPerson();
      
      load(f, ltcbOtherAuthorName, i);
      loadRole(f, ltcbOtherAuthorRole, i);
    }
    
    
    writeLangs();
  }
}

var langLoadCalled = false;

function writeLangs() {
  var f = document.getElementById('book_editForm');
  var success = loadOption(f, ltcbLanguage) 
      && loadOption(f, ltcbLanguage2) && loadOption(f, ltcbLanguageO);
  
  if (success)
    GM_deleteValue(ltcbCollection.key);
  else {
    if (!langLoadCalled) {
      langLoadCalled = true;
      unsafeWindow.book_updateLangMenus.call(unsafeWindow, 1);
    }
//    console.log('setting timeout');
    setTimeout(writeLangs, 100);
  }
}

function $x(x, t, r) {
    if (t && t.nodeType) 
        var h = r, r = t, t = h;    
    var d = r ? r.ownerDocument || r : r = document, p;
    switch (t) {
      case XPathResult.NUMBER_TYPE:
          p = 'numberValue';
          break;
      case XPathResult.STRING_TYPE:
          p = 'stringValue';
          break;
      case XPathResult.BOOLEAN_TYPE:
          p = 'booleanValue';
          break;
      case XPathResult.ANY_UNORDERED_NODE_TYPE:
      case XPathResult.FIRST_ORDERED_NODE_TYPE:
          p = 'singleNodeValue';
          break;
      default:
          return d.evaluate(x, r, null, 
              t || XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    }
    var result = d.evaluate(x, r, null, t, null);
    if (result != null)
      result = result[p];
    
    return result;
}

function $x1(x, r) {
  return $x(x, XPathResult.ANY_UNORDERED_NODE_TYPE, r)
} 

try {
  // find the values from the screen
  if (window.location.pathname.substring(0, '/work/'.length) == '/work/')
    readData()
  else if (window.location.pathname == '/addnew.php')
    writeData()
} catch (e) {
  console.log(e);
}