[vimp] add PDF.js plugin
[~bandali/configs] / vimperator / .vimperator / plugin / PDF.js.js
diff --git a/vimperator/.vimperator/plugin/PDF.js.js b/vimperator/.vimperator/plugin/PDF.js.js
new file mode 100644 (file)
index 0000000..0f04981
--- /dev/null
@@ -0,0 +1,250 @@
+/* NEW BSD LICENSE {{{
+Copyright (c) 2012, anekos.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice,
+       this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice,
+       this list of conditions and the following disclaimer in the documentation
+       and/or other materials provided with the distribution.
+    3. The names of the authors may not be used to endorse or promote products
+       derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+
+###################################################################################
+# http://sourceforge.jp/projects/opensource/wiki/licenses%2Fnew_BSD_license       #
+# に参考になる日本語訳がありますが、有効なのは上記英文となります。                #
+###################################################################################
+
+}}} */
+
+// INFO {{{
+let INFO = xml`
+<plugin name="PDF.js.js" version="1.0.0"
+        href="http://vimpr.github.com/"
+        summary="PDF.js controller."
+        lang="en-US"
+        xmlns="http://vimperator.org/namespaces/liberator">
+  <author email="anekos@snca.net">anekos</author>
+  <license>New BSD License</license>
+  <project name="Vimperator" minVersion="3.0"/>
+  <p></p>
+  <item>
+    <tags>:pdfjs-mapping-sample</tags>
+    <description><p>mapping sample</p><code><![CDATA[
+      nnoremap -urls ^\\.pdf$ i :<C-u>pdfjs index<Space>
+      nnoremap -urls ^\\.pdf$ z :<C-u>pdfjs zoom<Space>
+    ]]></code></description>
+  </item>
+</plugin>`;
+// }}}
+
+(function () {
+
+  let scrollCount = 1;
+
+  // Functions {{{
+
+  function getScrollHeight (count) {
+    let base = content.innerHeight / 10;
+    if (count > 0)
+      scrollCount = count;
+    return base  * scrollCount;
+  }
+
+  function addMap (keys, desc, action) {
+    mappings.addUserMap(
+      [modes.NORMAL],
+      keys,
+      desc + ' - PDF.js.js',
+      action,
+      {
+        count: true,
+        matchingUrls: /\.pdf$/
+      }
+    );
+  }
+
+  function getOutline () {
+    return Array.slice(content.document.querySelector('#outlineView').querySelectorAll('.outlineItem > a'));
+  }
+
+  function getOutlineLevel (node) {
+    let level = 0;
+    while (node && (node.getAttribute('id') != 'outlineView')) {
+      node = node.parentNode;
+      level++;
+    }
+    return node ? (level / 2): 0;
+  }
+
+  function nSpace (level) {
+    let res = '';
+    for (i = 0; i < level; i++)
+      res += ' ';
+    return res;
+  }
+
+  // }}}
+
+  // Mappings {{{
+
+  addMap(
+    ['j'],
+    'Scroll Down',
+    function (count) {
+      content.document.querySelector('#viewerContainer').scrollTop += getScrollHeight(count);
+    }
+  );
+
+  addMap(
+    ['k'],
+    'Scroll up',
+    function (count) {
+      content.document.querySelector('#viewerContainer').scrollTop -= getScrollHeight(count);
+    }
+  );
+
+  addMap(
+    ['n'],
+    'Next page',
+    function (count) {
+      content.window.wrappedJSObject.PDFView.page += (count > 0 ? count : 1);
+    }
+  );
+
+  addMap(
+    ['p'],
+    'Previous page',
+    function (count) {
+      content.window.wrappedJSObject.PDFView.page -= (count > 0 ? count : 1);
+    }
+  );
+
+  addMap(
+    ['gg'],
+    'Go to page top or N page.',
+    function (count) {
+      if (count > 0)
+        content.window.wrappedJSObject.PDFView.page = count;
+      else
+        content.window.wrappedJSObject.PDFView.page = 1;
+    }
+  );
+
+  addMap(
+    ['zh'],
+    'Fit to page.',
+    function (count) {
+      liberator.execute('pdfjs zoom page-fit');
+    }
+  );
+
+  addMap(
+    ['zw'],
+    'Fit to page to width.',
+    function (count) {
+      liberator.execute('pdfjs zoom page-width');
+    }
+  );
+
+  addMap(
+    ['za'],
+    'Fit to page to width.',
+    function (count) {
+      liberator.execute('pdfjs zoom auto');
+    }
+  );
+
+  addMap(
+    ['zz'],
+    'Fit to page to width.',
+    function (count) {
+      commandline.open('', 'pdfjs zoom ', modes.EX);
+    }
+  );
+
+  // }}}
+
+  commands.addUserCommand( // {{{
+    ['pdfjs'],
+    'PDF.js',
+    function () void 'Meow is best',
+    {
+      subCommands: [
+        new Command(
+          ['i[ndex]'],
+          'Jump page by index',
+          function (args) {
+            let index = args.literalArg.match(/^#(\d+)$/);
+            if (index) {
+              let os = getOutline();
+              buffer.followLink(os[parseInt(index[1], 10)], liberator.CURRENT_TAB);
+            } else {
+              content.window.wrappedJSObject.PDFView.page = parseInt(args.literalArg, 10);
+            }
+          },
+          {
+            literal: 0,
+            completer: function (context, args) {
+              function desc (o) {
+                const PageRE = /#page=(\d+)\&/;
+                if (o.href && PageRE.test(o.href)) {
+                  return `${nSpace(getOutlineLevel(o))} ${o.textContent} (p${o.href.match(PageRE)[1]})`;
+                } else {
+                  return `${nSpace(getOutlineLevel(o))} ${o.textContent}`;
+                }
+              }
+
+              let os = getOutline();
+              context.compare = void 0;
+              context.filters = [CompletionContext.Filter.textDescription];
+              context.completions = [
+                [
+                  '#' + i, desc(o)
+                ]
+                for ([i, o] in Iterator(os))
+              ];
+            }
+          }
+        ),
+
+        new Command(
+          ['z[oom]'],
+          'Zoom',
+          function (args) {
+            content.window.wrappedJSObject.PDFView.parseScale(args.literalArg);
+          },
+          {
+            literal: 0,
+            completer: function (context, args) {
+              let os = Array.slice(content.document.querySelector('#scaleSelect').querySelectorAll('option'));
+              context.completions = [
+                [o.value, o.textContent]
+                for ([, o] in Iterator(os))
+              ];
+            }
+          }
+        )
+      ]
+    },
+    true
+  ); // }}}
+
+})();
+
+// vim:sw=2 ts=2 et si fdm=marker: