写一个Atom编辑器插件,动画语法着色
Writing a Atom editor plugin, animated syntax coloring
我在做一个小实验,我只是需要有人指导我…
我想让我自己的自定义语法着色(Javascript),这需要动画。
大加分将(如果可能的话)是使用着色语言的字体动画(片段着色器)的可能性。这样的事情在Atom中可能吗?
例子:
两个概念是"基于事件的"动画和"持久动画"。
基于事件:
想象你正在写Javascript,当你写function时,它不会直接着色,而是慢慢地渐变成它的颜色。
示例代码:
keyword('function').on('creation', function(keywordAnimableObject) {
keywordAnimableObject.fromTo ({opacity:0, color:rgb(0,0,0)}, {opacity:1, color:rgb(1,1,0) });
});
持久的基础:
每个关键字或符号(if, else &&, function,(),{},逗号等)都有自己的频率。假设'function'的频率为0.5Hz,如果else的频率为0.25Hz……
例如,这个频率将修改关键词颜色"hue"。keyword('function').on('idle', function(keywordAnimableObject, time) {
var baseColor = rgb(1,1,0);
var frequency = 0.5;
var currColor = hueShiftBy(baseColor, Math.sin(time*2*PI*frequency);
keywordAnimableObject.set({ color: currColor });
});
同样,如果着色器是可能的,每个关键字将有微妙的动画模式。
现在想象一下,如果你在某个地方有错误,频率会更高,例如1.5Hz,更"烦人"。
allKeywords().on('notDeclared', function(keywordAnimableObject, time) {
var baseColor = Color.red;
var frequency = 1.5;
var currColor = hueShiftBy(baseColor, Math.sin(time*2*PI*frequency);
keywordAnimableObject.set({ color: currColor });
});
好吧,我知道这可能很烦人,但我认为这是值得尝试的:)。不仅仅是为了动画,而且是为了制作漂亮的语法样式而不仅仅是着色。
我相信您可以通过纯css实现示例中的大部分内容。但你必须考虑到许多事情,可能会出现错误的两种方法(CSS和JS)
如果你走JS路线,你有两种方式处理事情:
- 在我看来,第一种更简洁的方法是在编辑器上注册令牌相关事件,以便在匹配
function
等关键字时得到通知。此时还没有对DOM元素的引用,如果为当前缓冲区的屏幕外部分创建令牌(只有在窗格区域中可见的行实际上出现在DOM中),则可能根本没有得到对DOM元素的引用。但是,如果您可以检索令牌的DOM元素,则可以对其进行任何操作。第二种选择是使用一个突变观察者来跟踪编辑器视图中的变化,并匹配与你想要动画的元素相对应的元素(为此,你需要知道应用于元素的类)。在性能方面,这种方法是一个大障碍,突变观察器并不便宜,而且与处理普通JS对象相比,每个dom相关的操作通常都很慢。如果你走CSS路线,事情会变得简单得多:
为你想要使用的视觉效果构建或生成css动画,并将它们影响到你想要匹配的令牌的选择器。例如,要在JS文件中为function关键字设置动画,使用如下所示:
.editor .source.js .function {
animation: blink 0.4s; // where blink is css animation defined beforehand
}
你可以使用线性或循环动画,css状态(例如:hover)和所有可用的css。您不需要过多地担心目标元素的生命周期,因为Atom已经将缓冲区的呈现限制为编辑器视图中可见的行。
至于你关于着色器的最后一点,在Chrome中有可用的CSS过滤器(在Atom中也是如此),这些过滤器可以使用SVG过滤器进行定制,但由于不太熟悉这些功能,我不能说使用它们有多困难。关于自定义着色器,据我所知,由于许多性能问题和更改元素的命中测试,Chrome放弃了对自定义着色器的支持。
- Reactjs在不使用插件的情况下为离开组件设置动画
- 如何在没有外部插件的情况下在jQuery中制作一个滚动动画
- 试图弄清楚某个网站的文本动画是否是用某个库或插件完成的
- jQuery有没有,或者有没有jQuery插件,内置了监听CSS3动画事件的功能(例如animationEnd)
- jQuery SVG插件转换动画错误
- 鼠标关闭时停止/反向动画(baraja jquery插件)
- 在 PHP 页面上加载富文本编辑器 (TinyMCE) 的 jquery 插件时显示加载动画
- 图像滑块,屏幕大小调整时边距动画中断(不使用滑块插件)
- 将一个 jQuery 缓动插件动画分成两个(左 + 右)
- ScrollMagic插件正在工作,但不是"打结”;滚动的动画
- 哪些工具(不是插件)可以用来创建可以在运行时操作的动画
- 有没有一种方法来动画的悬停类在jquery中不使用插件/ui工具包
- 动画插件保持预加载
- 写一个Atom编辑器插件,动画语法着色
- 如何在JavaScript插件中使用CSS动画
- 使用javascript绘制动画线(没有Raphael或其他插件)
- 基于滚动的动画问题的循环jquery插件
- JQuery翻转插件和动画排队问题
- 添加一个动画过渡到第三方jquery插件- Dropit
- JPages插件在安装时禁用动画