From 13f659cc11d6c07e1d50d906a339559056c7fc29 Mon Sep 17 00:00:00 2001 From: anekos Date: Wed, 7 Sep 2011 19:11:52 +0900 Subject: Init: ページ用の一時的なスタイルを簡単にセットするためのプラギン --- my-style.js | 277 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 my-style.js (limited to 'my-style.js') 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 = +<> + + anekos + New BSD License + +

+ + :mystyle-set + :mystyle set URL CSS +

+ Set CSS to URL. + If CSS has any names of defined style, they are expanded. +

+
+ + :mystyle-unset + :mystyle unset URL +

+ Unset style for URL. +

+
+ + g:my_style_define + g:my_style_define = STYLES + +

Define some styles and their names for completion and command.

+

+ e.g. + +

+
+
+
+ + anekos + New BSD License + +

+ + :mystyle-set + :mystyle set URL CSS +

+ URLCSS を適用します。 + CSS に定義されてスタイルの名前が含まれていると、それらは展開されます。 +

+
+ + :mystyle-set + :mystyle unset URL +

+ URL セットされたスタイルを解除します。 +

+
+ + g:my_style_define + g:my_style_define = STYLES + +

補完とコマンド用にスタイルとその名前を定義します。

+

+ e.g. + +

+
+
+
+; +// }}} + +(function () { + + const StyleNamePrefix = 'my-style-'; + + const DefaultDefinedStyle = { + main: <>, + nekome: <>, + vimpmask: <> + }; + + 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: -- cgit v1.2.3