aboutsummaryrefslogtreecommitdiffstats
path: root/encodingSwitcher.js
blob: f4014bd305f5df0d6e3eaeee449958721aacb2e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Vimperator plugin: 'Walk Input'
// Last Change: 2008-11-19
// License: BSD
// Version: 1.1
// Maintainer: Takayama Fumihiko <tekezo@pqrs.org>

// ------------------------------------------------------------
// The focus walks <input> & <textarea> elements.
// If you type M-i first, the focus moves to "<input name='search' />".
// Then if you type M-i once more, the focus moves to "<input name='name' />".
//
// <html>
//     <input name="search" />
//     <a href="xxx">xxx</a>
//     <a href="yyy">yyy</a>
//     <a href="zzz">zzz</a>
//     <input name="name" />
//     <textarea name="comment"></textarea>
// </html>

(function () {

var xpath = '//input[@type="text" or @type="password" or @type="search" or not(@type)] | //textarea';

var walkinput = function (forward) {
    var focused = document.commandDispatcher.focusedElement;
    var current = null;
    var next = null;
    var prev = null;
    var list = [];

    (function (frame) {
      var doc = frame.document;
      if (doc.body.localName.toLowerCase() == 'body') {
        let r = doc.evaluate(xpath, doc, null/**
 * 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){
    for (let i = 0, l = detectors.length; i < l; i++){
        if (detectors[i][0].toLowerCase() == name.toLowerCase()){
            return detectors[i][0] + detectors[i][2];
        }
    }
}
function getEncoding(name){
    for (let i = 0, l = encodings.length; i < l; i++){
        if (encodings[i][0].toLowerCase() == name.toLowerCase()){
            return encodings[i][0];
        }
    }
}
function isValid(array, value) array.some(function(v)
    v[0].toLowerCase() == value.toLowerCase());
function completion(array, filter){
    if (!filter) return array;
    filter = filter.toLowerCase();
    return array.filter(function(v)
        v[0].toLowerCase().indexOf(filter) == 0);
}
var sbCharDefault = sbService.createBundle(gPrefService.getDefaultBranch('intl.charset.').getCharPref('default'));
const DEFAULT_CHARSET = sbCharDefault.GetStringFromName('intl.charset.default');
liberator.options.add(['fileencoding','fenc'],'set the charactor encoding for the current page','string', DEFAULT_CHARSET,
    {
        setter: function(value){
            if (!value) return;
            value = getEncoding(value);
            SetForcedCharset(value);
            //SetDefaultCharacterSet(value);
            BrowserSetForcedCharacterSet(value);
        },
        getter: function()
            getBrowser().docShell.QueryInterface(Ci.nsIDocCharset).charset,
        validator: function(value)
            isValid( encodings, value),
        completer: function(filter)
            [0,completion( encodings, filter)]
    }
);
var sbCharDetector = sbService.createBundle(gPrefService.getDefaultBranch('intl.charset.').getCharPref('detector'));
const DEFAULT_DETECTOR = createDetector(sbCharDetector.GetStringFromName('intl.charset.detector'))[0];
liberator.options.add(['autodetector','audet'],'set auto detect character encoding','string',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 (let i = 0,l = elms.length; i < l; i++){
                if (elms[i].getAttribute('name') == 'detectorGroup'){
                    let str = elms[i].getAttribute('id').substr('chardet.'.length);
                    return createDetector(str)[0];
                }
            }
        },
        validator: function(value)
            isValid( detectors, value),
        completer: function(filter)
            [0,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])) return;
        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>');
    liberator.echo( str.join(''), true);
}
liberator.commands.addUserCommand(['listencoding','lsenc'],'list all encodings',
    function(arg){
        listCharset(arg, liberator.options.fileencoding, encodings);
    },{
        completer: function(filter)
            [0,completion(encodings, filter)]
    }
);
liberator.commands.addUserCommand(['listdetector','lsdet'],'list all auto detectors',
    function(arg){
        listCharset(arg, liberator.options.autodetector, detectors);
    },{
        completer: function(filter)
            [0,completion(detectors, filter)]
    }
);

})();

// vim: set fdm=marker sw=4 ts=4 et: