fish模块化

0x00 模块化开发

    首先需要引入模块化js用来处理模块化的加载开发

    <script type="text/javascript" src="frm/fish-desktop/js/fish-desktop-require.js" data-main="main.js?v=1.0.0"></script>

然后需要进行主视图IndexView.js的渲染,之后就可以定义模块了

define(['./person'], function (person) {
  return {
    echo: function () {
      console.log(person.getName());
    }
});

定义需要依赖的模块

define(['./person'], function (person) {
  return {
    echo: function () {
      console.log(person.getName());
    }
});

使用require引入模块

require(['./a, ./b'], function (a, b) {
  // do something
});

by the way,define定义的模块主要用来声明国际化文件,接口层的方法以及一些第三方脚手架或者模版插件。

0x01 模板语法

    fish模板语法基于Handlebars,这里使用视图组件进行演示

    首先是变量赋值,变量赋值使用{{}}

fish.View.configure({ manage: true, syncRender: true });
// 定义一个模板
var template = '<div class="entry">\n' +
    '  <h1>{{title}}</h1>\n' +
    '  <div class="body">\n' +
    '    {{body}}\n' +
    '  </div>\n' +
    '</div>\n';
// 定义一个父视图
var ParentView = fish.View.extend({
    el: '#app',
    template: fish.compile(template),
    serialize: {
        title: 'i am parent',
        body: 'this is a body'// 这里如果带上html标签不需要转义
    }
});
// 父视图渲染
var parentView = new ParentView().render();

    然后是段落赋值

fish.View.configure({ manage: true, syncRender: true });
// 定义一个模板
//等效于  Shown.
// {{#if person}}
//   Never shown!
// {{/if}}
var template = 'Shown.\n' +
    '{{#person}}\n' +
    '  Never shown!\n' +
    '{{/person}}\n'
// 定义一个父视图
var ParentView = fish.View.extend({
    el: '#app',
    template: fish.compile(template),
    serialize: {
        person: false
    }
});
// 父视图渲染
var parentView = new ParentView().render();

然后是函数赋值

fish.View.configure({ manage: true, syncRender: true });
// 定义一个模板
//
var template = '{{#data}}{{../fn this}}{{/data}}\n' // 参数就是跟在/fn后面的值
// 定义一个父视图
var ParentView = fish.View.extend({
    el: '#app',
    template: fish.compile(template),
    serialize: {
        fn: function(name) {
            return new Handlebars.SafeString('<p>' + name + '</p>'); // 这里使用这个返回Handlebars便不会转义参数
        },
        data: ['huang', 'xing', 'hui']
    }
});
// 父视图渲染
var parentView = new ParentView().render();

属性路径赋值

fish.View.configure({ manage: true, syncRender: true });
// 定义一个模板
//
var template = '<div class="entry">\n' +
    '  <h1>{{title}}</h1>\n' +
    '  <h2>By {{author.name}}</h2>\n' +
    '</div>\n' +
    '<h1>Comments</h1>\n' +
    '\n' +
    '<div id="comments">\n' +
    '  {{#each comments}}\n' +
    '  <h2><a href="/posts/{{../permalink}}#{{id}}">{{title}}</a></h2>\n' +
    '  {{/each}}\n' +
    '</div>' 

// 定义一个父视图
var ParentView = fish.View.extend({
    el: '#app',
    template: fish.compile(template),
    serialize: {
        title: 'Person',
        author: {
            name: 'Lilei'
        },
        permalink: 'http://fish.iwhalecloud.com',
        comments: [
            { id: 1, title: 'fish-desktop' },
            { id: 2, title: 'fish-mobile' },
            { id: 3, title: 'fish-designer' },
            { id: 4, title: 'fish-topo' },
            { id: 5, title: 'fish-cli' }
        ]
    }
});
// 父视图渲染
var parentView = new ParentView().render();

用../可以返回上层获取属性

each循环

fish.View.configure({ manage: true, syncRender: true });
// 定义一个模板
//
var template = '{{#each array}}\n' +
    '  {{@index}}: {{this}}\n' + // @index访问数组索引
    '{{else}}' +
    'nothing' + // 使用else可以处理异常情况
    '{{/each}}\n' +
    '\n' +
    '{{#each object}}\n' +
    '  {{@key}}: {{this}}\n' + // @key访问对象属性
    '{{/each}}\n'

// 定义一个父视图
var ParentView = fish.View.extend({
    el: '#app',
    template: fish.compile(template),
    serialize: {
        object: {
            git: 'git repository url',
            api: 'api url'
        },
        //array: ['fish-desktop', 'fish-mobile', 'fish-designer', 'fish-topo', 'fish-cli']
    }
});
// 父视图渲染
var parentView = new ParentView().render();

递归recursive

fish.View.configure({ manage: true, syncRender: true });
// 定义一个模板
//
var template = '<ul>\n' +
    '  {{#recursive items}}\n' +
    '    <li>{{name}}\n' +
    '      {{#if items}}\n' +
    '        <ul>\n' +
    '          {{{recursive items}}}\n' +
    '        </ul>\n' +
    '      {{/if}}\n' +
    '    </li>\n' +
    '  {{/recursive}}\n' +
    '</ul>\n'

// 定义一个父视图
var ParentView = fish.View.extend({
    el: '#app',
    template: fish.compile(template),
    serialize: {
            items : [
                { name: "foo1" },
                { name: "foo2" },
                { name: "foo3", items: [
                        { name: "foo4" },
                        { name: "foo5" },
                        { name: "foo6", items: [
                                { name: "foo7" }
                            ]}
                    ]},
                { name: "foo8" }
            ]
    }
});
// 父视图渲染
var parentView = new ParentView().render();

条件判断ifcond

fish.View.configure({ manage: true, syncRender: true });
// 定义一个模板
//
var template = '<div class="entry">' +
    "{{#ifCond type '===' 'Y'}}" +
    "<h1>YES</h1>" +
    "{{else}}" +
    "{{#ifCond type '===' 'N'}}" +
    "<h1>NO</h1>" +
    "{{else}}" +
    "<h1>UNKNOWN TYPE</h1>" +
    "{{/ifCond}}" +
    "{{/ifCond}}" +
    "</div>"
        // 定义一个父视图
var ParentView = fish.View.extend({
    el: '#app',
    template: fish.compile(template),
    serialize: {
           type: 'Y'
    }
});
// 父视图渲染
var parentView = new ParentView().render();

注册助手Helpers----动态设置的id一般不会在{{}}中设置太复杂的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。以下是代码示例: ```python import argparse import re import csv import os import matplotlib.pyplot as plt import numpy as np # 定义命令行参数 parser = argparse.ArgumentParser(description='处理Log文件并生成曲线图') parser.add_argument('log_file', type=str, help='待处理的Log文件') parser.add_argument('-o', '--output', type=str, default='output.csv', help='CSV输出文件名') args = parser.parse_args() # 定义正则表达式 regex1 = r'(\w+)\s+(\d+)\s+(\d+:\d+:\d+)\s+(\d{4})' regex2 = r'(\d+/\d+/\d+)\s+(\d+:\d+:\d+)\s+(.+)$' # 定义标题行分类规则 titles = { 'ABC': ['ABC'], 'DFG': ['DFG'], 'TBC': ['TBC'], 'DHHG': ['DHHG'], 'lop': ['lop'], 'kki': ['kki'], 'CAT': ['CAT'], 'DOG': ['DOG'], 'Fish': ['Fish'], 'food': ['food'] } # 读取Log文件 with open(args.log_file, 'r') as f: lines = f.readlines() # 找到"My name is kitty"所在行 start_line = 0 for i, line in enumerate(lines): if 'My name is kitty' in line: start_line = i + 1 break # 从start_line开始,删除重复行,写入CSV文件 with open(args.output, 'w', newline='') as csvfile: writer = csv.writer(csvfile, delimiter=',') headers = None for line in lines[start_line:]: if line not in lines[:start_line] and line.strip(): if not headers: # 第1行,按照正则规则1分列 headers = re.findall(regex1, line.strip())[0] writer.writerow(headers) else: # 从第2行开始,按照正则规则2分列 data = re.findall(regex2, line.strip())[0] writer.writerow(data) # 读取CSV文件,生成4个曲线图 data = np.genfromtxt(args.output, delimiter=',', dtype=None, names=True) fig, axs = plt.subplots(4, 1, figsize=(6, 8)) for i, title in enumerate(titles): # 找到符合分类规则的列 cols = [] for j, header in enumerate(data.dtype.names): for t in titles[title]: if header.startswith(t): cols.append(j) break # 画曲线图 axs[i].set_title(title) axs[i].set_xlabel('Time') axs[i].set_ylabel('Value') for j, col in enumerate(cols): axs[i].plot(data[data.dtype.names[col]], label=header, color=np.random.rand(3,)) axs[i].legend() # 显示曲线图,可使用筛选器选择要查看的图 plt.show() ``` 这是一个Python脚本,使用了argparse模块处理命令行参数,可以在任何文件夹下读取Log文件。根据题目要求,使用了正则表达式处理Log文件,并将结果写入CSV文件。然后,根据标题行的分类规则,将CSV文件中的数据进行分类,并生成4个曲线图。最后,使用matplotlib库显示曲线图,并可使用筛选器选择要查看的图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值