Archive for the ‘javascript’ Category

joomlaでpreタグ内の改行がbrタグに自動的にに変換されてしまう件について

joomlaでeditorにJCEを使用し、記事にコードをのせるためにsyntax highlighterを使ったときに、せっかくコードをきれいに保存してくれるのにタイトルのような余計な機能のせいで、見苦しくなってしまう。こういった「余計な機能」はセキュリティーやユーザビリティの観点から「妥当な機能」なのだろうが、やっぱり柔軟性にかける。このような記事に対するユーザーへの制限はjoomlaに限らないが、javascriptがかけなかったり、tableがかけなかったりするのはつらい。。

今回はjoomlaのpreタグ内の改行がbrタグに変換されてしまうのを回避すべく、まさぐってみた。
ただし。コードを把握しているわけでなく、適当にいじったら出来たというメモ程度のものなので、まねしないほうがいいかもしれません。

/plugins/editors/jce/tiny_mce/tini_mce.jsを編集
1:「j=j.replace(/\r?\n|\r/g,” “);」の一文を削除(これをやるとpreタグに限らず全部のタグに改行が可能になる。)
2:「{pattern:/(<pre[^>]*>)(.*?)(<\/pre>)/g,encode:1},」の一文を削除(これをやるとpreタグ内の改行がbrタグに変換されなくなる。)

上記の方法では結局保存したときに元に戻ってしまう模様。コードと数時間格闘したが、結局わからずじまい。。。

途方にくれていたとき、ハッと発想の転換が。

「そうだ。Syntax Highlighter側でbrタグを改行であると認識させちゃえばいいんじゃね?」

というわけで、またまた力技だが
plugins/content/syntaxhighlighter/core/shCore.js を編集するのですが、
plugins/content/syntaxhighlighter/src/shCore.jsが元のファイルのようなので
予め、plugins/content/syntaxhighlighter/core/shCore.jsをそのファイルで上書きます。
そして、plugins/content/syntaxhighlighter/core/shCore.js を編集。

1081行目あたりにある for(var i = 0; i < elements.length; i++) というループの中で、
elements[i]がtargetという変数に代入される前に下記の2行を加えてelements[i]の内容を書き換えます。

elements[i].innerHTML = elements[i].innerHTML.replace(/\<br*\>/g,”\n”);
elements[i].innerHTML = elements[i].innerHTML.replace(/\<*code*\>/g,”");

2行目はjoomlaで編集してるとpreタグの中に入ってくるcodeタグもついでに消しています。

これでとりあえず解決(?)です。

javascriptのwindow.openで_blankを全部タブじゃなくて別ウィンドウにする

javascriptを久しぶりにいじった。

タブブラウザでウィンドウを_blankで開くと新しいタブが開くことが多いと思いますが、そうするとちょっと不具合があることがあったので解決策を模索しました。不具合というのは新しく開いたウィンドウ(タブ)先でウィンドウサイズ変更を行っていることでした。タブブラウザではウィンドウは当然くっついてるので全部のタブでそのウィンドウサイズになってしまい、具合が悪かったわけです。

そこで下記のようにして一括解決しました。クロスブラウザになってるかは未調査。operaとかsafariとかでは動くのか心配です。。

とりあえずメモしておきます。
やっていることは

  • 全部のaタグを取り出して
  • その中のtargetが_blankのものを取り出して
  • _blankを消し、
  • 変わりにonClickイベントを追加してます。

html側は普通に<a href=”xxxx.html” target=”_blank”>xxxx</a>のようにしてるだけです。

function getURL(e,myThis){
var myURL = myThis.href;
w = window.open(myURL, null,’toolbar=yes,location=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes’);
e.returnValue = false;
e.preventDefault ();
}
function setEventListener(element, type, listener) {
if (element.addEventListener){
element.addEventListener(type, function(e){listener(e,this)}, false);
}else if (element.attachEvent){
element.attachEvent(‘on’ + type, function(e){listener(e,e.srcElement)});
}
}
function init(){
var aTags = document.getElementsByTagName(‘a’);
var aTagsLen = aTags.length;
for(var i=0;i<aTagsLen;i++){
element = aTags[i];
if(element.target == “_blank”){
element.target = “”;
setEventListener(element,”click”,getURL);
}
}
}

init()はbody.onloadで呼び出してますー。

追記

バグあります。IEでは正常にうごきませんのでご注意ください。