精华内容
下载资源
问答
  • 得益于Android Studio强大的拓展功能,我们可以开发出适于自己项目的插件以满足快速高效的开发需求,本文以MVP模板插件为例。

    ****版权说明 : 《玩转Android Studio自定义模板插件-MVP模板为例》于当前CSDN博客乘月网属同一原创,转载请说明出处,谢谢。

    得益于Android Studio强大的拓展功能,我们可以开发出适于自己项目的插件以满足快速高效的开发需求,本文以MVP模板插件为例

    玩转Android Studio自定义模板插件-MVP模板为例_乘月网_专注于移动互联网_android开发_html开发_java开发_linux运维_php开发_web开发

    演示图

    在日常开发中,新建一个如名为ZModuleActivity的Activity:

    玩转Android Studio自定义模板插件-MVP模板为例_乘月网_专注于移动互联网_android开发_html开发_java开发_linux运维_php开发_web开发

    Empty Activity(插件)的视图面板

    新建后Android Studio(下文简称:AS)会依据我们编辑和勾选的一些要求生成具有一定代码的.java和.xml的Activity和Layout文件,以及会帮我们在AndroidManifest.xml注册好这个新建的Activity。

    大体这样:

    创建ZModuleActivity
    生成ZModuleActivity.java
    生成activity_zmodule.xml
    AndroidManifest.xml追加Activity注册

    像这样 -->

    玩转Android Studio自定义模板插件-MVP模板为例_乘月网_专注于移动互联网_android开发_html开发_java开发_linux运维_php开发_web开发

    一定程度上为我们省下了很多创建文件,写一些基础代码的时间,但是这远远没有达到我们想要的效果。一个成熟的项目开发会有着自己的一套代码架构,层次和模板,这就意味着每次新建Activity都要修改些代码以沿用项目框架。

    如MVP设计模式代码结构可能如下,以YModuleActivity为例:

    MVP
    YModuleActivity
    IYModule
    YModulePresenter

    代码可能像这样 -->

    玩转Android Studio自定义模板插件-MVP模板为例_乘月网_专注于移动互联网_android开发_html开发_java开发_linux运维_php开发_web开发

    玩转Android Studio自定义模板插件-MVP模板为例_乘月网_专注于移动互联网_android开发_html开发_java开发_linux运维_php开发_web开发

    玩转Android Studio自定义模板插件-MVP模板为例_乘月网_专注于移动互联网_android开发_html开发_java开发_linux运维_php开发_web开发

    AndroidManifest就不贴了,不是本文重点。

    每新建一个Activity都要做大量无意义的基础代码工作,不知道你有没有这样的感觉:好烦啊,总是重复这些工作有意思吗?能不能直接帮我们生成好啊?有的人在感叹之余默默地把之前已经做好的(如本文 的YModule系列代码:YModuleActivity,IYModule,YModulePresenter)相关文件给copy过来改文件名,改类名,改代码,改注释,删冗余代码,最后变成类似YModule系列文件和代码这样。嗯,的确有省了不少事,但毕竟还是一连串的事儿。

    既然有了困扰,就成了需求,既然是需求,就得满足需求。好在AS允许我们开发这样的代码模板插件,那么正式进入今天的主题。

    打开AS安装目录(本文为“android-studio”),依次打开:android-studio》plugins》android》lib》templates》activities 结果如下:

    玩转Android Studio自定义模板插件-MVP模板为例_乘月网_专注于移动互联网_android开发_html开发_java开发_linux运维_php开发_web开发

    看到目录名是否觉得眼熟?如果你还反应过来,没关系,看下图:

    玩转Android Studio自定义模板插件-MVP模板为例_乘月网_专注于移动互联网_android开发_html开发_java开发_linux运维_php开发_web开发

    玩转Android Studio自定义模板插件-MVP模板为例_乘月网_专注于移动互联网_android开发_html开发_java开发_linux运维_php开发_web开发

    选择插件模板

    没错,这里就是传说中新建Activity的模板插件集中营,每个目录即为一个插件。

    知道这些就好办了,对EmptyActivity这个目录进行令人窒息的Ctrl C and Ctrl V操作, 然后对这个副本重命名(本文为“MVPActivity”)。你可能会问为什么一定是EmptyActivity?我可没有强调,只是顾名思义,空荡荡的模板可以省去删除一些冗余的模板代码操作,是吧?

    打开MVPActivity目录,你可看到如下文件结构:

    MVPActivity
    root
    template.xml
    globals.xml.ftl
    recipe.xml.ftl
    template_blank_activity.png

    下面先简单介绍这几个文件,然后开始写模板

    1. root目录

    用于存放源代码模板和资源模板的.ftl文件,我们可以一路展开到最后一个目录,可以看到文件SimpleActivity.java.ftl(如果AS版本较高的话还有SimpleActivity.kt.ftl,顾名思义,分别是java版和kotlin版的模板,本文仅专注java)。查看文件:

    package ${packageName};
    
    import ${superClassFqcn};
    import android.os.Bundle;
    <#if includeCppSupport!false>
    import android.widget.TextView;
    </#if>
    
    public class ${activityClass} extends ${superClass} {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    <#if generateLayout>
            setContentView(R.layout.${layoutName});
    </#if>
    <#include "../../../../common/jni_code_usage.java.ftl">
        }
    <#include "../../../../common/jni_code_snippet.java.ftl">
    }
    

    很明显是Activity的模板嘛,一看便懂,确认过眼神。

    • ${xxx}为引用值,由前台面板(如上文新建Activity的插件视图面板)填写或勾选的结果值赋值,xxx可能为变量,也可能为函数返回值。
    • <#if xxx!bool值>yyy</#if>为if判断语句,与常见语言判断语法规则并无区别,只是写法的区别。
    • <#include "xxx">导入某某文件的内容。类似于Android布局中的标签用法。

    这里稍微提一下:EmptyActivityroot目录下只有源代码模板目录src,因为模板比较简单,其直接引用了EmptyActivity同级目录commonroot目录下资源模板目录res,下文会有提及,本文只讲源代码模板,不做深究。

    2. template.xml

    定义插件视图面板的外观,布局,类似咱Android的layout.xml布局文件,查看文件:

    <?xml version="1.0"?>
    <template
        format="5"
        revision="5"
        name="Empty Activity"
        minApi="9"
        minBuildApi="14"
        description="Creates a new empty activity">
    
        <category value="Activity" />
        <formfactor value="Mobile" />
    
        <parameter
            id="instantAppActivityHost"
            name="Instant App URL Host"
            type="string"
            suggest="${companyDomain}"
            default="instantapp.example.com"
            visibility="isInstantApp!false"
            help="The domain to use in the Instant App route for this activity"/>
    
        <parameter
            id="instantAppActivityRouteType"
            name="Instant App URL Route Type"
            type="enum"
            default="pathPattern"
            visibility="isInstantApp!false"
            help="The type of route to use in the Instant App route for this activity" >
            <option id="path">Path</option>
            <option id="pathPrefix">Path Prefix</option>
            <option id="pathPattern">Path Pattern</option>
        </parameter>
    
        <parameter
            id="instantAppActivityRoute"
            name="Instant App URL Route"
            type="string"
            default="/.*"
            visibility="isInstantApp!false"
            help="The route to use in the Instant App route for this activity"/>
    
        <parameter
            id="activityClass"
            name="Activity Name"
            type="string"
            constraints="class|unique|nonempty"
            suggest="${layoutToActivity(layoutName)}"
            default="MainActivity"
            help="The name of the activity class to create" />
    
        <parameter
            id="generateLayout"
            name="Generate Layout File"
            type="boolean"
            default="true"
            help="If true, a layout file will be generated" />
    
        <parameter
            id="layoutName"
            name="Layout Name"
            type="string"
            constraints="layout|unique|nonempty"
            suggest="${activityToLayout(activityClass)}"
            default="activity_main"
            visibility="generateLayout"
            help="The name of the layout to create for the activity" />
    
        <parameter
            id="isLauncher"
            name="Launcher Activity"
            type="boolean"
            default="false"
            help="If true, this activity will have a CATEGORY_LAUNCHER intent filter, making it visible in the launcher" />
    
        <parameter
            id="backwardsCompatibility"
            name="Backwards Compatibility (AppCompat)"
            type="boolean"
            default="true"
            help="If false, this activity base class will be Activity instead of AppCompatActivity" />
        
        <parameter
            id="packageName"
            name="Package name"
            type="string"
            constraints="package"
            default="com.mycompany.myapp" />
    
        <!-- 128x128 thumbnails relative to template.xml -->
        <thumbs>
            <!-- default thumbnail is required -->
            <thumb>template_blank_activity.png</thumb>
        </thumbs>
    
        <globals file="globals.xml.ftl" />
        <execute file="recipe.xml.ftl" />
    
    </template>
    
    

    对照着上文的【Empty Activity(插件)的视图面板】示意图或者自己新建个Empty Activity呼出面板,差不多能看懂或猜测到一大半吧?

    下面是对parameter模块补充介绍:

    • parameter标签:表示一个参数模块,为变量的赋值而服务的视图块
    • id:变量名,上文提到引用值${xxx}中的变量
    • type:变量的数据类型,同java数据类型差不多,这里常见的是string和boolean类型,boolean型模板面板以勾选框的形式显示
    • constraints:约束,主要有class(输入框填写需要创建的java类名),layout(输入框填写需要创建的布局名),package(输入框+下拉框填写或选择包名),unique(填写内容不能与已有的java完整类名重名,或布局名重名,重复会自动在后面加个2,3…以此类推,nonempty(不能为空,输入框不能不填内容)
    • default:默认值,默认值会根据type类型自动填充到输入框或决定勾选框勾选状态
    • suggest:建议值,会覆盖默认值,配合变量或函数动态修改输入框内容或勾选框勾选状态
    • thumb标签:插件模板效果缩略图
    • global标签:引用全局变量文件
    • execute标签:执行模板代码配置文件,这里是个文件引用

    3. globals.xml.ftl

    声明一些全局变量的文件。查看文件:

    <?xml version="1.0"?>
    <globals>
        <global id="hasNoActionBar" type="boolean" value="false" />
        <global id="parentActivityClass" value="" />
        <global id="simpleLayoutName" value="${layoutName}" />
        <global id="excludeMenu" type="boolean" value="true" />
        <global id="generateActivityTitle" type="boolean" value="false" />
        <#include "../common/common_globals.xml.ftl" />
    </globals>
    

    可以看到其同template.xml内的parameter类似,内部有标签,分别定义id,type和默认值。

    4. recipe.xml.ftl

    用于执行模板代码的配置文件。查看文件:

    <?xml version="1.0"?>
    <#import "root://activities/common/kotlin_macros.ftl" as kt>
    <recipe>
        <#include "../common/recipe_manifest.xml.ftl" />
        <@kt.addAllKotlinDependencies />
    
    <#if generateLayout>
        <#include "../common/recipe_simple.xml.ftl" />
        <open file="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
    </#if>
    
        <instantiate from="root/src/app_package/SimpleActivity.${ktOrJavaExt}.ftl"
                       to="${escapeXmlAttribute(srcOut)}/${activityClass}.${ktOrJavaExt}" />
        <open file="${escapeXmlAttribute(srcOut)}/${activityClass}.${ktOrJavaExt}" />
    
    </recipe>
    

    简单介绍下:

    • <#include/>标签,引入某文件内容
    • 打开文件标签,这个要看执行时机,如果文件还没生成,则可能会报错,所以该标签会放在生成目标文件代码后。
    • 标签,实例化,即执行模板代码。
    • from,执行指定某目录下的模板代码文件,上文提到模板文件是在root目录下
    • to,执行后的结果内容输出文件,像这样的${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml由函数,变量拼接文件名(包扩路径)的表达式,我们不需要了解它是怎么实现的,但根据你的开发经验一定能看得懂它会生成什么样的文件名(包括路径),我好像说了一句废话 T^T

    5. template_blank_activity.png

    没什么好介绍的,模板效果缩略图文件,上文提到用thumb标签使其显示于面板上。

    说好的简单介绍,结果还是BB了那么多

    玩转Android Studio自定义模板插件-MVP模板为例_乘月网_专注于移动互联网_android开发_html开发_java开发_linux运维_php开发_web开发

    下面开始折腾“MVPActivity”插件

    分析

    上文已经给出代码示意图,我们需要自动生成YModuleActivity,IYModule和YModulePresenter三个java类,那么:

    1. 需要各自三个类的源码模板

    比如模板名分别为:MVPActivity.java.ftl,MVPInterface.java.ftl和MVPPresenter.java.ftl,由上文可知,文件于root->src->app_package目录下。

    2. 需要各自三个类的类名变量和一个公共拼接变量

    对于这样的代码:

    public class YModuleActivity extends BaseActivity<IYModule.Presenter> implements IYModule.View {
    
        @Override
        public void setPresenter(IYModule.Presenter presenter) {
            // Bind presenter
            if (presenter == null) {
                presenter = new YModulePresenter(this);
            }
        }
    }
    

    需要转换成动态化模板成这样:

    public class ${activityClass} extends BaseActivity<${mvpInterface}.Presenter> implements ${mvpInterface}.View {
    
        @Override
        public void setPresenter(${mvpInterface}.Presenter presenter) {
            // Bind presenter
            if (presenter == null) {
                presenter = new ${presenterClass}(this);
            }
        }
    }
    

    对,是这三个变量:activityClass,mvpInterface,presenterClass,上文查看template.xml文件中,已经看到“activityClass”已定义过,只要再添加另两个就好了。

    心细的同学可能注意到YModuleActivity,IYModule和YModulePresenter都有个YModule,可以提取变量为commonClassName。

    3. 需要一个时间变量(可选)

    对于类的注释,比如这样:

    /**
     * <pre>
     *     @author : www.icheny.cn
     *     @e-mail : ausboyue@gmail.com
     *     @time   : 2018.08.25
     *     @desc   : ${commonClassName} Activity.
     *     @version: 1.0.1
     * </pre>
     */
    

    注释很多都可以共用或稍加修改便可,但是创建的时间(time)是动态的,那么需要变量:createTime来替换。

    制作

    1. 三个类的源码模板

    MVPActivity.java.ftl

    package ${packageName};
    
    <#if generateLayout>
    import cn.icheny.plugin.mvp.demo.R;
    </#if>
    import cn.icheny.plugin.mvp.demo.module.base.BaseActivity;
    
    /**
     * <pre>
     *     @author : www.icheny.cn
     *     @e-mail : ausboyue@gmail.com
     *     @time   : ${createTime}
     *     @desc   : ${commonClassName} Activity.
     *     @version: 1.0.1
     * </pre>
     */
    public class ${activityClass} extends BaseActivity<${mvpInterface}.Presenter> implements ${mvpInterface}.View {
    
        @Override
        protected void initData() {
    
        }
    
        @Override
        protected void initViews() {
    
        }
    
        @Override
        protected int layoutId() {
            return R.layout.${layoutName};
        }
    
        @Override
        public void showData() {
    
        }
    
        @Override
        public void setPresenter(${mvpInterface}.Presenter presenter) {
            // Bind presenter
            if (presenter == null) {
                presenter = new ${presenterClass}(this);
            }
        }
    }
    
    

    MVPInterface.java.ftl

    package ${packageName};
    
    import cn.icheny.plugin.mvp.demo.module.base.IBasePresenter;
    import cn.icheny.plugin.mvp.demo.module.base.IBaseView;
    
    /**
     * <pre>
     *     @author : www.icheny.cn
     *     @e-mail : ausboyue@gmail.com
     *     @time   : ${createTime}
     *     @desc   :  MVP --> ${commonClassName} VP --> View,Presenter. Child View And Child Presenter Interface For This Module.
     *     @version: 1.0.1
     * </pre>
     */
    public interface ${mvpInterface} {
    
        interface View extends IBaseView<Presenter> {
            /**
             * show data
             */
            void showData();
    
        }
    
        interface Presenter extends IBasePresenter {
            /**
             * load data
             */
            void loadData();
        }
    }
    
    

    MVPPresenter.java.ftl

    package ${packageName};
    
    /**
     * <pre>
     *     @author : www.icheny.cn
     *     @e-mail : ausboyue@gmail.com
     *     @time   : ${createTime}
     *     @desc   :  MVP --> ${commonClassName} P --> Presenter. Child Presenter Implements Class For This Module.
     *     @version: 1.0.1
     * </pre>
     */
    public class ${presenterClass} implements ${mvpInterface}.Presenter {
    
        private final ${mvpInterface}.View view;
    
        /**
         * Constructor
         *
         * @param view
         */
        public ${presenterClass}(${mvpInterface}.View view) {
            this.view = view;
        }
    
        @Override
        public void loadData() {
    
        }
    
        @Override
        public void doRefresh() {
    
        }
    }
    

    2. 定义UI面板,template.xml

    ......
        <parameter
            id="createTime"
            name="Create Time"
            type="string"
            default="2018.08.25"
            help="The time that will show on class annotation." />
            
        <parameter
            id="commonClassName"
            name="Common Class Name"
            type="string"
            default="Main"
            help="The string ,Other class will use for their name." />	
    		
        <parameter
            id="activityClass"
            name="Activity Name"
            type="string"
            constraints="class|unique|nonempty"
            suggest="${commonClassName}Activity"
            default="MainActivity"
            help="The name of the activity class to create" />
    
        <parameter
            id="mvpInterface"
            name="MVP Interface Name"
            type="string"
            constraints="class|unique|nonempty"
            suggest="I${commonClassName}"
            default="IMain"
            help="The name of the mvp interface to create" />	
    
        <parameter
            id="presenterClass"
            name="Presenter Name"
            type="string"
            constraints="class|unique|nonempty"
            suggest="${commonClassName}Presenter"
            default="MainPresenter"
            help="The name of the mvp presenter class to create" />	
    </template>
    .......
    

    限于文章篇幅,这里只贴添加和修改的代码。

    3. 定义执行模板代码配置文件,recipe.xml.ftl

    ......
    	<instantiate from="root/src/app_package/MVPActivity.java.ftl"
                       to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
    				   
    	<open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
    	
    	<instantiate from="root/src/app_package/MVPInterface.java.ftl"
                       to="${escapeXmlAttribute(srcOut)}/${mvpInterface}.java" />
    				   
    	<instantiate from="root/src/app_package/MVPPresenter.java.ftl"
                       to="${escapeXmlAttribute(srcOut)}/${presenterClass}.java" />
    ......
    

    同样,这里只贴添加和修改的代码。

    完成以上,重启AS,就可以愉快地玩耍了。

    至此,本文结束。Demo源码后续文章更新发布,敬请关注。

    2018年09月3日更新:Demo源码:Github:AndroidStudioPluginForMVP

    展开全文
  • vim模板插件vim-template的使用

    千次阅读 2016-07-21 15:46:19
    vim模板插件vim-template的使用之前使用IDE编程,模板是最基本的功能,现在切换到vim,用惯了模板的我,对于每次写代码都来上# -*- coding: utf-8 -*- # # 日期 作者 # # License这么一段,感觉有点恐怖,Google了...

    vim模板插件vim-template的使用

    之前使用IDE编程,模板是最基本的功能,现在切换到vim,用惯了模板的我,对于每次写代码都来上

    # -*- coding: utf-8 -*-
    #
    # 日期 作者
    #
    # License

    这么一段,感觉有点恐怖,Google了一下,vim竟然可以实现比IDE更强大的功能,真是不得不佩服vim的强大!

    安装

    由于不同人的vim配置不一样,安装方法也不尽相同,请参考官方的安装方法来安装。
    对于使用spf13-vim的同学,在主目录下的.vimrc.bundles.local添加一行:

    Bundle 'git@github.com:aperezdc/vim-template.git'
    
    # 不知道"Bundle 'vim-template'"为什么老要我输入用户名密码,
    # 输入之后也安装不成功,知道的同学可以留言告知我。

    然后在shell里面运行:

    vim +BundleInstall

    或者打开vim,运行:

    :BundleInstall

    都行。

    基本使用

    如果你对自带的模板没有很多意见,你甚至什么都不用配置,你用vim打开一个新的python脚本,vim-template会自动检测
    文件后缀,然后自己根据模板填充文件,一切都那么理所当然。你甚至可以打开没有后缀的文件,然后运行:Template <pattern>(比如:Template *.py)在文件
    开头插入模板,:TemplateHere <pattern>(比如: TemplateHere *.py)在光标所在的位置插入模板。

    配置

    安装好vim-template之后,可以根据自己的需要来配置:

    1. 自定义模板变量

    vim-template可以自定义模板变量, 在主目录的.vimrc(如果你使用spf13-vim的话就修改.vimrc.local)中添加:

    let g:templates_user_variables = [['EMAIL', 'GetEmail'],]
    
    function GetEamil()
        return 'pylego@hotmail.com'
    endfunction

    注意:上面都是VimScript的语法,有兴趣的可以学习下。

    这样你就可以在模板里面写%EMAIL%,然后模板引擎会自动调用GetEmail函数,将返回值代替之。

    2. 自定义模板

    有时候你想根据自己的需要定义模板,在vim-template里面是很容易实现的

    1. 修改g:templates_directory到你自定义模板所在的文件夹

    # 在.vimrc(如果你使用spf13-vim的话就是.vimrc.local)
    let g:templates_directory = '/home/pylego/.vim/templates'

    2. 在/home/pylego/.vim/templates中创建模板文件

    文件的命名模式是”=template=<pattern>”, 比如我想让每个以py结尾的文件都以这个模板开始就可以这样:

    创建一个名为”=template=.py”的文件,向文件里面写入模板。

    注意这个”=template=”前缀是可以改动的,具体不在本文讨论范围内。

    我的配置

    spf13-vim

    .vimrc.local

    " settings for vim-template bundle
    let g:templates_directory = ['/home/pylego/.vim/templates',]
    let g:templates_user_variables = [['EMAIL', 'GetMail'], ['FULLPATH', 'GetFullPath']]
    
    function GetMail()
        return 'pylego@hotmail.com'
    endfunction
    
    function GetFullPath()
        return expand('%:p')
    endfunction
    " vim-template settings end

    /home/pylego/.vim/templates/=template=.py

    # -*- coding: utf-8 -*-
    #
    # Copyright © PyleGo.
    #
    # %DATE% %TIME% <%EMAIL%>
    #
    # Distributed under terms of the %LICENSE% license.
    展开全文
  • 一、安装模板插件通过Ctrl+shift+p调出packagecontrol,然后输入install回车,输入sublimeTmpl找到这个插件然后回车 安装完成后就可以使用html/js/css/php/python/ruby的模版了。也可以使用快捷键打开模版Sublime...

    一、安装模板插件

    通过Ctrl+shift+p调出packagecontrol,然后输入install回车,输入sublimeTmpl找到这个插件然后回车
    这里写图片描述

    安装完成后就可以使用html/js/css/php/python/ruby的模版了。

    这里写图片描述

    也可以使用快捷键打开模版

    SublimeTmpl默认的快捷键
    
    ctrl+alt+h html
    ctrl+alt+j javascript
    ctrl+alt+c css
    ctrl+alt+p php
    ctrl+alt+r ruby
    ctrl+alt+shift+p python

    二、制作vue模版


    在C:\Users\LXY\AppData\Roaming\Sublime Text 3\Packages\SublimeTmpl\templates下新建vue.tmpl文件,文件内容为

    <template>
    
    </template>
    
    <script type="ecmascript-6">
    
    </script>
    
    <style rel="stylesheet">
    
    </style>
    

    在sublime的菜单栏打开 Preferences,打开Package Settings,再打开SublimeTmpl,再打开Settings-Commands,在里面粘贴以下配置
    这里写图片描述

    ,{
        "caption": "Tmpl: Create vue", "command": "sublime_tmpl",
        "args": {"type": "vue"}
    }

    再在刚刚的位置找到 Key Bindings-Default设置热键
    这里写图片描述

     ,{
            "keys": ["ctrl+alt+e"], "command": "sublime_tmpl",
            "args": {"type": "vue"}, "context": [{"key": "sublime_tmpl.vue"}]
      }

    现在你就可以用 Ctrl+Alt+e 就可以建立新的vue模板了

    展开全文
  • 今天在配置spingboot的web项目的使用 用的spring-boot-starter-thymeleaf模板插件但是在配置了相应的spring.thymeleaf.prefix=classpath:/templates 后仍然页面出不来找了半天原因 是这个模板对 html页面的解析 非常...
    今天在配置spingboot的web项目的使用 用的
    spring-boot-starter-thymeleaf模板插件

    但是在配置了相应的

    spring.thymeleaf.prefix=classpath:/templates 后仍然页面出不来
    找了半天原因 是这个模板对 html页面的解析 非常严格, 标签没有 结束报错,不能用特殊字符& 要用也要转义
    展开全文
  • Unity3D 脚本模板插件

    千次阅读 2017-04-10 01:55:17
    Unity3D 脚本模板快速编辑,保存。脚本文件添加头注释,自动标注创建日期以及版权时间。
  • smarty3注册模板插件

    千次阅读 2014-02-15 15:45:13
    在使用smarty模板的时候,经常会看到html_options,html_checkboxes等自定义函数,但是这些函数的显示形式,可能并不满足实际开发的需要,或者...smarty注册模板函数插件有两种方式: 一种是通过register手动注册,另种
  • sublime Text 3安装模板插件

    千次阅读 2016-05-05 00:48:29
    Sublime Text3中可以使用SublimeTmpl插件来新建html、css、javascript、php、python、ruby六种类型的文件模板,所有的文件模板都在插件目录的templates文件夹里,可以自定义编辑文件模板。  如果想要新建其他类型...
  • 一、 thymeleaf插件下载地址: 1、官网下载: https://github.com/thymeleaf/thymeleaf-extras-eclipse-plugin/releases   2、附件下载: thymeleaf-extras-eclipse-plugin-2.1.2.zip   二、 thymeleaf...
  • template.js插件--好用的模板插件

    千次阅读 2015-08-01 15:44:33
    template.js是一款JavaScript模板引擎,简单好用,而且只有5K左右哦! 最近刚好做一个工程用到了,就来总结下。 原理:提前将Html代码放进一个中,当需要用到时,在js里这样调用:var htmlstr=template("test",放...
  • 现在市面上有很多款前端网页编辑器,百度ueditor凭借着国有化的,...2.easytemplate模板引擎 3.pagination前端js分页插件 4.ueditor插件对话框二次开发的基本方法 开发目标: 开发可供多个项目甚至是其它的项目使用的
  • Sublime Text3安装模板插件SublimeTmpl

    千次阅读 2018-07-01 03:10:05
    1.打开 Preferences&gt;Package Control 2.选择Install Package 3.在搜索框输入sublimeTmpl,在列表中点击安装(因我本机已安装,所以搜索列表没有显示) ...4.重启sublime text3即可生效...
  • jquery模板插件jTemplates代替拼html

    千次阅读 2013-01-07 23:30:56
    jQuery的jTemplates插件允许定义一个显示模板,在展现数据时根据选择的模板来动态生成。 jQuery的jTemplates官方网站:http://jtemplates.tpython.com/ 原先的拼html代码如下: $("#Content").html(""); $.get...
  • 推荐好用的Jquery模板插件Jtemplate

    万次阅读 2011-08-09 22:51:39
    jtemplate是javascript的模板引擎。官方网址:http://jtemplates.tpython.com/ 数据准备: var data ={ TotalCount:64, Lists:[ {Id:'2001' ,Title:'新闻11',Crea
  • 发现了一个比较全的UCHome1.5模板插件、技巧、有奖活动总贴 支持:http://www.discuz.net/viewthread.php?tid=1406394
  • 织梦2015年6月8日更新后,就添加了很多针对手机移动端的设计,最大的设计就是添加了生成二维码的织梦标签和织梦手机模板功能,织梦更新后,默认的 default模板中就包含手机模板,所以我们可以给织梦网站设计双模板,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 187,466
精华内容 74,986
关键字:

模板插件