/* This is an extension for the Krusader filemanager http://krusader.sf.net/ Author: Vaclav Juza. based on mount by Jonas B�r, http://www.jonas-baehr.de/ This script shows a dialog for recoding file names. The commandline which is returned by this is executed by Krusader's UserAction-system Krusader looks for the variable 'cmd'. scriptDir is a string-variable set by Krusader with the directory of the currently executed script. This is usefull for relative path's inside scripts. */ var cmd = "@CANCEL@"; //FIXME: replace this with UserAction.cancel //if an exception occurs, do not continue var charsetsRecode = ["UTF-8","UTF-7","ISO-8859-2","WINDOWS-1250","IBM852","Kamenicky","MacCentralEurope","ISO-8859-1"]; var charsetsIconv = ["UTF-8","UTF-7","ISO_6937","ISO-8859-2","WINDOWS-1250","IBM852","ISO-8859-1"]; var endLineTexts = ["UNIX","DOS","MAC"]; var endLineVals = ["","/CR-LF","/CR"]; var mimeTexts = ["NORMAL","BASE64","QUOTED-PRINTABLE"]; var mimeVals = ["","/Base64","/Quoted-Printable"]; var dumps = ["NORMAL","Hexadecimal-1","Hexadecimal-2","Hexadecimal-4","Decimal-1","Decimal-2","Decimal-4", "Octal-1","Octal-2","Octal-4"]; var methodTexts = ["Copy","Rename/move"]; if(dstDir.indexOf(srcDir) == 0 || srcDir.indexOf(dstDir) == 0){ //would do weird things throw new Error("Destination directory inside the source directory is not supported"); } var ui = Factory.loadui( scriptDir + 'recode.ui' ); var bc = [ ui.child('boxInCharset'), ui.child('boxOutCharset') ]; var bl = [ ui.child('boxInLineend'), ui.child('boxOutLineend') ]; var bm = [ ui.child('boxInMime'), ui.child('boxOutMime') ]; var bd = [ ui.child('boxInDump'), ui.child('boxOutDump') ]; var bMtd = ui.child('boxMethod'); var cbName = ui.child('checkName'); var cbContent = ui.child('checkContent'); var cbDebug = ui.child('checkDebug'); var loc = [ ui.child('locInput'), ui.child('locOutput') ]; function fillCombo(kcombo, texts) { var t = kcombo.child('in-combo'); for(i in texts) { t.insertItem(texts[i]); } kcombo.currentItem = 0; } if(useRecode==1){ for(var d=0;d<=1;d++){ fillCombo(bc[d],charsetsRecode); fillCombo(bl[d],endLineTexts); fillCombo(bm[d],mimeTexts); fillCombo(bd[d],dumps); bc[0].currentItem = 2; } }else{ for(var d=0;d<=1;d++){ fillCombo(bc[d],charsetsIconv); bc[0].currentItem = 3; bl[0].shown = 0; bl[1].shown = 0; bm[0].shown = 0; bm[1].shown = 0; bd[0].shown = 0; bd[1].shown = 0; } } fillCombo(bMtd,methodTexts); //defaults loc[0].url = srcDir; loc[1].url = dstDir; cbName.checked=1; cbContent.checked=0; cbDebug.checked=0; function quoteString(str) { return "'" + str.replace(/'/g,"'\\''") + "'"; } function indentString(str) { return str.replace(/(^|\n)([^$])/g,"$1 $2"); } function debugString(str) { return str.replace(/(<|>|\\|;)/g,"\\$1").replace(/"/g,"\\\"\""); } bc[0].setFocus(); var m = ui.exec(); if(m) { var isMove = ( bMtd.currentItem == 1 ); var rcName = cbName.checked; var rcContent = cbContent.checked; var debug = cbDebug.checked; srcDir = loc[0].url; dstDir = loc[1].url; if(dstDir.indexOf(srcDir) == 0 || srcDir.indexOf(dstDir) == 0){ //would do weird things throw new Error("Destination directory inside the source directory is not supported"); } var listCmd = "for i in " + toProcess + "\n" +"do\n" +" find \"${i}\" -name '*'\n" +"done"; //the following contains user input, must be quoted var recodeCmd, recodeSmallCmd; if(useRecode==1){ var expr = new Array(2); var smallExpr = new Array(2); for(var d=0; d<=1; d++){ var chs = ""; chs = bc[d].currentText; var le = endLineVals[ bl[d].currentItem ]; var me = mimeVals[ bm[d].currentItem ]; var du=""; if( bd[d].currentItem > 0 ) { du = "/" + bd[d].currentText; } expr[d] = chs + le + me + du; smallExpr[d] = chs + me; } recodeCmd="recode " + quoteString(expr[0] + ".." + expr[1]); recodeSmallCmd="recode " + quoteString(smallExpr[0] + ".." + smallExpr[1]); }else{ recodeCmd="iconv -f " + quoteString(bc[0].currentText) + " -t " + quoteString(bc[1].currentText); recodeSmallCmd=recodeCmd; } var setupVarsCmd; if(rcName){ setupVarsCmd = "fnew=\"$(\n" +" echo \"${forig}\" | " + recodeSmallCmd +"\n" +")\""; }else{ setupVarsCmd = "fnew=\"${forig}\""; } var dstStr = dstDir + "/\"${fnew}\""; var oneDirCmd = "mkdir " + dstStr; //create the directory in new location var oneFileCmd; var oneSpcCmd; if(isMove){ oneSpcCmd = "mv " + "\"${forig}\" " + dstStr; }else{ oneSpcCmd = "cp -dp " + "\"${forig}\" " + dstStr; } if(rcContent){ oneFileCmd = recodeCmd + " \<\"${forig}\" \>"+dstStr; if(isMove){ oneFileCmd += "&& rm -f \"${forig}\""; } }else{ oneFileCmd = oneSpcCmd; } oneDirCmdDbg="echo directory:" + debugString(oneDirCmd); oneFileCmdDbg="echo file:" + debugString(oneFileCmd); oneSpcCmdDbg="echo special:" + debugString(oneSpcCmd); var oneItemCmd = setupVarsCmd + "\n" +"if [ ! -L \"${forig}\" ] && [ -d \"${forig}\" ]\n" +"then\n" +indentString(oneDirCmdDbg) + "\n" + ( debug ? "" : indentString(oneDirCmd) + "\n" ) +"elif [ -f \"${forig}\" ]\n" +"then\n" +indentString(oneFileCmdDbg) + "\n" + ( debug ? "" : indentString(oneFileCmd) + "\n" ) +"else\n" +indentString(oneSpcCmdDbg) + "\n" + ( debug ? "" : indentString(oneSpcCmd) + "\n" ) +"fi"; var processCmd = "while read forig;\n" +"do\n" +indentString(oneItemCmd) + "\n" +"done"; if(isMove){ var deleteOldCmd = "for i in " + toProcess + "\n" +"do\n" +" [ / = \"$i\" ] || rm -rf \"${i}\"\n" +"done"; var realCmd = "(\n" + indentString(listCmd) + "\n) | (\n" + indentString(processCmd) + "\n)\n"+ deleteOldCmd; }else{ var realCmd = "(\n" + indentString(listCmd) + "\n) | (\n" + indentString(processCmd) + "\n)"; } cmd = "sh -c " + quoteString("LANG=C; cd " + quoteString(srcDir) + "; " + realCmd); /*if(debug){ cmd = "echo " + quoteString(cmd); }*/ }