aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoranekos2011-09-07 19:11:52 +0900
committeranekos2011-09-07 19:11:52 +0900
commit13f659cc11d6c07e1d50d906a339559056c7fc29 (patch)
tree3883b7a59af13643a6579c9cfd6a79f4bac55d2c
parenta285e7bf25a925b25e121adebba220f6b94207cd (diff)
downloadvimperator-plugins-13f659cc11d6c07e1d50d906a339559056c7fc29.tar.bz2
Init: ページ用の一時的なスタイルを簡単にセットするためのプラギン
-rw-r--r--my-style.js277
1 files changed, 277 insertions, 0 deletions
diff --git a/my-style.js b/my-style.js
new file mode 100644
index 0000000..fae0b52
--- /dev/null
+++ b/my-style.js
@@ -0,0 +1,277 @@
+/* NEW BSD LICENSE {{{
+Copyright (c) 2011, 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 =
+<>
+ <plugin name="MyStyle" version="1.0.0"
+ href="http://vimpr.github.com/"
+ summary="Apply my style sheet to current page."
+ 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>:mystyle-set</tags>
+ <spec>:mys<oa>tyle</oa> set <a>URL</a> <a>CSS</a></spec>
+ <description><p>
+ Set <a>CSS</a> to <a>URL</a>.
+ If <a>CSS</a> has any names of defined style, they are expanded.
+ </p></description>
+ </item>
+ <item>
+ <tags>:mystyle-unset</tags>
+ <spec>:mys<oa>tyle</oa> unset <a>URL</a></spec>
+ <description><p>
+ Unset style for <a>URL</a>.
+ </p></description>
+ </item>
+ <item>
+ <tags>g:my_style_define</tags>
+ <spec>g:my_style_define = <a>STYLES</a></spec>
+ <description>
+ <p>Define some styles and their names for completion and command.</p>
+ <p>
+ e.g.
+ <code><![CDATA[
+:js <<EOM
+liberator.globalVariables.my_style_define = {
+ blackboard: '* {color: white !important; background-color: #004040 !important }',
+ bold: '* { font-weight: bold !important }'
+};
+EOM
+ ]]></code>
+ </p>
+ </description>
+ </item>
+ </plugin>
+ <plugin name="MyStyle" version="1.0.0"
+ href="http://vimpr.github.com/"
+ summary="現在のページに自分用のスタイルを適用する"
+ lang="ja"
+ 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>:mystyle-set</tags>
+ <spec>:mys<oa>tyle</oa> set <a>URL</a> <a>CSS</a></spec>
+ <description><p>
+ <a>URL</a> に <a>CSS</a> を適用します。
+ <a>CSS</a> に定義されてスタイルの名前が含まれていると、それらは展開されます。
+ </p></description>
+ </item>
+ <item>
+ <tags>:mystyle-set</tags>
+ <spec>:mys<oa>tyle</oa> unset <a>URL</a></spec>
+ <description><p>
+ <a>URL</a> セットされたスタイルを解除します。
+ </p></description>
+ </item>
+ <item>
+ <tags>g:my_style_define</tags>
+ <spec>g:my_style_define = <a>STYLES</a></spec>
+ <description>
+ <p>補完とコマンド用にスタイルとその名前を定義します。</p>
+ <p>
+ e.g.
+ <code><![CDATA[
+:js <<EOM
+liberator.globalVariables.my_style_define = {
+ blackboard: '* {color: white !important; background-color: #004040 !important }',
+ bold: '* { font-weight: bold !important }'
+};
+EOM
+ ]]></code>
+ </p>
+ </description>
+ </item>
+ </plugin>
+</>;
+// }}}
+
+(function () {
+
+ const StyleNamePrefix = 'my-style-';
+
+ const DefaultDefinedStyle = {
+ main: <><![CDATA[
+ * {
+ color: white !important;
+ background-color: #004040 !important;
+ background-image: none !important;
+ }
+ ]]></>,
+ nekome: <><![CDATA[
+ body {
+ background-image: url(http://snca.net/images/redeye.jpg) !important;
+ }
+ * {
+ background: transparent !important;
+ color: white !important;
+ }
+ ]]></>,
+ vimpmask: <><![CDATA[
+ body {
+ background-image: url(http://snca.net/images/ildjarn.png) !important;
+ background-repeat: no-repeat !important;
+ background-position: right bottom !important;
+ background-attachment: fixed !important;
+ }
+ ]]></>
+ };
+
+ Object.defineProperty(
+ __context__,
+ 'DefinedStyles',
+ {
+ get: function () (liberator.globalVariables.my_style_define || DefaultDefinedStyle)
+ }
+ );
+
+ const Currents = {};
+
+ function expand (css)
+ css.replace(/\w+/g, function (n) (DefinedStyles.hasOwnProperty(n) ? DefinedStyles[n] : n));
+
+ function urlCompleter (context) {
+ let cs = [];
+ let loc = content.location;
+ let pathname = loc.pathname;
+ let paths = pathname.split('/').slice(1);
+
+ for (let i = 0; i < paths.length; i++) {
+ cs.push([
+ [loc.protocol + '/', loc.hostname].concat(paths.slice(0, i)).join('/') + '/*',
+ 'Current URL'
+ ]);
+ }
+
+ cs.push([loc.hostname, 'Current HOST'])
+
+ context.compare = null;
+ context.completions = cs;
+ }
+
+ function styleCompleter (context, args) {
+ let style = Currents[args[0]];
+ if (style)
+ context.completions = [[style, 'CURRENT']];
+
+ context.fork(
+ 'DEFINED',
+ 0,
+ context,
+ function (context) {
+ let m = args.literalArg.match(/(\s+)\S*$/);
+ if (m)
+ context.advance(m.index + m[1].length);
+
+ context.filters = [CompletionContext.Filter.textDescription];
+ context.completions = [
+ [n, v]
+ for ([n, v] in Iterator(DefinedStyles))
+ ];
+ }
+ );
+ }
+
+ function styleNameCompleter (context) {
+ context.completions = [
+ [style.name.slice(StyleNamePrefix.length), '']
+ for ([, style] in Iterator(styles))
+ if (style.name.indexOf(StyleNamePrefix) === 0)
+ ];
+ }
+
+
+ const SubCommands = [
+ new Command(
+ ['s[et]'],
+ 'Set style',
+ function (args) {
+ let m = args[0];
+ Currents[m] = args.literalArg;
+ styles.addSheet(false, StyleNamePrefix + m, m, expand(args.literalArg));
+ },
+ {
+ literal: 1,
+ completer: function (context, args) {
+ (args.length > 1 ? styleCompleter : urlCompleter)(context, args);
+ }
+ }
+ ),
+
+ new Command(
+ ['u[nset]'],
+ 'Unset style',
+ function (args) {
+ let m = args[0];
+ delete Currents[m];
+ if (m) {
+ styles.removeSheet(false, StyleNamePrefix + m);
+ } else {
+ for (let [, style] in Iterator(styles)) {
+ if (style.name.indexOf(StyleNamePrefix) === 0)
+ styles.removeSheet(false, style.name);
+ }
+ }
+ },
+ {
+ literal: 1,
+ completer: styleNameCompleter
+ }
+ )
+ ];
+
+ commands.addUserCommand(
+ ['mys[tyle]'],
+ 'Set style for me',
+ function (args) {
+ /* TODO list */
+ },
+ {
+ bang: true,
+ literal: 1,
+ subCommands: SubCommands
+ },
+ true
+ );
+
+})();
+
+// vim:sw=2 ts=2 et si fdm=marker: