// PLUGIN_INFO//{{{ var PLUGIN_INFO = {NAME} simple takahashi-method presentation tool hogelog 0.1.1 2.3pre 2.3pre http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/takahashiPresentation.js 2008/12/23 09:20:07 ... and
...
. start :presentation. ]]>
; //}}} (function() { let keys = [ ['', 'next page', function() nextPage()], ['', 'prev page', function() prevPage()], ['^', 'first page', function() loadPage(0)], ['$', 'last page', function() loadPage(pages.length-1)], ['.', 'last page', function(count) loadPage(count?count-1:0), {count: true}], ['q', 'stop presentation', function() stop()], ]; let win; let doc; let pages = []; let curpage = 0; let pre; let header; let fontSize = 18.0; function addKeys() { keys.forEach(function([key, desc, action, extra]) mappings.addUserMap([modes.NORMAL], [key], desc, action, extra)); } function fitPage() { if(pre.innerHTML=='') return; pre.style.display = 'inline'; let parentWidth = pre.parentNode.offsetWidth; let parentHeight = pre.parentNode.offsetHeight; let width = pre.offsetWidth; let height = pre.offsetHeight; let preRatio = width/height; let winRatio = parentWidth/parentHeight; if(preRatio>winRatio) { fontSize *= 0.9*(parentWidth-10)/width; } else { fontSize *= 0.9*(parentHeight-10)/height; } pre.style.fontSize = fontSize+'px'; pre.style.display = 'block'; } function loadPage(page) { let text = pages[page]; pre.innerHTML = text; if(header) { header.innerHTML = (page+1)+'/'+pages.length; } fitPage(); } function nextPage() { curpage = curpage>=pages.length-1 ? 0 : curpage+1; loadPage(curpage); } function prevPage() { curpage = curpage<=0 ? pages.length-1 : curpage-1; loadPage(curpage); } function parsePages(text) { return text.split('----') .map(function(txt) txt.replace(/^(?:\r\n|[\r\n])|(?:\r\n|[\r\n])$/g, '')); } function save_setting(setting) { setting.fullscreen = options.fullscreen; setting.guioptions = options.guioptions; // TODO: save key mapping //setting.mappings = keys.map(function([key,]) { // let mapping = mappings.get(modes.NORMAL, key); // return [mapping.modes, key, mapping.description, mapping.action, mapping.extra]; //}); } function load_setting(setting) { options.fullscreen = setting.fullscreen; options.guioptions = setting.guioptions; // TODO: load key mapping //setting.mappings.forEach(function([modes, key, desc, action, extra]) { // mappings.addUserMap(modes, [key], desc, action, extra); //}); } let original_setting = {}; function start() { save_setting(original_setting); options.fullscreen = true; options.guioptions = ''; win = window.content; doc = win.document; let text = util.evaluateXPath('//div[@id="text"]').snapshotItem(0); pages = parsePages(text.innerHTML); addKeys(); header = util.evaluateXPath('//*[@id="header"]').snapshotItem(0); pre = util.evaluateXPath('//pre[@id="page"]').snapshotItem(0); pre.style.fontSize = fontSize+'px'; pre.style.margin = '0px'; loadPage(0); } function stop() { load_setting(original_setting); } commands.add(['presentation'], 'start presentation', //{{{ function(args) { start(); }, { argCount: '0', }); //}}} })(); // vim: fdm=marker sw=4 ts=4 et: 'n29' href='#n29'>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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
// PLUGIN_INFO//{{{
var PLUGIN_INFO =
<VimperatorPlugin>
    <name>{NAME}</name>
    <description>hash of file</description>
    <author mail="konbu.komuro@gmail.com" homepage="http://d.hatena.ne.jp/hogelog/">hogelog</author>
    <version>0.2.2</version>
    <minVersion>2.3</minVersion>
    <maxVersion>2.3</maxVersion>
    <updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/hash.js</updateURL>
    <detail><![CDATA[

== COMMANDS ==
hash:
    :hash md2|md5|sha1|sha256|sha384|sha512 file-path

]]></detail>
</VimperatorPlugin>;
//}}}

(function() {
    const PR_UINT_MAX = 0xffffffff;
    let Crypt = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
    let Algos = [
        ["md2", "MD2 Algorithm"],
        ["md5", "MD5 Algorithm"],
        ["sha1", "SHA1 Algorithm"],     // SHA-1
        ["sha256", "SHA256 Algorithm"], // SHA-256
        ["sha384", "SHA384 Algorithm"], // SHA-384
        ["sha512", "SHA512 Algorithm"], // SHA-512
    ];

    function getStream(path)
    {
        let file = io.File(path);
        let stream = Cc["@mozilla.org/network/file-input-stream;1"]
            .createInstance(Ci.nsIFileInputStream);
        stream.init(file, 0x01, 0444, 0);
        return stream;
    }

    // return the two-digit hexadecimal code for a byte
    function toHexString(charCode)
    {
      return ("0" + charCode.toString(16)).slice(-2);
    }


    commands.addUserCommand(["hash"], "hash of file",
        function(args){
            if (args.length!=2) {

                liberator.echo("usage \":hash md2|md5|sha1|sha256|sha384|sha512 file-path\"");
                return false;
            }
            let [algo, path] = args;
            let stream = getStream(path);

            Crypt.initWithString(algo);

            // read the entire stream
            Crypt.updateFromStream(stream, PR_UINT_MAX);

            stream.close();

            // get base-64 string
            let hash = Crypt.finish(false);

            // convert the binary hash data to a hex string.
            let str = [toHexString(hash.charCodeAt(i)) for(i in hash)].join("");
            util.copyToClipboard(str, true);
        },
        {
            bang: true,
            completer: function (context, args){
                if (args.completeArg == 0) {
                    context.title = ["hash", "algorithm"];
                    context.completions = Algos;
                } else if (args.completeArg == 1) {
                    completion.url(context, "f");
                }
            },
            literal: 1,
        },
        true
        );

})();
// vim: fdm=marker sw=4 ts=4 et: