topcss / my-notes

https://github.com/topcss/my-notes/issues/new

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Javascript 字符串模板

topcss opened this issue · comments

commented
// 增加一些模板处理的方法
Object.assign(String.prototype, {
    /**
     * 用正则替换对应的字符串,并且生成多个模板代码
     * 基于模板(列表,正则)
     */
    toMany(listStr, reg) {
        let list = [];
        listStr.split(',').map(item => list.push(this.replace(reg, item)));
        return list.join('');
    },

    /**
     * 按顺序替换字符串
     * 基于内容(列表,正则)
     */
    replaceList(listStr, reg) {
        let list = listStr.split(','), index = 0;
        return this.replace(reg, (e, i) => list[index++]);
    },

    /**
     * 通过自定义函数,来替换指定的值
     * 基于内容(正则,函数)
     */
    replaceByFn(reg, fn) {
        let index = 0;
        return this.replace(reg, (item) => fn(item, (index++)));
    }
});

Object.assign(Array.prototype, {
    /**
     * 如果数组有重复,就重命名+1,可用于数据库字段命名,文件夹命名
     */
    uniq() {
        let list = [], c={};
        for(let i = 0; i < this.length; i++){
            let item = '_'+ this[i];
            if(list.indexOf(item.substr(1)) == -1){
                list.push(item.substr(1));
            } else {
                c[item] = c[item] == undefined ? 1 : c[item] + 1;
                list.push(item.substr(1) + c[item]);
            }
        }
        return list;
    }
});

// -------

// 基于正则的模板生成函数
var printT = (T, A, K) => {
    var L = [];
    A.split(',').map(E => L.push(T.replace(K, E)));
    return L.join('');
}

// 基于这个模板,生成多个,用正则替换
// 在 chrome 控制台运行即可
printT(
`SELECT
	GROUPID,
	'KXL' AS 'NAME', -- 列名
	MAX(KXL) as 'MAX', -- 最大值
	MIN(KXL) as 'MIN', -- 最小值
	AVG(KXL) as 'AVG', -- 平均值
	STDEV(KXL) as 'BZC', -- 标准差
	(STDEV(KXL)/AVG(KXL)) as 'BYXS', -- 变异系数
	COUNT(KXL) as 'YBS', -- 样本数
	((1-(1.704/SQRT(COUNT(KXL))+4.678/(COUNT(KXL)*COUNT(KXL)))*(STDEV(KXL)/AVG(KXL)))*AVG(KXL)) as 'BZZ' -- 标准值
FROM  Fn_Report_Sycgylb(@oaid, @groupId)
where KXL IS NOT NULL AND KXL not like '*%'
GROUP BY GROUPID
UNION ALL
`
, `KLMD,HG,ZR,BH,HSL,XSL,BHXSL,KXL,BHKYQDDZ,BHKYQDPJ,TRKYQDDZ,TRKYQDPJ,RHXS,BXMLDZ,BXMLPJ,TXMLDZ,TXMLPJ,BSB,KLQDDZ,KLQDPJ,TJFTG,TJFC,ZXRCFTG,ZXRCFNJLC,XGXS,NMCJ`
,/KXL/ig)
// 把列表项目,按顺序替换字符串
var str2item = (str, arr, reg) => {
	let list = arr.split(','), j = 0;
	return str.replace(reg, (e, i) => list[j++]);
}


// 把列表项目,按顺序替换字符串
str2item(
`
[ActionPermission(Description = "只查看自己的数据", Type = PermissionType.UserSet)]
public ActionResult F_USER_ADD() { return View(); }
[ActionPermission(Description = "只查看自己的数据", Type = PermissionType.UserSet)]
public ActionResult F_USER_DELETE() { return View(); }
`
, `新建用户,删除用户`
, /只查看自己的数据/ig)
str2item(

printT(
`        [ActionPermission(Description = "只查看自己的数据", Type = PermissionType.UserSet)]
        public ActionResult OnlySelf() { return View(); }
`
, `F_USER_ADD,F_USER_DELETE,F_USER_UPDATE,F_USER_VIEW,F_USER_REPWD,F_ROLE_ADD,F_ROLE_DELETE,F_ROLE_UPDATE,F_ROLE_VIEW,F_SYNC_IMPORT,F_SYNC_DOWNLOAD,F_PROJ_ADD,F_PROJ_DELETE,F_PROJ_UPDATE,F_PROJ_VIEW,F_PROJ_IMPORT,F_ZKXX_ADD,F_ZKXX_DELETE,F_ZKXX_UPDATE,F_ZKXX_VIEW,F_DICT_TABLE,F_ZKXX_IMPORT,F_DICT_CONTENT,F_DICT_CUSTOM,F_DICT_VIEW,F_STAFF_MGT,F_STAFF_VIEW,F_ALL_VIEW,F_ALL_EDIT`
,/OnlySelf/ig)

, `新建用户,删除用户,修改用户,查看用户,重置密码,新建角色,删除角色,修改角色,查看角色,上传数据,下载数据,新建项目,删除项目,修改项目,查看项目,导入项目,新建钻孔信息,删除钻孔信息,修改钻孔信息,查看钻孔信息,数据字典表管理,导入钻孔信息,数据字典内容管理,数据字典自定义表管理,查看数据字典,管理人员信息,查看人员信息,查看所有,编辑所有`
, /只查看自己的数据/ig)
// 把某个固定值,替换为变量
function ToVar(str, K){
    let list = 'T',index = 0;
    return str.replace(K, (item) =>   list + (index++) );
}
// 使用
ToVar('ZZ|ZZ|ZZ', /ZZ/ig)



// 通过自定义函数,来替换指定的值
function RepFn(str, R, F){
    let index = 0;
    return str.replace(R, (item) =>  F(item, index++));
}
// 使用
RepFn('ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ', /ZZ/ig, 
function(i,n){
return i + (n%3+1);
})


// 综合示例代码
// 需求:
// 按照模板把多处内容替换,宽度要求小于40%,间隔显示
RepFn(// 3. 自定义替换固定的变量

str2item(// 2. 按列表,修改变量值

printT(// 1. 基于列表,生成多个数据
`<tr wbdx='AAAAA' style="display:none">
      <td class="dcqicon"><img src="../images/light-red.png" width="20" height="15" alt="" /></td>
           <td>BBBBB</td>
               <td>
               <div class="BottomColor">
               <div class="UpColor00" style="width: 20%">20%</div>
               </div>
        </td>
</tr>
`
, `jack,tiger,leo,jonathon,aaron`
,/AAAAA/ig)

,`sophie,rainbow,linda,yolanda,judy`
, /BBBBB/ig)

, /20%">20%/ig, 
function(i,n){
let num =  (n%3+1);
return `${num}0%">${num}0%`;
})

// 如果数组有重复,就重命名+1,可用于数据库字段命名,文件夹命名
var uniq =(arr) => {
    let list = [], c={};
    for(let i = 0; i < arr.length; i++){
		let item = '_'+ arr[i];
        if(list.indexOf(item.substr(1)) == -1){
            list.push(item.substr(1));
        } else {
			c[item] = c[item] == undefined ? 1 : c[item] + 1;
			list.push(item.substr(1) + c[item]);
		}
    }
    return list;
}
uniq(['aa','aa','aa',1,1,1,11,12])
commented
// 增加一些模板处理的方法
Object.assign(String.prototype, {
    /**
     * 用正则替换对应的字符串,并且生成多个模板代码
     * 基于模板(列表,正则)
     */
    toMany(listStr, reg) {
        let list = [];
        listStr.split(',').map(item => list.push(this.replace(reg, item)));
        return list.join('');
    },

    /**
     * 按顺序替换字符串
     * 基于内容(列表,正则)
     */
    replaceList(listStr, reg) {
        let list = listStr.split(','), index = 0;
        return this.replace(reg, (e, i) => list[index++]);
    },

    /**
     * 通过自定义函数,来替换指定的值
     * 基于内容(正则,函数)
     */
    replaceByFn(reg, fn) {
        let index = 0;
        return this.replace(reg, (item) => fn(item, (index++)));
    }
});

// 模板处理的例子
`<tr wbdx='AAAAA' style="display:none">
      <td class="dcqicon"><img src="../images/light-red.png" width="20" height="15" /></td>
           <td>BBBBB</td>
               <td>
               <div class="BottomColor">
               <div class="UpColor00" style="width: 20%">20%</div>
               </div>
        </td>
</tr>
`
.toMany(
`jack,tiger,leo,jonathon,aaron`
,/AAAAA/ig)

.replaceList(
`sophie,rainbow,linda,yolanda,judy`
, /BBBBB/ig)

.replaceByFn(
/20%">20%/ig, 
function(i,n){
    let num =  (n%3+1);
    return `${num}0%">${num}0%`;
})



Object.assign(Array.prototype, {
    /**
     * 如果数组有重复,就重命名+1,可用于数据库字段命名,文件夹命名
     */
    uniq() {
        let list = [], c={};
        for(let i = 0; i < this.length; i++){
            let item = '_'+ this[i];
            if(list.indexOf(item.substr(1)) == -1){
                list.push(item.substr(1));
            } else {
                c[item] = c[item] == undefined ? 1 : c[item] + 1;
                list.push(item.substr(1) + c[item]);
            }
        }
        return list;
    }
});

['aa','aa','aa',1,1,1,11,12].uniq();
`AA
AA
BB
AA
11
12`.split('\n').uniq().join('\n')
commented

一个生成fastreport的实例

-- 模板
`      <TextObject Name="Text6" Left="18.9" Top="151.2" Width="94.5" Height="18.9" Text="勘察阶段:" Font="宋体, 12pt, style=Bold"/>
      <TextObject Name="Text6" Left="113.4" Top="151.2" Width="557.55" Height="18.9" Text="[WYJZBG.KCJD]" Font="宋体, 12pt, style=Bold"/>
`
-- 生成多条
.toMany(
`勘察地址,勘察时间,勘察单位资料,勘察单位,资质等级,项目负责人,职称,钻探劳务单位,资质证书编号,外业人员及上岗证,外业见证的内容,勘察任务书,勘察纲要,勘察纲要变更,变更申请人,变更批准人,原位测试符合程度,测量放点,水位观测,钻探工作量,钻探工作量共计,井探工作量,井探工作量共计,槽探工作量,槽探工作量共计,取土试样原状,取土试样扰动,取水试样,取岩样组,取岩样块,钻孔波速测试孔,钻孔波速测试米,原位测试,动力触探,抽水试验,压水或注水试验,其他原位测试,其他需要说明的资料,见证人和见证单位郑重声明,见证单位,单位法人代表或负责人`
,/勘察阶段/ig)
-- 按顺序替换字符串中的值
.replaceList(
`KCDZ,KCSJ,KCDWZL,KCDW,ZZDJ,XMFZR,ZC,ZTLWDW,ZZZSBH,WYRYJSGZ,WYJZDNR,KCRWS,KCGY,KCGYBG,BGSQR,BGPZR,YWCSFHCD,CLFD,SWGC,ZTGZL,ZTGZLGJ,JTGZL,JTGZLGJ,CTGZL,CTGZLGJ,QTSYYZ,QTSYRD,QSSY,QYYZ,QYYK,ZKBSCSK,ZKBSCSM,YWCS,DLCT,CSSY,YSHZSSY,QTYWCS,QTXYSMDZL,JZRHJZDWZZSM,JZDW,DWFRDBHFZR`
, /KCJD/ig)
-- 修改元素的ID
.replaceByFn(
/Text6/ig, 
function(i,n){
    return `Text${6+n}`;
})
-- 修改元素的位置
.replaceByFn(
/151.2/ig, 
function(i,n){
    return `${(151.2+(Math.ceil(n/2)+1)*28.35).toFixed()}`;
})
commented

一个生成字段的的模板

copy(
// 模板
`
        /// <summary>钻孔编号</summary>
        public int ZKBH { get; set; }
`
.toMany(

// 批量替换字段名称
`KLMD
HG
ZR
BH
HSL
XSL
BHXSL
KXL
BHKYQDDZ
TRKYQDDZ
BXMLDZ
TXMLDZ
BSB
KLQDDZ
TJFTG
TJFC
ZXRCFTG
ZXRCFNJLC
XGXS
NMCJ`.replace(/\n/ig,',')
,/ZKBH/ig)

// 批量替换注释
.replaceList(
`颗粒密度
烘干
自然
饱和
含水率
吸水率
饱和吸水率
孔隙率
饱和抗压强度单值
天然抗压强度单值
变形模量单值
弹性模量单值
泊松比
抗拉强度单值
图解法tg
图解法C
最小二乘法tg
最小二乘法内聚力C
相关系数
内摩擦角`.replace(/\n/ig,',')
, /钻孔编号/ig));