diff options
author | shunirr | 2008-03-20 16:32:41 +0000 |
---|---|---|
committer | shunirr | 2008-03-20 16:32:41 +0000 |
commit | aad373b519fdaf2b04004db3e95c1571c5d9ddf8 (patch) | |
tree | 53b2ecdfea348e76a1b7180b76ead6252e02f228 /encodingSwitcher.js | |
download | vimperator-plugins-aad373b519fdaf2b04004db3e95c1571c5d9ddf8.tar.bz2 |
lang/javascript/vimperator-plugins/trunk
lang/javascript/vimperator-plugins/tags/0.5.3
- mkdir trunk, tags
- mv some files
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@8221 d0d07461-0603-4401-acd4-de1884942a52
Diffstat (limited to 'encodingSwitcher.js')
-rw-r--r-- | encodingSwitcher.js | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/encodingSwitcher.js b/encodingSwitcher.js new file mode 100644 index 0000000..dc0de26 --- /dev/null +++ b/encodingSwitcher.js @@ -0,0 +1,197 @@ +/** + * encodingSwithcer (vimperator plugin) + * @author teramako teramako@gmail.com + * @version 0.1 + * + * Usage: + * + * change encoding + * :set fileencoding = {encodeName} + * :set fenc = {encodeName} + * + * list available encodings + * :listencoding [expr] + * :lsenc [expr] + * + * change auto detector + * :set autodetector = {detectorName} + * :set audet = {detectorName} + * + * list available auto detectors + * :listdetector [expr] + * :lsdet [expr] + */ +(function(){ + +var encodings = []; +var detectors = []; +const Cc = Components.classes; +const Ci = Components.interfaces; +if (!RDF) var RDF = Cc['@mozilla.org/rdf/rdf-service;1'].getService(Ci.nsIRDFService); +if (!RDFCU) var RDFCU = Cc['@mozilla.org/rdf/container-utils;1'].getService(Ci.nsIRDFContainerUtils); +var cm = RDF.GetDataSource('rdf:charset-menu'); +var sbService = Cc['@mozilla.org/intl/stringbundle;1'].getService(Ci.nsIStringBundleService); +var sbCharTitle = sbService.createBundle('chrome://global/locale/charsetTitles.properties'); +CreateMenu('browser'); +CreateMenu('more-menu'); +var allEnum = cm.GetAllResources(); +while (allEnum.hasMoreElements()){ + var res = allEnum.getNext().QueryInterface(Ci.nsIRDFResource); + var value = res.Value; + if (RDFCU.IsContainer(cm, res) || value.indexOf('charset.') == 0 || value.indexOf('----') == 0) { + continue; + } + var label = sbCharTitle.GetStringFromName(value.toLowerCase() + '.title'); + if (res.Value.indexOf('chardet.') == 0){ + value = value.substr('chardet.'.length); + var buf = createDetector(value); + buf[1] = label; + detectors.push(buf); + } else { + encodings.push([value,label]); + } +} +function createDetector(name){ + var i = name.indexOf('_'); + if ( i > 0 ){ + return [name.substr(0,i),null,name.substr(i)]; + } + return [name,null,'']; +} +function getDetector(name){ + detectors.forEach(function(detector){ + if (detector[0].toLowerCase() == name.toLowerCase()){ + return detector[0] + detector[2]; + } + }); +} +function getEncoding(name){ + for (var i=0; i<encodings.length; i++){ + encodings.forEach(function(encoding){ + if (encoding[0].toLowerCase() == name.toLowerCase()){ + return encoding[0]; + } + }); +} +function isValid(array, value){ + return array.some(function(v){ + return v[0].toLowerCase() == value.toLowerCase(); + }); +} +function completion(array, filter){ + if (!filter) return array; + filter = filter.toLowerCase(); + return array.filter(function(v){ + return v[0].toLowerCase().indexOf(filter) == 0; + }); +} +var sbCharDefault = sbService.createBundle(gPrefService.getDefaultBranch('intl.charset.').getCharPref('default')); +const DEFAULT_CHARSET = sbCharDefault.GetStringFromName('intl.charset.default'); +vimperator.options.add(new vimperator.Option( ['fileencoding','fenc'], 'string', + { + shortHelp: 'set the charactor encoding for the current page', + help: 'Please make certain of available value with <code class="command">:lsenc</code> command', + defaultValue: DEFAULT_CHARSET, + setter: function(value){ + if (!value) return; + value = getEncoding(value); + SetForcedCharset(value); + SetDefaultCharacterSet(value); + BrowserSetForcedCharacterSet(value); + }, + getter: function(){ + return getBrowser().docShell.QueryInterface(Ci.nsIDocCharset).charset; + }, + validator: function(value){ + return isValid( encodings, value); + }, + completer: function(filter){ + return completion( encodings, filter); + } + } + +)); +var sbCharDetector = sbService.createBundle(gPrefService.getDefaultBranch('intl.charset.').getCharPref('detector')); +const DEFAULT_DETECTOR = createDetector(sbCharDetector.GetStringFromName('intl.charset.detector'))[0]; +vimperator.options.add(new vimperator.Option( ['autodetector','audet'], 'string', + { + shortHelp: 'set auto detect character encoding', + help: 'Please make certain of available value with <code class="command">:lsdet</code> command', + defaultValue: DEFAULT_DETECTOR, + setter: function(value){ + SetForcedDetector(true); + var pref = Cc['@mozilla.org/preferences-service;1'].getService(Ci.nsIPrefBranch); + var str = Cc['@mozilla.org/supports-string;1'].createInstance(Ci.nsISupportsString); + if (!value || value == 'off') { + str.data = ''; + } else { + str.data = value = getDetector(value); + } + pref.setComplexValue('intl.charset.detector',Ci.nsISupportsString, str); + BrowserSetForcedCharacterSet(value); + }, + getter: function(){ + var elms = document.getElementById('charsetMenu').getElementsByAttribute('checed','true'); + for (var i=0; i<elms.length; i++){ + if (elms[i].getAttribute('name') == 'detectorGroup'){ + var str = elms[i].getAttribute('id').substr('chardet.'.length); + return createDetector(str)[0]; + } + } + }, + validator: function(value){ + return isValid( detectors, value); + }, + completer: function(filter){ + return completion( detectors, filter); + } + } + +)); +function listCharset(arg, current, list){ + if (!arg) arg = '.'; + var reg = new RegExp(arg,'i'); + var str = []; + str.push('<table>'); + list.forEach(function(i){ + if (reg.test(i[0]) || reg.test(i[1])){ + str.push('<tr>'); + if (current == i[0]){ + str.push('<td class="hl-Title">' + i[0] + '</td><td class="hl-Title">' + i[1] + '</td>'); + } else { + str.push('<td>' + i[0] + '</td><td>' + i[1] + '</td>'); + } + str.push('</tr>'); + } + }); + str.push('</table>'); + vimperator.echo( str.join(''), true); +} +vimperator.commands.add(new vimperator.Command(['listencoding','lsenc'], + function(arg){ + listCharset(arg, vimperator.options.fileencoding, encodings); + },{ + usage: ['listencoding [expr]','lsenc [expr]'], + shortHelp: 'list all encodings', + help: 'current encoding is hi-light', + completer: function(filter){ + return completion(encodings, filter); + } + } +)); +vimperator.commands.add(new vimperator.Command(['listdetector','lsdet'], + function(arg){ + listCharset(arg, vimperator.options.autodetector, detectors); + },{ + usage: ['listdetector [expr]','lsdet [expr]'], + shortHelp: 'list all auto detectors', + help: 'current encoding is hi-light', + completer: function(filter){ + return completion(detectors, filter); + } + } +)); + +})(); + +// vim: set fdm=marker sw=4 ts=4 et: |