/** * ==VimperatorPlugin== * @name stylesheet changer * @description enable to apply user stylesheets like Stylish * @description-ja Stylishの様にユーザスタイルシートの適用を可能にします * @author teramako teramako@gmail.com * @namespace http://d.hatena.ne.jp/teramako/20080405/vimperator_plugin_stylechanger_js * @license MPL 1.1/GPL 2.0/LGPL 2.1 * ==/VimperatorPlugin== * * Usage: * * :hi[ghlight] -> enable stylesheet * :hi[ghlight] [on|clear|off] -> enbale/disable stylesheet * :hi[ghlight] {alt style name} -> switch to the alternative stylesheet * * :colo[rschema] -> list available user stylesheets * :colo[rschema] {styleName} -> enable the style * :colo[rschema]! {styleName} -> disable the style * * {styleName} -> the name taked away from a CSS-file-name '.css' suffix * CSS-file are put in "~/vimperator/colors" directory * * `colors[chema]' command is similar to Stylish * * Example: * * auto load settings * let g:styles = "style,name" * */ (function(){ commands.addUserCommand(['hi[ghlight]'], 'basic style changer', function(arg){ if (!arg || arg == 'on'){ setStyleDisabled(false); } else if (arg == 'clear' || arg == 'off'){ setStyleDisabled(true); } else if ((getStylesheetList()).indexOf(arg) != -1){ stylesheetSwitchAll(window.content, arg); setStyleDisabled(false); } },{ completer: function(aFilter){ var list = [ ['on','enable stylesheet'], ['clear','disable stylesheet'], ['off','disable stylesheet'] ]; var styles = list.concat( getStylesheetList().map( function(elm){ return [elm,'alternative style']; } )); if (!aFilter) return [0,styles]; var candidates = styles.filter(function(elm){return elm[0].indexOf(aFilter) == 0;}); return [0, candidates]; } } ); function getStylesheetList(){ var list = []; var stylesheets = getAllStyleSheets(window.content); stylesheets.forEach(function(style){ var media = style.media.mediaText.toLowerCase(); if (media && media.indexOf('screen') == -1 && media.indexOf('all') == -1) return; if (style.title) list.push(style.title); }); return list; } liberator.plugins.styleSheetsManger = (function(){ var sss = Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService); var ios = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService); function init(){ if (!globalVariables.styles) return; var list = globalVariables.styles.split(/\s*,\s*/); for each(var item in list){ manager.load(item); } } function getCSSFiles(){ var colorDir = io.getSpecialDirectory('colors'); var cssFiles = []; if (colorDir){ cssFiles = io.readDirectory(colorDir).filter(function(file){ return /\.css$/.test(file.leafName.toLowerCase()) && !file.isDirectory() ; }); } return cssFiles; } function getURIFromName(aName){ var file = io.getSpecialDirectory('colors'); file.append(aName + '.css'); if (file.exists()) return ios.newFileURI(file); return null; } var manager = { load: function(aName){ if(!aName) return false; var uri = getURIFromName(aName); if (!uri) return false; if(sss.sheetRegistered(uri, sss.USER_SHEET)) sss.unregisterSheet(uri, sss.USER_SHEET); sss.loadAndRegisterSheet(uri, sss.USER_SHEET); if (options.verbose > 8) log('Resisted colorschema '+aName); return true; }, unload: function(aName){ if(!aName) return false; var uri = getURIFromName(aName); if (!uri) return false; if(sss.sheetRegistered(uri, sss.USER_SHEET)) sss.unregisterSheet(uri, sss.USER_SHEET); if (options.verbose > 8) log('Unresisted colorschema '+aName); return true; }, list: function(){ var str = ['User StyleSheet List']; var files = getCSSFiles().map(function(file){return file.leafName.replace(/\.css$/i,'');}); files.forEach(function(file,i){ var buf = ' ' + (i+1) + ' '; if (sss.sheetRegistered(getURIFromName(file), sss.USER_SHEET)){ buf += '*'; } else { buf += ' '; } str.push(buf +' ' + file); }); echo( str.join('\n'), true); } }; commands.addUserCommand(['colo[rschema]'], 'set user stylesheet', function(arg, special){ if (!arg){ manager.list(); return; } if (special){ manager.unload(arg) && echo('Unredisted '+arg); } else { manager.load(arg) && echo('Redisted '+arg); } },{ completer: function(filter, special){ var list = getCSSFiles().map(function(file){ var name = file.leafName.replace(/\.css$/i,''); return [name,sss.sheetRegistered(getURIFromName(name),sss.USER_SHEET) ? '*' : '']; }); if (!filter) return [0,list]; var candidates = []; list.forEach(function(item){ if(item[0].toLowerCase().indexOf(filter) == 0){ candidates.push(item); } }); return [0,candidates]; } } ); init(); return manager; })(); })(); // vim: sw=4 ts=4 sts=0 fdm=marker: