?
zh en
20px - +
wrap
cursor
>
<
..
发信人: soulfox (小o&灵狐~以华丽之名), 信区: ANSI_Discuss 标 题: [教程相关][第三章]部分超长代码作品的张贴by hw 发信站: 日月光华 (2007年08月09日20:46:43 星期四), 站内信件 ─────────────────────────────────────── __ ___ ╱█ __ __ ______ ______ ╱∠- ╱__█ █ █ █__ ̄  ̄/╱\\ __╱ █ █╲█ ▁ █ __█__ (╱⌒ \\  ̄  ̄  ̄  ̄  ̄ ̄ ̄  ̄ ̄ ̄ ╱_ / _)_/ 日月光华ANSI版短期培训班 /__ /__ ▏ ╱/╱ ____ /▏╱╱ ╲ \ /\︶╱ \ 番 外 篇: 部分超长代码作品的张贴 /_ / │ ~╲ │ ▕▲ ╰)/─│ ☉│ │ │ ^ \─│ │ │ │ 时间安排: 火星人不讲日期 / │ ☉│ │_│ 当班教师: hw (其实只是个发课外资料的) ▔▔ │ │ | | │ ︵___/ \_ (──||||-' ─────────────────────────────────────── ──|问题简介|──────────────────────────────── 一 光华系统的限制 在光华,有一行至多254字节的限制(一个中文字占2个字节),因此,一些颜色 频繁变化的作品,用普通的方法将代码精简到最短,仍会有某一些行超长,无 法直接张贴上来,于是就要尝试一些特殊的方法,比如利用光标移动等特殊的 ANSI控制符,借用作品中较短的一些行的字符空间来存放超长行中放不下的那 部分内容。 二 兼容性 使用了*[m以外的控制符,兼容性当然要打点折扣,比如web下面肯定是要乱掉 了,好在光华的web本来就对ANSI的支持不是很好,一般不会在web下面看ANSI 作品。还有就是不同的Term软件对各种ANSI代码的解释不同所造成的差异,所 以尽量使用最通用的控制,如ABCDH等,不使用@这类 光华的smd是屏蔽所有*[m以外的控制符的,所以代码超长的作品不可能按原样 放置到smd中 ────────────────────────────────────|| ──|问题简介|──────────────────────────────── 三 观看方式 (不关注可以先跳过,知道本文中“屏显字符”的定义即可) 张贴代码超长作品,或者使用某些特殊qmd,可能遇到另一个问题,就是屏幕滚 动(↑↓) 与翻页(PgUp、PgDn)时的系统处理方式造成对作品的破坏,因此有必 要在此简单说明一下(并没有去对照BBS源码,根据一些简单测试的个人总结) 大家都知道文章题头3行(信件4行)并且与正文之间有一个空行,因此第一屏有 效代码为19行,其后每一屏23行。不过行数并不总是等同于回车数量,一行代 码中,扣除所有的普通和特殊ANSI代码后,每80个字符会附加一次断行。这里 扣除控制码后的字符是实际要在屏幕上显示的,称为屏显字符 (包括空格) ↓或Space或PgDn时,先计算出需要移动的行数,将当前屏幕内容上移(并不重 新解释这部分的代码),然后在原来最后一行的下面开始解释新的行代码,对于 普通作品至多影响分页处的行间代码接续,使用规范代码即可避免,但是对于 定位等特殊代码,代码的位置以及前面说的80屏显字符断行都可能影响作品。 ↑或PgUp时,计算出起始行后,连续解释23行代码,不管这行在滚屏前是否已 经解释过,所以有的作品向下一行行看不对,按一次↑又修好了。 ────────────────────────────────────|| ──|问题简介|──────────────────────────────── 四 编辑方式 由于在BBS里编辑行长度超过254的代码容易断线(一般是BackSpace或Del时造成 的),所以代码改写可以在记事本之类的文本编辑器中进行,完成后再贴到 BBS 上,不过文本编辑器中没法预览效果,也容易弄丢控制符,所以操作时要格外小 心,过一段时间就用term看看效果。也能直接在Term里改,合并行时小心点。 五 其他问题 注意修改的作品与原图的显示效果一致,原作的暗标也应予以保留。 对于观看方式(↓或Space)的限制最好给出说明,注意转载等操作系统增加的内 容会导致分页位置的变化,若影响了作品记得修正。 若光标定位后所在行与实际行不符,记得在整幅作品的末尾恢复到正确的行,以 免造成观看时蓝色状态条的上移(一般不用每行都保证这样,提示别人正确的观 看方式即可)。总之多测试,尽量减少副作用。 ────────────────────────────────────|| ──|常用技法|──────────────────────────────── 一 *[x;yH绝对定位 控制码详解:x是列标(横坐标),y是行号(纵坐标),H必须大写,屏幕的左上角 为*[1;1H,右下角为*[24;80H,一般只会用到第23行。当只指定一个参数时, fterm等解释为*[x;1H而Cterm3解释为*[1;1H,所以一般都要求写全两个参数。 修改方法:观察源代码,找到超长的行,将超过的部分截取出来,对照作品记 下显示位置,放到短行中并在开头加上定位码及必要的颜色控制。 注意事项:第一行内容的位置需要确定;所有代码需要在同一屏内解释;注意 回车前光标要恢复到正确的行以保证下一行起始位置正确;第一屏作品要注意 信头会占掉3行或4行;对于第二屏的作品,应提示使用Space来观看,用↓一般 是看不到正确效果的,另外第二屏的第一行会显示在第一屏末尾,这一行代码 中不能使用绝对定位;注意单行屏显字符80的限制,所以并不是行代码短就能 借用的,还必须控制行屏显字符数,作品较小或者有空白行可以利用当然就最 好了,如果可利用的屏显字符空间不够,就要结合或换用其它方法来尝试。 ────────────────────────────────────|| ──|常用技法|──────────────────────────────── 二 行内右移*[nC 控制码详解:参数n表示移动的距离,若n较大移动到屏幕边界会停止。 修改方法:当行内有连续5个以上黑背景的空格时可以用*[nC越过(其他背景的 空格不能这么干,除非已事先涂过背景),少于5个空格不能缩短长度,不过能 让出屏显字符的空间,是充分挖掘短行潜力的辅助手段,另一种可能是黑背景 与另一种背景色的交替,虽然只用*[nC不一定能缩短代码长度,但是由于省去 了背景色的切换,综合起来能缩短总代码长度。 注意事项:兼容性很好,除了必须用Term看外没什么特别要求。不过由于作用 有限,只有少部分作品能只用这一种控制符解决法搞定,一般要结合其他技法 实例:培训班教材中的习题,要求并排两个Fterm,此作品有一定量黑色背景, 而且不少地方是黑色与另一种颜色*[43m或*[47m的交替,于是正适合采用此法 来进行代码长度压缩,精华区有,可以F回去看代码,其实只需要对超长的行进 行处理即可,不过精华区里的例子对所有行都做了,一般不需要做那么多。 ────────────────────────────────────|| ──|常用技法|──────────────────────────────── 三 行内移动*[nC与*[nD 控制码详解:*[nD与*[nC类似,只不过移动方向换为向左。 修改方法:只用这两个控制来压缩代码长度是很累而且条件苛刻的任务,想法 来自于上一种技法中关于黑彩交替背景的代码压缩,真正省下空间的并不是光 标移动代替空格,而是减少了背景色的切换,只要后者节省的代码量超过前者 增加的代码量就是有意义的。在本技巧中,就换为将同样显示属性或者变换时 控制码较短的放在一起,利用光标移动来控制写字符的地方,要求最终结果的 代码短于原始代码。 注意事项:兼容性很好,除了必须用Term看外没什么特别要求。但其苛刻的条 件及复杂的分析与计算量,决定了这至多只是一个局部调整的辅助技法。 例子:没有很好的实例,有个概念性的例子。单行的38方块标准双色跑马灯, 如果用标准的代码,每次切换前背景需要8个字节,由于整行只用到两种显示属 性,将同种的放在一起每次只需要4到5字节的移位控制。 ────────────────────────────────────|| ──|常用技法|──────────────────────────────── 四 光标移动*[nA、*[nB、*[nC和*[nD 控制码详解:A是上移,B是下移。 修改方法:上下左右4个方向都能移动,于是就能利用短行来补长行了,就像第 一个技法中用绝对定位,差别就在于一个观察绝对位置一个观察相对位移。结 合前面的技法二和三,足以处理很多作品了,而技法一我个人很少使用。 注意事项:第二屏作品一般应该推荐用Space观看,虽然只要不把光标位移动到 代码所在行之下用↓一般也能逐渐显现正确结果,但用Space是最保险的。注意 行屏显字符80的限制,不要超,短行中的黑背景空格,可以考虑用技法二,牺 代码空间换取屏显字符空间。作品末尾记得把光标恢复到正确位置。第二屏作 品的第一行会显示在第一屏末尾,这一行不要用A和B。 实例:精华区中Sylow个展第二期中的《风见隼人》、《camio》、《ACE》以及 《NARUTO》,还有“自然风景”分类中Sylow的《小镇风光》,最后一个是用↓ 也能看到正确结果的,但一定要移动到代码最后一行才会把前面缺掉的部分补 上,前面那些作品都是不能用↓的。 ────────────────────────────────────|| ──|附加说明|──────────────────────────────── 一 *[s与*[u光标的存取与恢复 控制码详解:*[s存储光标的当前位置,*[u恢复到最近的一个*[s位置。另有一 套相应的代码为*7和*8,很多终端同时支持这两套,但也有只支持一套的,所 以这些虽然简单但是并不是非常提倡。一般都用*[s与*[u,Windows用户多嘛。 使用方法:这两个控制一般都会结合光标移动或定位一同使用。这两个控制符 比较简短,可以代替个别相对较长的移动或定位控制来缩短代码。 注意事项:保证所有代码在同一屏得到解释,其余要求由主要技法决定。 二 *[K删行及其他控制符 *[K可以用背景色填涂到行末,有可能用来作为辅助手段,不过在Cterm2000下 永远用黑背景填充,条件苛刻兼容性也不够好,我本人从来没考虑过;*[1K有 些Term下是向左填涂,兼容性更差;J之类清屏极不推荐;Ansi3.64中@或P还有 E、F、G等控制符同样受限于兼容性及本身的作用而基本不会去考虑;*[L有用 来制作军棋图谱之类的,这与本篇无关,不详述。 ────────────────────────────────────|| ──|附加说明|──────────────────────────────── 三 色彩代码的精简与规范化 对于代码超长的作品的张贴,限于光华系统的限制,有时不得不采用特殊的方 法来解决,不过普通代码的精简仍是最基本的,为了兼容性及减少用户观看时 的不便,能不使用特殊控制的就坚决不用。 代码精简和规范化在个别临界条件下是有矛盾的,这时候就要清楚哪个更为重 要。下一行接续上一行末尾的代码有什么弊端呢?回头看看翻页的系统处理, 在分页处,会破坏代码的接续。行末不恢复到默认背景,在smd里可能造成颜色 拖尾(只在Ctrl+A观看时发生)。*[m后面非空格字符的显示,会造成默认高亮用 户与默认低亮用户看到的效果不同,是否应该照顾到更多的人呢? 代码精简,首先删除无效控制符;其次观察空格,对于无下划线的空格,前景 色、高低亮、闪烁与否都是没区别的,可以与前后的内容协调减少属性变化。 做上面这两步时都应保证规范代码。若调整后还是不行,但是只差一点点,于 是考虑颜色代码的行间接续、*[m代替*[0m等等,也就是不再遵从代码规范。 ────────────────────────────────────|| ──|附加说明|──────────────────────────────── 四 太累了,想尽快结束掉…… 假如没有行代码长度限制就好了,大家可以专注于创作而不必去关心代码是否 会超长,希望哪一天光华也能有所改进,不过在此之前,只能将就一下了。 本篇所说的技巧并不要求每个人掌握,不过比如光华的ANSI版版主,经常转贴 外站作品的人最好能知道一点,当然还有对光华ANSI特有感情的人,呵呵。 有没有用了特殊控制仍旧贴不过来的作品呢?我想是有的,极端情况,撑满整 屏的大作品,颜色变化频繁,空格极少,于是代码空间和屏显字符空间都无法 压榨,当然贴过来就不可能了。好在至今为止,这类BT作品不多。 根据全局的颜色分布来调整代码,精确计算,也许能得到最最简短的代码,但 这似乎已经不是人力能做的事情了。追求最短代码没有意义,能贴得过来就是 了。 ────────────────────────────────────|| -- BBS客户端探测程序(仅支持ctermftermstermqterm以及WinXP telnet) 您当前所使用的是: ctermIII fterm sterm Win telnet qterm <SFC(100,222,255) T(0,-10,"CTERMIII")> ※ 来源:·日月光华 bbs.fudan.edu.cn·[FROM: 10.8.225.9] -- ※ 转寄:·日月光华 bbs.fudan.edu.cn·[FROM: 10.85.48.11] -- ※ 转载:·日月光华 bbs.fudan.edu.cn·[FROM: 10.85.48.11] ※ 修改:·soulfox 於 08月09日20:46:52 修改本文·[FROM: 10.85.48.11]