Tatoeba Visual Linker

Put a sentence into your "shopping cart" to easily link it to another sentence later.

  1. // ==UserScript==
  2. // @name Tatoeba Visual Linker
  3. // @namespace http://userscripts.org/users/61020
  4. // @description Put a sentence into your "shopping cart" to easily link it to another sentence later.
  5. // @include http://*.tatoeba.org/*
  6. // @include https://*.tatoeba.org/*
  7. // @match http://*.tatoeba.org/*
  8. // @match https://*.tatoeba.org/*
  9. // @grant GM_getValue
  10. // @grant GM_setValue
  11. // @require http://code.jquery.com/jquery-latest.min.js
  12. // @version 0.0.1.20150428074750
  13. // ==/UserScript==
  14.  
  15. // The Icon graphics included in this script can be found for free at http://www.famfamfam.com/lab/icons/silk/
  16. console.log('initializing');
  17. textfield_key = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFZSURBVDjL3ZM9S0JhGIbPH/APBEFQ7Q32gS0tlQ21iDVYJ/qAooaGliYRtKBBimrIwKSkooTGaiitFnvJjzLLPGXZCfVVRMWPo6ZwNzaZmlvDtT1cw831MACYWmD+gYAQglpgCCEoFot/glL6IygrKnwhYl1B6HwWcbepekHUbkCUzKGQIqCWCcQ5S+WC2MMRIlcsCgkjEm4VolYl3vaH4LkwViYImReQjx0iF1QiR7eQuFdC4FXg9H2VjRi5WUfatwzBP4MsPw/hfRQCJ4dD0wWGUopSBDzX4E+nETBPIullIbwMIOtTIPMsh0Mtxt3JbulAuM2WYd+2xCHwOmReZRC8PbCttqed6lbq0rTRA7ZB9muJHyapMxfcQdLVAeGpF/aNzoxO0Th+JqsTXbL1orIpfx5LST68hIy3H7Y1SUo/1jRS1S8QrXjx0dAdvtVK/HtTzYOl7r4BQSM7uFIKnq0AAAAASUVORK5CYII=';
  18. not_translation = 'data:image/png;base64,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';
  19. server_error = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAI4SURBVDjLpVPNaxNBFP9tNx9N0zW7ENRFE6ygpYaCNXrQkwWtFUUEc6hgD/0TxKsS1KOX4LlQEAUPfoAKpScDAcHUhI1VCr2kF4VWsRBCk93szPhmYqJt0pMLj8fMzu/jvTejCSHwP19g90a5XF7wff9Wq9UKUAZlFZ7nyfw8k8nc7EtQqVRiBJg3TTMTDg/BJRA4h/JHLi3LxNLS4gytegkcx5mW4Hg8figajaK6/g1SnXMBLjgRCTAic123fwl0eDGZTKqNRqOJFoFXKiUi4N24OHVZldGXQNYYCoVQq9XayozhROqkUhd/1GWz93QgmRmB5CE5FGm94ixTZkrdjv3CSNCHxs29HbR7JRSRJEiNn1LqEE0cFq9h2ZM4auZ7CAY6DjoEikQqs3btgUAe8cQ57LMnkDA2sPrq+pm+BF0w+9s4nf2AsfUFRtwEq71BYmIOzPXurTydDu4gkM3p3EjZODU+cmE0PuJIahZollF88gzDZgN+07tKca3HgZyCruuqbmk/7FWxPxaCYW2Du1Wqj4PVlzFy/o7mu+7D4uOzxr8OioVCAfV6HYZhYHAwgOHae5hJGuX2Z8I2kL4xCu59p39rODA+M+a73m2J1TrWc7ncFZrGfdu208fMTRqdhoPHI6RapPI8lF6uEskYND0GRC7h0/zdTcH5pLb7NWaz2akLVv7d6dmFoD6wDuFvyfns6LseGcXGVwdrbx+80Po95w+P0j8F40OyH0Lewm6Ibkb7dpZ+A2HofmbUgVesAAAAAElFTkSuQmCC';
  20. cart_delete = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ4SURBVDjLpZNLiFJRGMe/q1biA99UpqOilqALmYW6yM2MFLQtwU27bLbNLLSgidEethxcGLRTXIkbFyEYQlQu7qJNMD5AYXxcUZMRMhtf19s5NzRnExMdOPfAOff//f7fOd9HMAwD/zN4/ypIJpPMbDaD+XwOaL1PFAoF1sJisQCaps9M/NP6xEKj0QgOhwO63S6k0+kjHk7B5XKxgr+N6XQKqVSqbbPZ1LVaDbLZ7DEKGONhcrVaBaFQCK1WC9RqNdTrddBqtey+Xq+HSqUCJpMJJBKJutlsQqlUwgEfBAKBPM/tdhP5fJ4RCAQwGAyc6IDs9/vOyWRCIpvO8XhMdjoddm232+z+aDTC6VDYGQd/cH4ikQi7IDFZLBaTmIyIJCbLZDLSYrGAXC4nrVYrBmEHLawlls+YyWQYj8cD6FKh1+s5sRiTsZiiKKdSqSSRfadKpSIbjQaEQiFi5QAPZGm/WCyCwWBgyWazGaRSKUtWKBQkujzAQex2O6aviodYL6REIsEsn2vtrdmp6X6ByxQJvEEPRnwh8GfDJ7dy89fEeSqx4NMFxRp1+PqW9+IlgxVOv+ag+Ok9PSiXdtlKjMfjNxBlDxEfLonrDjZ/jGBzywv82geAjy9AIJGCXqfjnlSY3wFQTl6/378TjUZLSPAICQ+DweDh0kF+++WCf8VAwJ29Pz1wcBW4C0LPphCLxZ4i4XONRsMWEK60crm8cnHz6C1s370HwsY7mJx24CcKMPzOhXINqDN3EIlElo2yGw6HVw4++64dXBCL9jcUMw6P04Lhtzkcd7n0bMw8I87bzgXfxuPRSXuHSxM6mstQSPXmdm7+6heR5oijWAuHSQAAAABJRU5ErkJggg==';
  21. server_connect = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKFSURBVDjLpVPfSxRRFP52Z3aXXdOd1V11NbYHUUQRtRIi38pCCQoi6KWX/oRefeq1t94TgyCJhKiHWgwki4pgU3YxonzQ1BXBrXHd2Z2Ze2fuTPdef0Sl9NDA5dyBc77vO+c7N+D7Pv7nU/+VsLCwcN913RuO46g8gkd5KKUiPgocpaBQKMR5wYSmadcikRgIL4LnQWbzmkRCw8xM9nAF+Xx+VBQnk8n2uro6rHzbgGD3PB+e73EgH4yDEUIOB+DJ2UwmI++WZcPhxYuFeQ7gHZwLF8dkG38BPHj9I1Ovr0PXdXR3d+8yM4ae3gHJ7u+xi9Z/UzD1Vo9Sh005O8Wx5mgUiqIgl8thYGBQSi/kczwyyc44YPrSlV8KOKvKJ1qIhAKdqtaCT8ub6EhUZIJQwJiH3r6Tkn1fhb83g6Ds06ZtFnE7Y2FACXhQm7rwfjWCdMcg5uZeIfviKZgcoodS/Qomy3fBRykJJEDVpO2E/3AgrJdqCCkewlobJp7NS8+Hhk5j+vFDuMzF5Nd7WC1tShUHLRiWlVICQM32OZiNrW0H8ZiK9IkOvFt8g/7qMhKNTcJ+3Gq6Da9RrIInwaWCHcPqog6BaTuomARGzcZSUUfZIIgeP4XsR4bh4XN7FvoyCjChQCk1Xw4bJplNaWGlwgvDXIqq8B0PBrhdDGsrJZztaUUmHZV2it7FRsbjDdylD1DLhlVtiAVDYkg1i2B9YwfGdg1W1YZdJWiMEIxc70cymZKS91e/tSUlHVLLVXM26IdGP383UCzqjlOzxxl1l5hNSy6lGyNnyr0vZ57f4cV9+49JxF172RfVNMyrlS3niWuR865Fj+Wmb9I/lnONn+xRr/UnsVG4KayFAQcAAAAASUVORK5CYII=';
  22. cart_add = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJZSURBVDjLpVJda5JhGPYH9Ac66bSdFHTydtDhIAiCiA6CEbGiL1bUTgaO9pHk1+y11ymyNT/wYypMxzanqa8Km9PJxg5EJcWBJq7OzUHIRlfP/VQyKWLRCzcP78113dd1X8+jAKD4n/pngtfrhdPpxMLCAqxW6x1FLpcD1dbWFjY2NpBOpyHLMmKxGNbX17GysoJgMIhAIACPx8OxR0dHODg4gMlkKiuy2SyOj4/R7Xb/Wp1OBw6H41O73Ua1WoUkSQ2DwTCiyGQyvNFqtZDP59FsNkG9RqOBZDKJ/f19RCIRjgmFQiiXy9zRzMzMYC+DVCqF7e1tRKNRYXNzE8vLywKRFxcXBVrDZrMJRDabzYLP5+P7q9Xqgd6AeDyOYrHIM6jX6zwDUiZypVLpKbOBKBQKpI6pqakzfbewurqKw8NDJBIJsKSFcDhMSgLZZWEJRNbpdILdbicyfrtGBpzY3d1FrVYDkUl5aWkJpVKJBnJltgr29vagVCq//fEduN1uShrz8/OwWCyUNFjS0Gg0UBqe44VlCI/e3sDQ60FcU16cOPVDeiLdfKUK3kOkbEXhswwpOYLb0gVcfnpW5ACXy3We2Xs3NzdHScNoNEKv11PSmJ6exl3dVayVTFj7YKbdIaYeQko9pgFf+QAWFrczOzs7KoriR0YePeng+stLeF+24+QXLlppwA8Ae9MTLGl+XTs7O/D7/Tzp8fFxjI2N4cqzc3gj34dOHuZkXWK438Gv0mq1UKlUmJyc7HPAgOpb4gCM8gOuTCf99zI4TTGwntUXsv3z1FP/O6UL4ZoSeea0AAAAAElFTkSuQmCC';
  23. cart_remove = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACk0lEQVQ4y5WSTUjTYRzH16VLRgSRl24FdbCDl/9FjF7oEOGhg52CQlLWH8TNl7nl5hq4F9/Sbcpe1ZnbwL3gJglzKP7nNs01y9xgY4EpeuskDEJ8+fY8z0FaTqLDjwd+z+/7/f2ez/MTARCVi9r+qxeeRSpQ67mePq+GxrkXbxZvHY8kX0O/9BLVlivCfxlohBpMfJJgMR9A6NsEZB/rcbf/soveTU1NYXx8HHa7HaOjoy9EyWQSNOLxOARBwHvhMaY/KxErzMC/boIz8Q7elBm8/ymq9ZWs9vDwEHt7exgeHs6KEokEjo6OcHBwwMK4VA9dtA4WgUck60Zw3Q7e9wD3Rq6hSnvpeH9/H/l8HkNDQz/6+vp40fLyMkvs7u5idXUVOzs7oDlFuIYYfMDMVxueWCtZTSAQQDabhd/vR29v76NTBgsLC1hZWcHc3BwXi8UQDAa5t8H7iGRcCH2xoc5645iKTSYT5/F42Pt7enrunBpEIhFsbm4yBltbW4hGo5AHHkI6XYNXrio8d9xknd1uNzY2Nmh3dHd3V5T8QigUQrFYxPz8PAhpbnZ2lnbi6LgEFkfFer2eczqdVIwz30gKlalUCoVCAVScy+Xg8/mQyWSoIevscDiQTqchl8tPyu7B5OQkxsbGYLVaYTabKWkQ0tBqtdBoNFCr1QiHw2hvbz/55yaWi87OzottbW1oaWn5WWLgcrluk/FsFouFksbg4CAMBgMlzbp2dXVBJpOhtbWVvZ3n+WKJAYGlpKfRaJQMDAxsE7Hk7+5SqVTS3Ny8TcSSpqamXyUGZKeVhDRblLW1NXi9XkZaoVCgo6MDRAybzcbWmNSioaHhe1kGOp2OwVKpVGcmEIvFksbGRirGn/nfGF/N1BNy810AAAAASUVORK5CYIIK';
  24. cart_error = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKoSURBVDjLpZLbT5JhHMdZ1/VP1Cqrtco21kU3zevWVa3NXOuuedVmoU2jUR6CoRwcw1SYHIzJQQxBUXgLXg6Ga+mIwkBBBp08pYGvEOa393nbWC5Xa1389mzPnu/v+/t+nh8PAO9/6p8FBoMBWq0Wvb29UKlU13ihUAikAoEAfD4fKIrC5OQkxsfHMTo6CrvdDovFApPJBL1ez70tl8vI5XKQy+UxXjAYxPb2Nkql0h8rn89Do9G839jYwNzcHGQyWVoikdTzaJrmLrLZLKamppDJZEDu0uk0PB4PkskknE4n98ZqtSIWi3ETicXimgoDr9eLcDgMl8vF9/v9sNlsfCI2Go18EqOvr49PxEqlkj84OMjlb21trao0cLvdiEajHINUKsUxIM5EHI/HQTmUmKcFGHqixezsLHGHUCjcv+sXRkZGUCgUMDExAZY03+FwECf+sNWEhLs2vZq0YMZeZ+zv7ydi/PaNbK6W6elpJBIJEDFxNpvNiIdUWI4bUS7M4/XwFbwKO9DU1LSz5x7odDpCGj09Peju7kafqg1R62UUl50ofujC2oILkaGbENxp2PnrIr21Xdr3xnzRsPLOimL2AehHZ/Ft1YoZbQ1kwutfdzUYGBg4ypJ+rFarCWl0dnZCIxcgTTWjtKQHM38DdMcZbGUasZ4ag6frwveI4tyBSgMWVgs5FQrFLalUuigVtzWwTi+/sOC2Fm9jM3H1ZyXr2ChyZPxKhCTVwkoDdqdb2LXkFiUSiWBM14wM3YXSJzXnvpmsZSNUcyeTqgfz8Snohyc/+0Unju/K3d7eDpFIhJD8/DqzsoDSGoXiEstgyfJL2VDOx5B7YcSz5iOWPQGy460EO04zgbZTDOvEsE6M7/4x5vm9KoYVMdTdwwzVeIjxCg4GfgDxYPxXmKLFvgAAAABJRU5ErkJggg==';
  25. textfield_add = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADTSURBVDjLY/j//z8DJZhhGBhw8uTJ/5RgsAF//vwhC7948QJhADkGDTEDtp9c+790ZsL/tD7//4ldXv+X7pmBagA+vOnosv+NqxP/b7ky9f+FZ7v+9+/O+h/er/u/fXHZfwaQKYRwYpfn/42XJ/zfeG3SfxDo2ZP6v39P+n/bfHniEotPteH/bVfm/EcGmy5N/W+eLUmcAZY50t+7dyX9b9+VANbcvjMB7AKgAd+JMgCosCW4R+N/764UsM0gGsQHivcQneaBijuA+BPI2VC6AyQOAPdpPzVHO/APAAAAAElFTkSuQmCC';
  26. not_translation_color = '#F15F74';
  27. not_translation_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIGhlaWdodD0iMTZweCIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMjMgMTYiCiAgIHdpZHRoPSIyMHB4IgogICBpZD0ic3ZnMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MXByZTQgcjEzNzEyIgogICBzb2RpcG9kaTpkb2NuYW1lPSJ0cmFuc2xhdGlvbi1pbmRpcmVjdC1ob3ZlcmVkX3JlZC5zdmciPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEwMjQiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNzA1IgogICAgIGlkPSJuYW1lZHZpZXcxNSIKICAgICBpbmtzY2FwZTp6b29tPSIxNC43NSIKICAgICBpbmtzY2FwZTpjeD0iMTAiCiAgICAgaW5rc2NhcGU6Y3k9IjgiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzIiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczYiPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTIuNDg5MzgsMTYgMCwtNC44NDg0ODUgQyAxMi40ODkzOCwxMS4xNTE1MTUgMC4xODc5ODgyOCwxMS4yMjcxNTQgMCwwIDYuMjE4MzgzOCwxMC4zNDkxOTUgMTIuNDkwMDAyLDYuNzg3ODc4OCAxMi40OTAwMDIsNi43ODc4Nzg4IEwgMTIuNDg5MzgsMS45MzkzOTM5IDIyLjA4ODc0NSw4Ljk2OTY5NyAxMi40ODkzOCwxNiBsIDAsMCB6IG0gMS4wMTk1MzIsLTIuMDA1MDkgMCwtMy43NjM0OTQgYyAwLDAgLTkuNDQ2NDEyLDAuNjk0MDEgLTEyLjI0MzI4NywtNy4xMjAwMjg3IDUuMDI1MjY4NSw3LjgxNDAzODcgMTIuMjQzMjg2LDQuNDAxMTYgMTIuMjQzMjg2LDQuNDAxMTYgbCAxZS02LC0zLjY5MjQ3MTUgNi42OTU4LDUuMTQ5NjIxMiAtNi42OTU4LDUuMDI1MjEzIDAsMCB6IgogICAgICAgaWQ9InBhdGgtMSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzdHlsZT0iZmlsbDojZjE1Zjc0IiAvPgogIDwvZGVmcz4KICA8ZwogICAgIGZpbGw9Im5vbmUiCiAgICAgZmlsbC1ydWxlPSJldmVub2RkIgogICAgIGlkPSJtaXUiCiAgICAgc3Ryb2tlPSJub25lIgogICAgIHN0cm9rZS13aWR0aD0iMSI+CiAgICA8dXNlCiAgICAgICBoZWlnaHQ9IjEwMCUiCiAgICAgICB3aWR0aD0iMTAwJSIKICAgICAgIHk9IjAiCiAgICAgICB4PSIwIgogICAgICAgaWQ9IiIKICAgICAgIHhsaW5rOmhyZWY9IiNwYXRoLTEiIC8+CiAgPC9nPgo8L3N2Zz4K';
  28. default_shopping = {
  29. };
  30. default_shopping = JSON.stringify(default_shopping);
  31. //BEGIN USER STATS
  32. shopping = GM_getValue('shopping');
  33. shopping = shopping || default_shopping;
  34. shopping = JSON.parse(shopping);
  35. console.log('shopping: ' + JSON.stringify(shopping));
  36. automatically_numeric = GM_getValue('automatically_numeric');
  37. automatically_numeric = automatically_numeric || false;
  38. setup = false;
  39. if (window.location.href.split('/') [4] == 'user' && window.location.href.split('/') [5] == 'profile' && window.location.href.split('/') [6] == $('.menuSection').attr('href').split('/') [4]) {
  40. setup = true;
  41. if ($('.userscriptSettings').is('*')) {
  42. settings = $('.userscriptSettings');
  43. }
  44. else {
  45. settings = $('<div class="module profileSummary userscriptSettings"><h2>userscripts</h2></div>');
  46. $('.profileSummary').after(settings);
  47. }
  48. settings.append('<h3>Visual Linker</h3>');
  49. contentdiv = $('<form id="visuallinker"></form>');
  50. settings.append(contentdiv);
  51. contentdiv.append('<table>');
  52. contentdiv.append('<tr><td><label for="delete" class="field">delete list</label></td><td><input type="button" id="shopping" value="delete list" ' + (shopping == default_shopping ? 'diabled="disabled"' : '') + '"></td></tr>');
  53. contentdiv.append('</table>');
  54. $('#shopping').click(function () {
  55. if (confirm('Really delete the whole shopping cart?')) {
  56. shopping = JSON.parse(default_shopping);
  57. GM_setValue('shopping', JSON.stringify(shopping));
  58. console.log('shopping: ' + JSON.stringify(shopping));
  59. }
  60. });
  61. }
  62. else {
  63. interface_lang = $('#languageSelection option[selected="selected"]').val();
  64. cart_button_add = $('<a class="audioButton cartButton notincart" style="background-image:url(' + cart_add + '); background-repeat: no-repeat;background-position: center center; float: right; margin: 0.5em 0 0 0;" title="Add this sentence to the \'shopping cart\'."></a>');
  65. cart_button_remove = $('<a class="audioButton cartButton incart" style="background-image:url(' + cart_delete + '); background-repeat: no-repeat;background-position: center center; float: right; margin: 0.5em 0 0 0;" title="Remove this sentence from the \'shopping cart\'."></a>');
  66. empty_cart_button = $('<li class="option tocart"><a title="Click to remove all items from the whole shopping cart."><img width="16" height="16" src="' + cart_remove + '"></a></li>');
  67. empty_cart_button.click(function (event) {
  68. event.preventDefault();
  69. if (confirm('Really delete the whole shopping cart?')) {
  70. shopping = JSON.parse(default_shopping);
  71. GM_setValue('shopping', JSON.stringify(shopping));
  72. console.log('shopping: ' + JSON.stringify(shopping));
  73. $('.sentences_set').each(function () {
  74. showcart($(this));
  75. });
  76. }
  77. });
  78. $('.sentences_set ul.menu .option.addToList').before(empty_cart_button);
  79. numeric = $('<li class="option numeric"><a title="Click to toggle sentence number input field. (Double-click to always show the input field.)"><img width="16" height="16" src="' + (automatically_numeric ? textfield_key : textfield_add) + '"></a></li>');
  80. numeric.click(function (event) {
  81. if (!$(this).parentsUntil('.sentences_set').parent().find('.cart #cart_0').is('*')) {
  82. add_numeric = $('<div class="sentence indirectTranslation" id="cart_0"><a class="translationIcon direct" style="background:none !important;" title="Not yet linked to main sentence (click to go to this sentence)"><div style="background:none !important;"></div></a><!-- a style="background-image:url(' + cart_delete + '); background-repeat: no-repeat;background-position: center center;" class="audioButton cartButton" alt="0" title="Remove this sentence from the \'shopping cart\'."></a--><a class="link button" title="Fetch sentence from server by number. Type the sentence\'s number into the textfield and hit the [enter] key."><img src="' + server_connect + '"></a><!--img width="30" height="20" src="http://flags.tatoeba.org/img/flags/unknown.png" class="languageFlag" alt="unknown" title="The language of the sentence cannot be known yet." --><a class="sentenceContent text"><input type="number" min="1" size="10" title="Fetch sentence from server by number. Type the sentence\'s number into the textfield and hit the [enter] key."></a></div>');
  83. $(add_numeric).find('input').keypress(function (event) {
  84. if (event.which == 13) {
  85. event.preventDefault();
  86. id = $(this).val();
  87. console.log(id);
  88. $(add_numeric).find('.link.button img').attr('src', 'http://flags.tatoeba.org/img/loading-small.gif');
  89. if (typeof (shopping[id]) == 'undefined') {
  90. imtheget = $.get('http://tatoeba.org/sentences/show/' + id, function (data) {
  91. if ($(data).find('.sentences_set').is('*')) {
  92. console.log(data);
  93. lang = $(data).find('.sentences_set .mainSentence .languageFlag').attr('src');
  94. cont = $(data).find('.sentences_set .mainSentence .sentenceContent').removeAttr('href').html();
  95. audio = $(data).find('.sentences_set .mainSentence .audioButton').attr('href');
  96. add_to_cart(id, {
  97. lang: lang,
  98. cont: cont,
  99. audio: audio
  100. });
  101. }
  102. else {
  103. $(add_numeric).find('.link.button img').attr('src', server_error);
  104. }
  105. }
  106. ).error(function () {
  107. $(add_numeric).find('.link.button img').attr('src', server_error);
  108. });
  109. }
  110. else {
  111. $(add_numeric).find('.link.button img').attr('src', cart_error);
  112. }
  113. }
  114. });
  115. $(add_numeric).find('.link.button img').click(function () {
  116. id = $(add_numeric).find('input').val();
  117. console.log(id);
  118. $(add_numeric).find('.link.button img').attr('src', 'http://flags.tatoeba.org/img/loading-small.gif');
  119. if (typeof (shopping[id]) == 'undefined') {
  120. imtheget = $.get('http://tatoeba.org/sentences/show/' + id, function (data) {
  121. if ($(data).find('.sentences_set').is('*')) {
  122. console.log(data);
  123. lang = $(data).find('.sentences_set .mainSentence .languageFlag').attr('src');
  124. cont = $(data).find('.sentences_set .mainSentence .sentenceContent').removeAttr('href').html();
  125. audio = $(data).find('.sentences_set .mainSentence .audioButton').attr('href');
  126. add_to_cart(id, {
  127. lang: lang,
  128. cont: cont,
  129. audio: audio
  130. });
  131. }
  132. else {
  133. $(add_numeric).find('.link.button img').attr('src', server_error);
  134. }
  135. }
  136. ).error(function () {
  137. $(add_numeric).find('.link.button img').attr('src', server_error);
  138. });
  139. }
  140. else {
  141. $(add_numeric).find('.link.button img').attr('src', cart_error);
  142. }
  143. });
  144. $(this).parentsUntil('.sentences_set').parent().find('.cart').append(add_numeric);
  145. }
  146. else {
  147. $(this).parentsUntil('.sentences_set').parent().find('#cart_0').remove();
  148. }
  149. event.preventDefault();
  150. });
  151. numeric.dblclick(function (event) {
  152. event.preventDefault();
  153. automatically_numeric = !automatically_numeric;
  154. GM_setValue('automatically_numeric', automatically_numeric);
  155. console.log('automatically_numeric: ' + automatically_numeric);
  156. $(numeric).find('img').attr('src', (automatically_numeric ? textfield_key : textfield_add));
  157. $(this).parentsUntil('.sentences_set').parent().find('#cart_0').remove();
  158. $(numeric).click();
  159. });
  160. $('.sentences_set ul.menu .option.addToList').before(numeric);
  161. function showcart(sentences_set) {
  162. if ($(sentences_set).find('.cart').is('*')) {
  163. cart = $(sentences_set).find('.cart');
  164. $(cart).empty();
  165. }
  166. else {
  167. cart = $('<div class="translations cart"></div>').css({
  168. 'border-top': '1px dashed #CCCCCC',
  169. 'margin-top':'10px',
  170. });
  171. $(sentences_set).find('.translations').after(cart);
  172. }
  173. chief_sentence = $(sentences_set).attr('id').split('_').reverse() [0];
  174. directs = $(sentences_set).find('.directTranslation').map(function () {
  175. return $(this).attr('id').split('_') [1];
  176. });
  177. indirects = $(sentences_set).find('.indirectTranslation').map(function () {
  178. return $(this).attr('id').split('_') [1];
  179. });
  180. $.each(shopping, function (id, value) {
  181. lang = shopping[id]['lang'];
  182. cont = shopping[id]['cont'];
  183. audio = shopping[id]['audio'];
  184. isself = (id == chief_sentence);
  185. isdirect = ($.inArray(id, directs) >= 0 ? true : false);
  186. isindirect = ($.inArray(id, indirects) >= 0 ? true : false);
  187. sentence_in_basket = $('<div id="cart_' + id + '" class="sentence' + (isself ? ' mainSentence' : (isdirect ? ' directTranslation' : ' indirectTranslation')) + '"></div>');
  188. sentence_in_basket.data({
  189. id: id,
  190. lang: lang,
  191. cont: cont,
  192. audio: audio
  193. });
  194. if (!isself) {
  195. sentence_in_basket.append('<a class="translationIcon '+(isdirect ? 'direct' : 'indirect')+'" href="/sentences/show/' + id + '" title="' + (isdirect ? 'Already' : (isindirect ? 'Indirectly' : 'Not yet')) + ' linked to main sentence (click to go to this sentence)"><div '+(!isdirect && !isindirect ? 'style="background:none !important;"' : '')+'></div></a>');
  196. }
  197. else{
  198. sentence_in_basket.append('<a href="/sentences/show/' + id + '" class="infoIcon"><div></div></a>');
  199. }
  200. sentence_in_basket.append(cart_button_remove.clone());
  201. sentence_in_basket.append('<img width="30" height="20" alt="' + lang + '" class="languageFlag" src="' + lang + '">');
  202. if (!isself) {
  203. if (!isdirect) {
  204. sentence_in_basket.append($('<a class="add link button" href="/' + interface_lang + '/links/add/' + chief_sentence + '/' + id + '" title="Link this sentence to the main sentence."><img width="16" height="16" src="http://flags.tatoeba.org/img/link.svg?1421599964"></a>').data('sentenceId', chief_sentence).data('translationId', id));
  205. }
  206. else {
  207. sentence_in_basket.append($('<a class="delete link button" href="/' + interface_lang + '/links/delete/' + chief_sentence + '/' + id + '" title="Unlink this sentence from the main sentence."><img width="16" height="16" src="http://flags.tatoeba.org/img/unlink.svg?1421599964"></a>').data('sentenceId', chief_sentence).data('translationId', id));
  208. }
  209. }
  210. else{
  211. }
  212. if (!$(sentences_set).parent().is('.sentenceInList')) {
  213. audio = audio | false;
  214. audiotrue = (audio ? audio.split('.').reverse() [0] == 'mp3' : false);
  215. audioURL = audio+'';
  216. sentence_in_basket.append('<a onclick="return false;" class="audioButton ' + (audiotrue ? 'audioAvailable' : 'audioUnavailable') + '" href="' + audioURL + '"></a>').click(function () {
  217. // this is copied from sentences.playaudio.js
  218. $('#audioPlayer').html('<object data="' + audioURL + '" type="audio/mpeg" data="' + audioURL + '" width="0" height="0">' +
  219. '<param name="src" value="' + audioURL + '" />' +
  220. '<object ' +
  221. 'type="application/x-shockwave-flash" ' +
  222. 'data="http://static.tatoeba.org/dewplayer-mini.swf?autostart=1&amp;mp3=' + audioURL + '" ' +
  223. 'width="0" ' +
  224. 'height="0" ' +
  225. '>' +
  226. '<param name="movie" value="http://static.tatoeba.org/dewplayer-mini.swf?autostart=1&amp;mp3=' + audioURL + '" />' +
  227. '</object>' +
  228. '</object>'
  229. );
  230. });
  231. }
  232. sentence_in_basket.append($('<a href="/sentences/show/' + id + '" class="sentenceContent"></div>').append($(cont).removeClass('editableSentence')));
  233. cart.append(sentence_in_basket);
  234. });
  235. }
  236. function add_to_cart(id, object) {
  237. // reload the shopping cart so we can use it across tabs
  238. shopping = GM_getValue('shopping');
  239. shopping = shopping || default_shopping;
  240. shopping = JSON.parse(shopping);
  241. shopping[id] = {
  242. lang: lang,
  243. cont: cont,
  244. audio: audio
  245. };
  246. GM_setValue('shopping', JSON.stringify(shopping));
  247. console.log('shopping: ' + JSON.stringify(shopping));
  248. $('.sentences_set').each(function () {
  249. showcart($(this));
  250. if (automatically_numeric) {
  251. $(this).find('.numeric').click();
  252. }
  253. });
  254. }
  255. function remove_from_cart(id) {
  256. // reload the shopping cart so we can use it across tabs
  257. shopping = GM_getValue('shopping');
  258. shopping = shopping || default_shopping;
  259. shopping = JSON.parse(shopping);
  260. console.log(id);
  261. delete shopping[id];
  262. GM_setValue('shopping', JSON.stringify(shopping));
  263. console.log('shopping: ' + JSON.stringify(shopping));
  264. $('.sentences_set').each(function () {
  265. showcart($(this));
  266. if (automatically_numeric) {
  267. $(this).find('.numeric').click();
  268. }
  269. });
  270. }
  271. function refresh_cart() {
  272. // reload the shopping cart so we can use it across tabs
  273. compare_shopping = shopping;
  274. shopping = GM_getValue('shopping');
  275. shopping = shopping || default_shopping;
  276. shopping = JSON.parse(shopping);
  277. if(JSON.stringify(compare_shopping)!=JSON.stringify(shopping)){
  278. console.log('updating shopping cart');
  279. $('.sentences_set').each(function () {
  280. showcart($(this));
  281. if (automatically_numeric) {
  282. $(this).find('.numeric').click();
  283. }
  284. });
  285. } else {
  286. //console.log('no changes to shopping cart');
  287. }
  288. }
  289. window.onfocus = function(){refresh_cart();};
  290. $('.sentences_set').each(function () {
  291. showcart($(this));
  292. if (automatically_numeric) {
  293. $(this).find('.numeric').click();
  294. }
  295. });
  296. $('.sentences_set .translations:not(.cart) .sentence, .sentences_set > .mainSentence').each(function () {
  297. id = $(this).find('.languageFlag').attr('id').split('_').reverse() [0];
  298. lang = $(this).find('.languageFlag').attr('src');
  299. cont = $(this).find('.sentenceContent').removeAttr('href').html();
  300. audio = $(this).find('.audioButton').attr('href');
  301. incart = typeof (shopping[id]) == 'object';
  302. $(this).data({
  303. id: id,
  304. lang: lang,
  305. cont: cont,
  306. audio: audio
  307. });
  308. $(this).addClass('id' + id);
  309. $(this).find('.languageFlag').before((incart ? cart_button_remove.clone() : cart_button_add.clone()));
  310. });
  311. $('.sentences_set').on('click', '.cartButton', function (event) {
  312. data = $(this).parentsUntil('sentence').data();
  313. id = data['id'];
  314. lang = data['lang'];
  315. cont = data['cont'];
  316. audio = data['audio'];
  317. incart = typeof (shopping[id]) == 'object';
  318. if (incart) {
  319. remove_from_cart(id);
  320. $('.sentences_set .sentence.id' + id + ' .cartButton').replaceWith(cart_button_add.clone());
  321. }
  322. else {
  323. add_to_cart(id, {
  324. lang: lang,
  325. cont: cont,
  326. audio: audio
  327. });
  328. $('.sentences_set .sentence.id' + id + ' .cartButton').replaceWith(cart_button_remove.clone());
  329. }
  330. });
  331. //Below is an adaption of original code from Tatoeba, as greasemonkey cannot (to my knowledge) interact with the code from the page itself
  332. /**
  333. * Tatoeba Project, free collaborative creation of multilingual corpuses project
  334. * Copyright (C) 2011 HO Ngoc Phuong Trang <tranglich@gmail.com>
  335. *
  336. * This program is free software: you can redistribute it and/or modify
  337. * it under the terms of the GNU Affero General Public License as published by
  338. * the Free Software Foundation, either version 3 of the License, or
  339. * (at your option) any later version.
  340. *
  341. * This program is distributed in the hope that it will be useful,
  342. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  343. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  344. * GNU Affero General Public License for more details.
  345. *
  346. * You should have received a copy of the GNU Affero General Public License
  347. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  348. */
  349. //http://tatoeba.org/js/links.add_and_delete.js
  350. $('.cart .link').click(function (event) { //modified by Jakob
  351. event.preventDefault(); //modified by Jakob
  352. var sentenceId = $(this).data('sentenceId');
  353. var translationId = $(this).data('translationId');
  354. var rootUrl = 'http://tatoeba.org/';
  355. var image = $(this);
  356. var action = null;
  357. if ($(this).hasClass('add')) {
  358. var action = 'add';
  359. var newAction = 'delete';
  360. var removeClass = 'indirectTranslation';
  361. var addClass = 'directTranslation';
  362. var newType = 'direct';
  363. } else if ($(this).hasClass('delete')) {
  364. var action = 'delete';
  365. var newAction = 'add';
  366. var removeClass = 'directTranslation';
  367. var addClass = 'indirectTranslation';
  368. var newType = 'indirect';
  369. }
  370. if (action != null) {
  371. // Show the loading gif...
  372. $(this).html('<img src=\'/img/loading-small.gif\' alt=\'loading\'>'
  373. );
  374. // Send request...
  375. $.get(rootUrl + interface_lang + '/links/' + action + '/' + sentenceId + '/' + translationId, function (data) {
  376. var elementId = '#translation_' + translationId + '_' + sentenceId;
  377. var cartId = '#cart_' + sentenceId;
  378. // Update the link or unlink image
  379. image.html(data);
  380. image.removeClass(action);
  381. image.addClass(newAction);
  382. // update the class of the sentence and the arrow
  383. $(elementId).removeClass(removeClass);
  384. $(elementId).addClass(addClass);
  385. $(elementId + ' .show img').attr('src', '/img/' + newType + '_translation.png'
  386. );
  387. $(elementId + ' .link').html(data);
  388. $(image).parent().removeClass(removeClass);
  389. $(image).parent().addClass(addClass);
  390. $(image).parent().find(' .show img').attr('src', '/img/' + newType + '_translation.png'
  391. );
  392. $(image).html(data);
  393. }
  394. );
  395. }
  396. });
  397. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址