xref: /plugin/copy2clipboard/script.js (revision add2627846425327c4abbb076eaefa7578cde512)
1*add26278SSchplurtz le Déboulonné/*
2*add26278SSchplurtz le Déboulonné * Copy2clipboard - copy <pre> text to clipboard.
3*add26278SSchplurtz le Déboulonné * Copyright (C) 2020, 2021 Schplurtz le Déboulonné <Schplurtz@laposte.net>
4*add26278SSchplurtz le Déboulonné *
5*add26278SSchplurtz le Déboulonné * This program is free software; you can redistribute it and/or modify
6*add26278SSchplurtz le Déboulonné * it under the terms of the CECILL 2.1 free license. See files
7*add26278SSchplurtz le Déboulonné * LICENSE and LICENSE-fr for the details in the distribution directory or
8*add26278SSchplurtz le Déboulonné * http://cecill.info/licences/Licence_CeCILL_V2.1-en.html
9*add26278SSchplurtz le Déboulonné */
104a476730SSchplurtz le DéboulonnéjQuery(function() {
114a476730SSchplurtz le Déboulonné  if(!navigator.clipboard)
124a476730SSchplurtz le Déboulonné    return;
134a476730SSchplurtz le Déboulonné  var messageBox=function( id, txt ) {
144a476730SSchplurtz le Déboulonné    const body=document.getElementsByTagName('body')[0];
154a476730SSchplurtz le Déboulonné    const msg=document.createElement('div');
164a476730SSchplurtz le Déboulonné    msg.setAttribute('id', id );
174a476730SSchplurtz le Déboulonné    msg.classList.add('cp2clipmsg');
184a476730SSchplurtz le Déboulonné    const content = document.createTextNode(txt);
194a476730SSchplurtz le Déboulonné    msg.appendChild(content);
204a476730SSchplurtz le Déboulonné    body.appendChild(msg);
214a476730SSchplurtz le Déboulonné    window.setTimeout(function() {
224a476730SSchplurtz le Déboulonné        jQuery("#"+id).fadeTo(500, 0).slideUp(500, function(){
234a476730SSchplurtz le Déboulonné            jQuery(this).remove();
244a476730SSchplurtz le Déboulonné        });
254a476730SSchplurtz le Déboulonné    }, 1500);
2695208031SSchplurtz le Déboulonné  };
27eeae6715SSchplurtz le Déboulonné  var response=async function(event) {
28eeae6715SSchplurtz le Déboulonné    try {
29eeae6715SSchplurtz le Déboulonné      let text=''
30eeae6715SSchplurtz le Déboulonné      let lis=event.target.parentElement.getElementsByTagName('li');
31eeae6715SSchplurtz le Déboulonné      if( lis.length ) {
32eeae6715SSchplurtz le Déboulonné        for( let li of lis ) {
33eeae6715SSchplurtz le Déboulonné          text += li.textContent + '\n';
34eeae6715SSchplurtz le Déboulonné        }
35eeae6715SSchplurtz le Déboulonné      }
36eeae6715SSchplurtz le Déboulonné      else {
37eeae6715SSchplurtz le Déboulonné        text = event.target.parentElement.textContent;
38eeae6715SSchplurtz le Déboulonné      }
39eeae6715SSchplurtz le Déboulonné      // Why replace ??? geshi adds an NBSP on each empty line. This is an issue
40eeae6715SSchplurtz le Déboulonné      // with python, perl... when you want to run copied code, you get a
41eeae6715SSchplurtz le Déboulonné      // syntax error "unexpected \xC2 character" or similar... So remove this
42eeae6715SSchplurtz le Déboulonné      // crap. And yes it could remove a legitimate NBSP ; chances are low though.
43eeae6715SSchplurtz le Déboulonné      text = text.replace(/^\u00A0$/gm, "");
44eeae6715SSchplurtz le Déboulonné      await navigator.clipboard.writeText(text);
45f20dc62bSSchplurtz le Déboulonné      // console.log( "copié >>>" + text + "<<<" );
46eeae6715SSchplurtz le Déboulonné      messageBox('cp2clipok', LANG.plugins.copy2clipboard.copied);
47eeae6715SSchplurtz le Déboulonné    } catch (err) {
48f20dc62bSSchplurtz le Déboulonné      // console.error('Failed to copy!', err);
49eeae6715SSchplurtz le Déboulonné      messageBox('cp2clipnok', LANG.plugins.copy2clipboard.error);
50eeae6715SSchplurtz le Déboulonné    }
51eeae6715SSchplurtz le Déboulonné  };
52eeae6715SSchplurtz le Déboulonné
534a476730SSchplurtz le Déboulonné  document.querySelectorAll('pre.code,pre.file').forEach(function(elem) {
544a476730SSchplurtz le Déboulonné    elem.classList.add('cp2clip');
554a476730SSchplurtz le Déboulonné    let cp = document.createElement('button');
564a476730SSchplurtz le Déboulonné    cp.setAttribute( 'title', LANG.plugins.copy2clipboard.title);
574a476730SSchplurtz le Déboulonné    //cp.appendChild(document.createTextNode('Copy to clipboard')) ;
584a476730SSchplurtz le Déboulonné    cp.classList.add('cp2clip');
594a476730SSchplurtz le Déboulonné    elem.appendChild(cp); // pre.appendChild
60eeae6715SSchplurtz le Déboulonné    cp.addEventListener('click', response)
614a476730SSchplurtz le Déboulonné  })
6295208031SSchplurtz le Déboulonné});
634a476730SSchplurtz le Déboulonné
64