“插件IDE”jxml语言(js+xml) 类定义
昨天介绍了我的web插件化构想.在实现中为了底层能和用户编写的代码进行方便的交互.我把面向对象里的类融合进来了.
最初,面向开发者的编程,打算直接使用js.后来发现底层不能很方便的与开发者写的代码进行交互.
孩子们的诗 思考2天后,我使用xml描述类结构.底层通过类的描述生成动态的js对象.这样就可以很方便的与底层C#交互了.
最后我把这种编程方式命名为 "jrxml"
<jrxml:class xmlns:jrxml="tmp">
价格管控 <jrxml:method access="private" name="loadTpl" modifier="readonly"/>
<jrxml:method access="internal" name="render" modifier="fixed">
//<![CDATA[
return '<div id="root">render</div>';
//]]>
</jrxml:method>
<jrxml:method access="internal" name="domReady" params="htmlDoc" modifier="fixed">
//<![CDATA[
ElementById('root').innerHTML='domReady<br/>--------------<br/>---------- by jaws';
Create.fire();
//]]>
</jrxml:method>
<jrxml:method access="internal" name="ctor" modifier="fixed">
this.width=100;
</jrxml:method>
<jrxml:method name="update" modifier="readonly"/>
<jrxml:event name="onCreate"/>
<jrxml:prop name="width"/>
<jrxml:prop name="config">
<jrxml:tter>
return value+100;
</jrxml:tter>
<jrxml:getter>
return value;
太级 </jrxml:getter>
</jrxml:prop>
</jrxml:class>
上面是一个完整的类结构
期待明天xml元素:
<class 根节点
<method 方法定义
<prop 属性定义 属性可以在method节点里,,可以t和get
<event 事件 事件可以在method节点力,subscribe(function(){});进行订阅,和调用fire();
xml节点属性:
name="" 类成员名
access="public|private|internal" 访问控制, 公共|私有|内部
modifier="none|fixed|readonly" 修饰符, 无|固定|只读
因为本身只是简单的类结构模拟,所以没有考虑结构,抽象类,继承. 所以加入fixed和readonly特性,对于标示2个特性的成员,开发者不可对此成员进行修改.
上面是对类结构的描述,接下来需要有一个编译过程.
在C#代码中要初始化一个类的顺序为:
验证类结构兼怀子由->js运行时->编译->创建js object
验证类结构:
其实就是验证xml,对于class的xml结构定义了一个xsd,验证的话直接C#用xsd验证xml结构即可.
下面是class_schema.xsd
View Code
春来<xs:schema xmlns:xs="www.w3/2001/XMLSchema" xmlns:xs2="tmp" targetNamespace="tmp">
<xs:attributeGroup name="attr_typeb">
凑巧拼音 <xs:attribute name="access" default="public">
<xs:simpleType>
<xs:restriction ba="xs:string">
<xs:enumeration value="public"/>
<xs:enumeration value="private"/>
<xs:enumeration value="internal"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="modifier" default="none">
<xs:simpleType>
<xs:restriction ba="xs:string">
<xs:enumeration value="none"/>
<xs:enumeration value="fixed"/>
<xs:enumeration value="readonly"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:attributeGroup>
<xs:attributeGroup name="attr_name">
<xs:attribute name="name" u="required">
<xs:simpleType>
<xs:restriction ba="xs:string">
<xs:pattern value="[a-zA-Z_][a-zA-Z0-9_]{0,49}" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:attributeGroup>
<xs:complexType name="tget">
<xs:simpleContent>
<xs:extension ba="xs:string">
<xs:attributeGroup ref="xs2:attr_typeb"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="class">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="prop" minOccurs="0" maxOccurs="unbounded">企业档案工作规范
<xs:complexType>
<xs:all>
<xs:element name="tter" type="xs2:tget" minOccurs="0" maxOccurs="1"/>
<xs:element name="getter" type="xs2:tget" minOccurs="0" maxOccur
s="1"/>
</xs:all>
<xs:attributeGroup ref="xs2:attr_name"/>
<xs:attributeGroup ref="xs2:attr_typeb"/>
</xs:complexType>
</xs:element>
<xs:element name="event" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attributeGroup ref="xs2:attr_name"/>
<xs:attributeGroup ref="xs2:attr_typeb"/>
</xs:complexType>
</xs:element>
<xs:element name="method" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension ba="xs:string">
<xs:attributeGroup ref="xs2:attr_name"/>
<xs:attribute name="params">
<xs:simpleType>
<xs:restriction ba="xs:string">
<xs:pattern value="([a-zA-Z_][a-zA-Z0-9_]{0,45}|[a-zA-Z_][a-zA-Z0-9_]{0,45}, )+[^, ]"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attributeGroup ref="xs2:attr_typeb"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>