有些迷惑吧?今天,我将向你介绍Zen Coding,一组用于快速HTML和CSS编码的工具。最初由Vadim Makeev在2009年4月提出(文章为俄语),由鄙人(也就是我)开发了数月并最终达到比较成熟的状态。Zen Coding由两个核心组件组成:一个缩写扩展器(缩写为像CSS一样的选择器)和上下文无关的HTML标签对匹配器。看一下这个演示视频来看一下它们能为你做些什么。
注意:该视频原版位于Vimeo,但是要看的话需要翻[和谐]墙先,地址在这里:http://vimeo.com/7405114,上面的视频是我费尽周折从Vimeo上下载下来上传到优酷的,上传后质量竟被大打折扣了,囧。youtube上也有一份视频,是基于Aptana的演示,一样很精彩:http://www.youtube.com/watch?v=ug84Ypwqfzk。PS:貌似youtube要比Vimeo翻[和谐]墙容易些,不过如何翻[和谐]墙不在本站讨论范围。
如果你想跳转到详细介绍和使用指南,请看一下演示页面并立刻下载你适用的插件:
Demo
下載(完全支援)
- Aptana (跨平台);
- Coda, via TEA for Coda (Mac);
- Espresso, via TEA for Espresso (Mac);
下載(部分支持,只支援「展開縮寫」)
- TextMate (只能用於Mac機,Windows可以使用E-text編輯器替代);
- TopStyle;
- Sublime Text;
- GEdit;
- Dreamweaver CS4
- editArea線上編輯器;
- Zen Coding線上編輯器中文版
現在讓我們來看看這些工具是如何運作的吧。
展開縮寫
展開縮寫功能將類似CSS的選擇器轉換為XHTML程式碼。術語「縮寫」可能有點難以理解。為什麼不直接稱之為「CSS選擇器」呢?嗯,首要原因是語義化:「選擇器」意為選擇一些東西,但是在這裡我們事實上是生成 一些東西,是寫一個長代碼的較短的替代。其次,它只是使用真實的CSS選擇器語法的一個小的子集,並且添加了一些新的操作符。
這裡是一個支援的屬性和操作符的列表:
- E
元素名稱(div, p); - E#id
使用id的元素(div#content, p#intro, span#error); - E.class
使用類別的元素(div.header, p.error.critial). 你也可以聯合使用class和idID: div#content.column.width; - E>N
子代元素(div>p, div#footer>p>span); - E N
兄弟元素(h1 p, div#header div#content div#footer); - E*N
元素倍增(ul#nav>li*5>a); - E$*N
條目編號 (ul#nav>li.item-$*5);
正如你能看到的,你已經知道如何使用Zen Coding了:只是些一個簡單的仿CSS選擇器(呃,“縮寫”抱歉),就像這樣…
div#header>img.logo ul#nav>li*4>a
…然後呼叫」展開縮寫」行為。
這裡有兩個新增的運算元:元素倍增和條目編號。例如,如果你想產生5個
div#i$-test. class$$$*5
會轉換成:
Zen Coding是如何知道什麼時候應該為產生的標籤添加預設的屬性或跳過關閉標籤的?有一個專門的文件,名為zen_settings .js描述了輸出元素。這是一個簡單的JSON文件,描述每種語言的縮寫(是的,你可以為不同的句法定義縮寫,例如HTML、XSL、CSS等)。通用的語言縮寫定義看起來像這樣:
元素类型
Zen Coding有两个主要的元素类型:“片段(snippets)” 和 “缩写(abbreviations)”。片段就是随意的代码碎片,而缩写是标签定义。通过片段,你可以写出你想要的任何代码,它也会照你写的格式输出;但是你必须手动的格式化它(使用\n 和 实现换行和缩进) 并将${child}变量放到你想要输出子元素的地方,就像这样:cc:ie6>style。如果你不使用${child}变量,子元素将会输出于代码片段的后面。
有了缩写,您必须编写标记定义,而且语法是非常重要的。通常,你必须写一个简单的带有所有默认的属性的标签,比如: 。当Zen Coding被加载后,它会解析一个标签定义到一个描述该标签的名字、属性(包括它们的顺序)以及该标签是否为空的特定的对象中。所以,如果你写,你会告诉Zen Coding这个标签必须是空的,然后“扩展缩写”行为就会在输出之前为它使用特定的规则。
对于片段和缩写,你可以添加一个管道符号,它告诉Zen Coding当缩写被展开的时候光标会被定位到哪里。默认的,Zen Coding 将光标放在空属性的引号中间以及开始和关闭标签的中间。
例子
那么,这里解释一下当你写了一个缩写并召唤“展开缩写”行动时发生的事情。首先,它将一个完整的缩写分开为独立的元素:这样div>a 会被分成div 和a 元素,当然也会维持他们的关系。然后,每个元素,解析器先在代码片段内而后在缩写中寻找定义。如果它找不到,将会使用元素的名字作为新的标签,并为其添加缩写中定义的id和class。比如,如果你写mytag#example,解析器在片段或缩写中找不到mytag定义,它就会输出
我们制作了很多默认的CSS和HTML缩写和片段。你会发现学习使用Zen Coding可以增加你的生产力。
HTML 标签对匹配器
对于HTML编码者的另一个非常常见的任务是寻找一个元素的标签对。例如你想选择整个
不幸的是,許多現代開發工具在該功能方面有所欠缺。那我就決定寫一個我自己的標籤對匹配器作為Zen Coding的一部分。不過它依然在beta階段並尚存一些問題,但它可以運作的很不錯並且很快。不是瀏覽整個文件(像通常的那種HTML標籤對匹配器的做法),它從遊標的當前位置開始尋找相關的標籤。這使得它非常快且上下文無關:它甚至可以用於這段JavaScript程式碼片段:
var table = '
' j ' | ';
使用縮寫包裹
這真的是一個很酷的特性,它將縮寫和標籤對匹配器的功能合併到一起了。你有多少才發現你需要添加一個包裹元素以修正一個瀏覽器bug?或者你需要添加一個裝飾,例如一個背景圖片或邊框到一個區塊級內容?你必須寫開始標籤,暫時打斷你的程式碼,找到相關的點然後關閉標籤。這就是「使用縮寫包裹」能幫助你的地方。
該功能相當簡單:它要求你輸入縮寫,然後執行適當的「展開縮寫」行動並將你期望的文字放到你縮寫的最後一個元素裡面。如果你沒有選擇任何文本,它就會啟動標籤對匹配器並使用結果。它同樣能搞清楚你的遊標的位置:標籤的內容裡面或是開始和關閉標籤中間。依賴它的位置,它會包裹標籤的內容或標籤本身。
縮寫包裹為包裹個別行引入了一個特定的縮寫句法。簡單跳到倍增操作符後面的數字,例如:ul#nav>li*>a。當Zen Coding 發現一個使用未定義的倍增數的時候,它會將它作為一個重複元素:你的章節中有多少行,它就會輸出多少次,並將每行的內容放到重複元素的最後一個子元素裡面。
如果你在這段文字外麵包裹這段縮寫div#header>ul#navigation>li.item$*>a>span:
About Us
Products
News
Blog
Contact Up
你將會得到以下結果:
支持的编辑器
Zen Coding并不依赖某个特定的编辑器。它是一个只处理文本的出色的组件:它获取文本、做一些处理并放回新的文本(或索引,用于标签匹配)。Zen Coding由JavaScript和Python编写,所以它实际上可以运行于任何平台。在Windows,你可以运行JavaScript版本,而Mac和Linux 分支可以使用Python版。
如果让你的编辑器支持Zen Coding,你需要写一个特定的可以在你的编辑器和Zen Coding之间转换数据的插件。问题是一个编辑器可能不会完整的支持Zen Coding因为它本身的插件系统。比如,TextMate通过使用脚本输出替换当前行很容的就支持了“展开缩写”功能,但是它不能处理标签对匹配因为没有标准的方法请求TextMate来选择内容。
完全支持
- Aptana (跨平台);
- Coda, via TEA for Coda (Mac);
- Espresso, via TEA for Espresso (Mac);
部分支持(只支持“展开缩写”)
- TextMate (只能用于Mac机,Windows可以使用E-text编辑器替代);
- TopStyle;
- Sublime Text;
- GEdit;
- Dreamweaver CS4
- editArea在线编辑器;
- Zen Coding在线编辑器中文版
Aptana是我主要的开发环境,它使用一个JavaScript版本的Zen Coding。它也包含很多其它的我用于日常工作的工具,所以任何一个新的Zen Coding版本都将会首先对Aptana可用,然后部署到Python并兼容其它的编辑器。
Coda和Espresso 插件被杰出的Text Editor Actions (TEA) 平台支持,由Ian Beck开发。原始的源代码在GitHub上,但我还是制作了我自己的分支以整合Zen Coding的特性。
总结
很多尝试过Zen Coding的人都说它改变了他们写页面的方式。当然还有很多事情要做,还有很多的编辑器需要被支持以及一些文档要写。请浏览现在的文档 以及源代码以寻找你的问题的答案。希望你喜欢Zen Coding!
附:Zen coding的具体用法
遗憾的是, 本文原作者并没有说明zen coding的具体用法,神飞认为有必要做以下简要的说明。这里就以Aptana/Eclipse和Dreamweaver为例,其它编辑器平台暂不描述,如有疑问可以在评论中与前端观察的网友交流。
Aptana/Eclipse
由于Aptana本身就是基于Eclipse的,所以,Zen Coding也是支持Eclipse的,只是需要一个EclipseMonkey插件的支持,Aptana已经封装了这个插件,所以如果你使用Aptana,下面的第一步可以跳过。
注意事項:
- Aptana版的官方插件是基於MAC機的,如果你用的是Windows,需要手動更改快捷鍵(在每個文件頭部的註解片段中更改)
- 官方的文件編碼有點兒亂,修改官方js的時候,請注意編碼問題,修改不當會造成相關功能的丟失;
DreamWeaver
好消息是,現在已經有了Zen coding for DreamWeaver插件,壞消息是,該插件支援的功能很少,只支援展開縮寫功能。而且預設的快捷鍵是無效的。只能在「命令」選單中點選操作。另外,沒有測試該插件是不是只支援CS4版本。不過比較好的是,作者將本插件的原始碼也放出了,你可以自訂一個Dreamweaver的插件。
事實上,官方的DW插件在Windows下有點兒bug,就是會出現空白的行,我簡單的修正了下,重新編譯了個包,在本機測試沒問題,感興趣的兒童鞋款可下載嘗試:http://www.boxcn.net/shared/c71z7x7sfe
PS:官方的DW插件已經更新,推薦到官方去下載。新的插件增加了更多的功能支援。 UPDATE @ 12-23-2009
特別推薦:豪情同學將縮寫給實踐了一番,總結出了很多很棒的用例,推薦大家去學習。
原作者介紹:
Sergey Chikuyonok是一位俄羅斯的前端開發工程師和作者,他在優化方面有很大的熱情:從圖片、JavaScript效果到工作流程和節省時間的編碼。造訪他的首頁和他的Twitter。
原文來自:http://www.qianduan.net/zen-coding-a-new-way-to-write-html-code.html