Avatar

insert_link Function overworked (Features)

by Micha ⌂, Sunday, November 01, 2009, 12:17 (5262 days ago)
edited by Micha, Sunday, November 01, 2009, 12:22

Hello,

I overworked the insert_link function, see the changes in the code mentioned below. I add a simple feature: If the user selects a "valid" URI, I show this URI in the first prompt-box as suggestion (and not in the second one).

You can try it out in my forum.

Best regards
Micha

 
function insert_link(id,link_text,link_target)
 {
  var link_text = decodeURIComponent(link_text);
  var link_target = decodeURIComponent(link_target);
  //RegExp zum Pruefen auf eine "gueltige" URI, das geht vll noch besser...
  var regExp = new RegExp(/http:\/\/[a-zA-Z0-9-.][a-zA-Z0-9-.]+(S+)?/);
  if(document.selection) // for IE
   {
    var str = document.selection.createRange().text;
    document.getElementById(id).focus();
    var sel = document.selection.createRange();
 // Pruefung, ob markierter Text bereits eine valide URI ist
 // Wenn true, dann schlage diese in Prompt-Box vor
 // ansonsten geben default "http://" aus
 var insert_link = (regExp.test(sel.text))?prompt(link_target, sel.text):prompt(link_target,'http://');
 
 // Verlasse die Funktion, wenn der Nutzer abgebrochen hat, keinen Text
 // eingegeben hat oder das default "http://" lediglich enthalten ist
 if (!insert_link || insert_link == '' || insert_link == 'http://')
  return;
 
 // Wurde kein Text markiert oder eine valide URI eingegeben, dann biete 
 // dem Nutzer die Moeglichkeit, einen Linktext einzugeben (optional)
    if(sel.text=='' || regExp.test(sel.text)) var str = prompt(link_text,'');
    if(insert_link && str!=null)
     {
      if(str!='')
       {
        sel.text = "[link=" + insert_link + "]" + str + "[/link]";
       }
      else
       {
        sel.text = "[link]" + insert_link + "[/link]";
       }
     }
    return;
   }
  else if((typeof document.getElementById(id).selectionStart) != 'undefined') // Mozilla
   {
    var txtarea = document.getElementById(id);
    var selLength = txtarea.textLength;
    var selStart = txtarea.selectionStart;
    var selEnd = txtarea.selectionEnd;
    var oldScrollTop = txtarea.scrollTop;
    var s1 = (txtarea.value).substring(0,selStart);
    var s2 = (txtarea.value).substring(selStart, selEnd);
    var s3 = (txtarea.value).substring(selEnd, selLength);
 
 // Pruefung, ob markierter Text bereits eine valide URI ist
 // Wenn true, dann schlage diese in Prompt-Box vor
 // ansonsten geben default "http://" aus
 var insert_link = (regExp.test(s2))?prompt(link_target, s2):prompt(link_target,'http://');
 
 // Verlasse die Funktion, wenn der Nutzer abgebrochen hat, keinen Text
 // eingegeben hat oder das default "http://" lediglich enthalten ist
 if (!insert_link || insert_link == '' || insert_link == 'http://')
  return;
 
 // Wurde kein Text markiert oder eine valide URI eingegeben, dann biete 
 // dem Nutzer die Moeglichkeit, einen Linktext einzugeben (optional)
    if(selEnd-selStart==0 || regExp.test(s2))
     {
      var s2 = prompt(link_text,'');
      var no_selection = true;
     }
    if(insert_link && s2!=null)
     {
      if(s2!='')
       {
        txtarea.value = s1 + '[link=' + insert_link + ']' + s2 + '[/link]' + s3;
        var codelength = 14 + insert_link.length + s2.length;
       }
      else
       {
        txtarea.value = s1 + '[link]' + insert_link + '[/link]' + s3;
        var codelength = 13 + insert_link.length;
       }
      if(no_selection) txtarea.selectionStart = s1.length + codelength;
      else txtarea.selectionStart = s1.length;
      txtarea.selectionEnd = s1.length + codelength;
      txtarea.scrollTop = oldScrollTop;
      txtarea.focus();
      return;
     }
   }
  else insert(id,'[link=http://www.domain.tld/]Link[/link]');
 }
 

--
applied-geodesy.org - OpenSource Least-Squares Adjustment Software for Geodetic Sciences

Avatar

Good idea!

by Alex ⌂, Tuesday, November 03, 2009, 08:40 (5260 days ago) @ Micha

- No text -

Avatar

insert_link Function - checking internal links

by Micha ⌂, Wednesday, December 23, 2009, 12:04 (5210 days ago) @ Micha

Hi,

I overworked it once again ;-) Against the uri the function is using the link or msg-tag.

 
function insert_link(id,link_text,link_target)
 {
  var link_text = decodeURIComponent(link_text);
  var link_target = decodeURIComponent(link_target);
  // BB-Code fuer einen LINK, kann ueberschireben werden, wenn es sich um
  // einen Link zu einem internen Post handelt, durch MSG
  // Das spart ein paar kb in der Datenbank und macht das TAG bekannter...
  var link_bb_code = "link";
  //RegExp zum Pruefen auf eine "gueltige" URI, das geht vll noch besser...
  var regExpURI = new RegExp(/[http|https|ftp|ftps]:\/\/[a-zA-Z0-9-.][a-zA-Z0-9-.]+(S+)?/);
  //RegExp zum ermitteln der Message-ID im Forum - sofern vorhanden
  var regExpFID = new RegExp(/[?|&]id=([0-9]+)/);
  // URI vom Forum ohne Query und Protokoll zB.: sub.example.org/dir/index.php
  var forumURI = window.location.hostname + window.location.pathname;
  if(document.selection) // for IE
   {
    var str = document.selection.createRange().text;
    document.getElementById(id).focus();
    var sel = document.selection.createRange();
 // Pruefung, ob markierter Text bereits eine valide URI ist
 // Wenn true, dann schlage diese in Prompt-Box vor
 // ansonsten gebe default "http://" aus
 var insert_link = (regExpURI.test(sel.text))?prompt(link_target, sel.text):prompt(link_target,'http://');
 
 // Verlasse die Funktion, wenn der Nutzer abgebrochen hat, keinen Text
 // eingegeben hat oder das default "http://" lediglich enthalten ist
 if (!insert_link || insert_link == '' || insert_link == 'http://')
  return;
 
 // Pruefe, ob es ein Link zu einem anderen Eintrag im Forum ist --> msg
 if (insert_link.indexOf(forumURI) > 0 && regExpFID.test(insert_link)) {
  // Suche ID im Query der URL
  var msgQuery = regExpFID.exec(insert_link);
  // Uberschreibe BB-Code
  link_bb_code = "msg";
  // Ueberschreibe Variable insert_link mit der msg-id
  insert_link = msgQuery[1];
 }
 
 // Wurde kein Text markiert oder eine valide URI eingegeben, dann biete 
 // dem Nutzer die Moeglichkeit, einen Linktext einzugeben (optional)
    if(sel.text=='' || regExpURI.test(sel.text)) var str = prompt(link_text,'');
    if(str!=null)
     {
      if(str!='')
       {
        sel.text = "["+link_bb_code+"=" + insert_link + "]" + str + "[/"+link_bb_code+"]";
       }
      else
       {
        sel.text = "["+link_bb_code+"]" + insert_link + "[/"+link_bb_code+"]";
       }
     }
    return;
   }
  else if((typeof document.getElementById(id).selectionStart) != 'undefined') // Mozilla
   {
    var txtarea = document.getElementById(id);
    var selLength = txtarea.textLength;
    var selStart = txtarea.selectionStart;
    var selEnd = txtarea.selectionEnd;
    var oldScrollTop = txtarea.scrollTop;
    var s1 = (txtarea.value).substring(0,selStart);
    var s2 = (txtarea.value).substring(selStart, selEnd);
    var s3 = (txtarea.value).substring(selEnd, selLength);
 
 // Pruefung, ob markierter Text bereits eine valide URI ist
 // Wenn true, dann schlage diese in Prompt-Box vor
 // ansonsten gebe default "http://" aus
 var insert_link = (regExpURI.test(s2))?prompt(link_target, s2):prompt(link_target,'http://');
 
 // Verlasse die Funktion, wenn der Nutzer abgebrochen hat, keinen Text
 // eingegeben hat oder das default "http://" lediglich enthalten ist
 if (!insert_link || insert_link == '' || insert_link == 'http://')
  return;
 
 // Pruefe, ob es ein Link zu einem anderen Eintrag im Forum ist --> msg
 if (insert_link.indexOf(forumURI) > 0 && regExpFID.test(insert_link)) {
  // Suche ID im Query der URL
  var msgQuery = regExpFID.exec(insert_link);
  // Uberschreibe BB-Code
  link_bb_code = "msg";
  // Ueberschreibe Variable insert_link mit der msg-id
  insert_link = msgQuery[1];
 } 
 
 // Wurde kein Text markiert oder eine valide URI eingegeben, dann biete 
 // dem Nutzer die Moeglichkeit, einen Linktext einzugeben (optional)
    if(selEnd-selStart==0 || regExpURI.test(s2))
     {
      var s2 = prompt(link_text,'');
      var no_selection = true;
     }
    if(s2!=null)
     {
      if(s2!='')
       {
        txtarea.value = s1 + "["+link_bb_code+"=" + insert_link + "]" + s2 + "[/"+link_bb_code+"]" + s3;
        var codelength = 14 + insert_link.length + s2.length;
       }
      else
       {
        txtarea.value = s1 + "["+link_bb_code+"]" + insert_link + "[/"+link_bb_code+"]" + s3;
        var codelength = 13 + insert_link.length;
       }
      if(no_selection) txtarea.selectionStart = s1.length + codelength;
      else txtarea.selectionStart = s1.length;
      txtarea.selectionEnd = s1.length + codelength;
      txtarea.scrollTop = oldScrollTop;
      txtarea.focus();
      return;
     }
   }
  else insert(id,'[link=http://www.domain.tld/]Link[/link]');
 }
 

Maybe this function is more readable if it split up in several functions...

Happy X-mas!

Micha

--
applied-geodesy.org - OpenSource Least-Squares Adjustment Software for Geodetic Sciences

Avatar

insert_link Function - checking internal links

by Alex ⌂, Sunday, December 27, 2009, 09:30 (5206 days ago) @ Micha

Very good! :ok:

Alex

RSS Feed of thread