- 遍历一棵模板树中的所有模板;
- 检查模板名是否为引用模板,若否则跳过;
- 检查是否为不使用CS1的引用模板(e.g. cite arxiv),若是则跳过;
- 检查本模板中各参数值:若参数名实质等同于quote则跳过不处理;若参数值含有"<!---"或"nowiki"字串则跳过不处理;
- 除U+FFFD(依其定义,此符号存在的目的是为了替换,而非简单粗暴地移除)之外,若含有其它任何CS1定义的不可见字符则移除,但以下情况需要特殊处理:
- 控制符\t,\r,\n需特殊处理,它们在参数值的开头和尾部出现是合法的,但在参数值中间出现则是非法的;因此在检查参数值时,在读入第一个非不可见且非空格的字符前,不会清走这三个字符;在读入满足上述条件的字符后,遇到这三个字符不会立即丢弃,而是会将其存入一个缓冲区,待读入下一个非不可见且非空格的字符时才清空。最后将留在缓冲区中的字符(即原参数值尾部的\t\r\n)加到输出的新参数值尾部。这种处理方式有一个非预期的行为即如果原参数值的尾巴是“\t \n \n”,输出后会变成“ \t\n\n”。但本人认为这种处理至少是没有害处的,应可以接受;此外,由于该三个控制字符在事实上会显示为空格,为避免把两个英文词汇/数字粘一起,在清空缓冲区前会检查当前字符和输出的前一个字符是否是非空格、非连接符且非不可见的ASCII字符,如是则先输出一个空格再丢弃。
static int judgeinvisible(unsigned int uch)
{
/* 等于是把[[:Category:引文格式1错误:不可见字符]]的说明照抄一遍,但跳过U+FFFD不处理*/
return ((uch!=0xFFFD)&&
(uch==0x200B)||
(uch==0x00AD)||
(uch==0x0009)||
(uch==0x0010)||
(uch==0x0013)||
((0<uch)&&(uch<=0x001F))||
((0x0080<=uch)&&(uch<=0x009F))||
((0xFFF9<=uch)&&(uch<=0xFFFF))||
((0xE000<=uch)&&(uch<=0xF8FF))||
((0xF0000<=uch)&&(uch<=0xFFFFD))||
((0x100000<=uch)&&(uch<=0x10FFFD)));
}
- 批准測試運作(30次編輯)。--Xiplus#Talk 2020年7月15日 (三) 10:35 (UTC)[回复]
- 已完成50笔编辑。除1、2之外均满足设计要求。检查发现是上面的表达式没有写对,应为:
static int judgeinvisible(unsigned int uch)
{
/* 等于是把[[:Category:引文格式1错误:不可见字符]]的说明照抄一遍,但跳过U+FFFD不处理*/
return ((uch!=0xFFFD)&&
((uch==0x200B)||
(uch==0x00AD)||
(uch==0x0009)||
(uch==0x0010)||
(uch==0x0013)||
((0<uch)&&(uch<=0x001F))||
((0x0080<=uch)&&(uch<=0x009F))||
((0xFFF9<=uch)&&(uch<=0xFFFF))||
((0xE000<=uch)&&(uch<=0xF8FF))||
((0xF0000<=uch)&&(uch<=0xFFFFD))||
((0x100000<=uch)&&(uch<=0x10FFFD))));
}
-
- (:)回應
- 1. 是。如Special:Diff/60649498所示,不取消这一换行CS1即报错。(但处理任务时bot完全“看不见”CS1的报错信息,因此上面的空运行结果才有意义。)
- 2. 是。因为最后一个参数里带了reflist模板,当程序完成模板解析的时候参数值的地方是一个单向链表
(节点1:[类型=文本,字符指针=指向字符串" ref = harv \n==参考文献==\n"所在的内存区域])->(节点2: [类型=模板,结构指针=指向模板reflist所在的内存区域])->(节点3:[类型=文本,字符指针=指向字符串"\n\n==另请参阅==\n "所在的内存区域])->NULL
- 当程序处理到节点3的地方时,如果要去除“另请参阅”前面的两个\n,它就必须利用节点1和节点2中已经出现过的信息。但是它完全不知道节点2中的模板里有什么内容——不可能每解析一个条目还要向服务器请求所有使用的模板的源码,这不现实——为保险起见就一刀切禁止这种跨节点处理的情况。
- 3. 引起Citation/CS1报错的的除了不可见字符之外,还有部分控制字符和私有字符。与U+FFFD不同,其出现几乎总是由OCR识别错误所导致的,而不是替换了什么合法的字符,因此采用移除的处理方法并无不妥之处。--Antigng(留言) 2020年7月18日 (六) 02:11 (UTC)[回复]
- 正式批准運作。--Xiplus#Talk 2020年7月18日 (六) 05:13 (UTC)[回复]