insert_link Function - checking internal links (Features)
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