-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathbreak_string.tf
135 lines (127 loc) · 3.9 KB
/
break_string.tf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
; $Log: break_string.tf,v $
; Revision 1.4 2001/12/09 17:52:07 lje
; typofix
;
; Revision 1.3 2001/12/09 17:46:47 lje
; Neue Behandlung von Inline-Attributen in gebrochenem Text. Siehe Beschreibung zu bs_ignore_inline
;
; Revision 1.2 2001/12/08 22:42:10 mh14
; fileinfo,log,config sektion
;
/set break_string_tf_version $Id$
/set [email protected]
/set break_string_tf_requires=
/set break_string_tf_desc=break_string, stretch_string zum Formatieren von Texten
;;; 'break_string.tf'
;;;
;;; (c) Vardion@MorgenGrauen
;;;
;;; $Id$
;;;
;;; break_string ist an die efun break_string() angelehnt und arbeitet auch
;;; fast so
;;; break_string(string, size, indent) in LPC wird zu
;;; /set bs_size=%size
;;; /set bs_indent=%indent
;;; /set bs_cmd=/ausgabemacro
;;; /break_string %string
;;; in TF.
;;; Leider koennen Strings in TF offenbar keine Newlines enthalten, deshalb
;;; wird der gebrochende Text direkt ausgegeben
;;; Displayattribute des ausgegebenen Textes koennen in bs_attr gesetzt werden
;;;
;;; /block_string arbeitet aequivalent, der Ausgabetext (ohne Indent) wird
;;; aber in Blocktext umgewandelt
;;;
;;; Ein weiteres Feature ist bs_ignore_inline. Wird diese Variable auf 1
;;; gesetzt, so werden in allen Laengenberechnungen Inline-Attribute fuer
;;; /echo -p etc ignoriert. Damit kann auf diese Art mehrfarbig gemachter
;;; Text korrekt behandelt werden. Bei einem Zeilenumbruch werden jedoch alle
;;; Attribute ausgeschaltet, so dass es hier zu falschen Farben kommen kann.
;;; Also aufpassen!
;;;
; ********************* BEGIN CONFIG ********************
/set bs_size=78
/set bs_ignore_inline=0
; ********************* END CONFIG **********************
/def break_string = \
/let bs_out=%1%; \
/shift%; \
/let bs_csize=$[bs_size - bs_strlen(bs_indent)]%; \
/if (bs_cmd =~ '') \
/def bs_cmd=/echo %bs_attr -- %bs_indent$$(/stretch_string \
%bs_csize %%*)%; \
/else \
/def bs_cmd=%bs_cmd %bs_indent$$(/stretch_string \
%bs_csize %%*)%; \
/endif%;\
/while ({#} | bs_out !~ '') \
/if (bs_strlen(bs_out) > bs_csize) \
/test bs_cmd(substr(bs_out, 0, bs_csize))%; \
/test bs_out:=substr(bs_out, bs_csize)%; \
/else \
/if (bs_strlen(bs_out) + bs_strlen({1}) + 1 > \
bs_csize) \
/if (bs_out !~ '') \
/test bs_cmd(bs_out)%; \
/endif%; \
/test bs_out:={1}%; \
/shift%; \
/else \
/test bs_out:=strcat(bs_out,' ',{1})%; \
/shift%; \
/if (!{#}) \
/set bs_block=0%; \
/test bs_cmd(bs_out)%; \
/let bs_out=%; \
/endif%; \
/endif%; \
/endif%; \
/done%;\
/undef bs_cmd
;;; Lueckenzerrung per Bresenham Algorithmus
/def stretch_string = \
/if (!bs_block) /_echo %-1%; /break%; /endif%; \
/let bs_len=%1%; \
/shift%; \
/let bs_dx=$[bs_len - 1 - bs_strlen({*}) + {#}]%; \
/let bs_dy=$[{#} - 1]%; \
/let bs_pad=0%; \
/let bs_eps=0%; \
/let stretch_start=%1%; \
/let stretch_out=%; \
/shift%; \
/let bs_x=0%; \
/while (bs_x <= bs_dx) \
/let bs_eps=$[bs_eps + bs_dy]%; \
/test ++bs_pad%; \
/if (bs_eps * 2 >= bs_dx) \
/let stretch_out=%stretch_out$[pad('', bs_pad)]%1%; \
/shift%; \
/let bs_pad=0%; \
/let bs_eps=$[bs_eps - bs_dx]%; \
/endif%; \
/test ++bs_x%; \
/done%; \
/let stretch_out=%stretch_start$[pad('', bs_len - \
bs_strlen(stretch_start) - bs_strlen(stretch_out))]\
%stretch_out%; \
/_echo %stretch_out
/def block_string = \
/set bs_block=1%; \
/break_string %*
;;; strlen, dass bei der Laengenberechnung inline-Attribute uebergehen kann
/def bs_strlen = \
/if (!bs_ignore_inline) /return strlen({*})%; /endif%; \
/let bs_sl=%*%; \
/let bs_sl_left=%; \
/let bs_sl_right=%; \
/let bs_sl_pos=%; \
/while ((bs_sl_pos:=strstr(bs_sl, '@{')) > -1 ) \
/test bs_sl_left:=substr(bs_sl, 0, bs_sl_pos), \
bs_sl_right:=substr(bs_sl, bs_sl_pos + 2), \
bs_sl_right:=substr(bs_sl_right, strstr(bs_sl_right, \
'}') + 1), \
bs_sl:=strcat(bs_sl_left, bs_sl_right)%; \
/done%; \
/return strlen(bs_sl)