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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>name</key>
<string>ROOT</string>
<key>submenu</key>
<array>
<dict>
<key>content</key>
<string>--applescript direct
--Michael Sharpe, 20140424
--This is free software, but Copyright (c) Michael Sharpe, 2014
--and subject to the LATEX Project Public License.
--This allows replication of a commented block of text as many times as specified, substituting
--values for 'variables' in the process
property trimitems : {" ", tab, linefeed, return}
set lf to linefeed
set cr to return
set crlf to cr & lf
set oldtid to text item delimiters
tell application "TeXShop" to set s to content of selection of document 1
set tmp to (paragraphs of s)
set text item delimiters to {lf}
set s to (tmp as text)
set text item delimiters to "%Repetitions="
set tmp to (text items of s)
set text item delimiters to oldtid
if not ((count of tmp) = 2) then
display dialog "Bailing! The selection does not contain exactly one '%Repetitions='"
return
end if
set ss to (item 2 of tmp)
set tmp2 to (paragraphs of ss)
set numrep to (item 1 of tmp2) as integer
--next get variable names
set text item delimiters to {"%Variables="}
set tmp to (text items of s)
set text item delimiters to oldtid
if not ((count of tmp) = 2) then
display dialog "Bailing! The selection does not contain exactly one '%Variables='"
return
end if
set ss to (item 2 of tmp)
set tmp2 to (paragraphs of ss)
set vbllst to (item 1 of tmp2) --like {nnn,0:1+1,1:3+-2}
set vbllst2 to trim(vbllst)
set vbllst3 to (text 2 thru -2 of vbllst2)
set text item delimiters to {" , ", " ,", " ,", ","}
set vbles to (text items of vbllst3) -- line {nnn,0:1+1,1:3+-2}
--display dialog "vbles=" & (vbles as text)
set n to (count of vbles)
set root to (item 1 of vbles)
set vlst to {}
set vinit to {}
set vinc to {}
set valt to {}
set text item delimiters to {":", "+"}
repeat with j from 2 to n
set x to (text items of (item j of vbles))
if not ((count of x) = 3) then
display dialog "Bad variable descriptor-- " & item j of vbles
set text item delimiters to oldtid
return
end if
set end of vlst to (item 1 of x)
set nnn to 0
set hasp to 0
if (last character of (item 3 of x) = ")") then
set hasp to 1
set nnn to ((text -2 of (item 3 of x)) as integer)
set (item 3 of x) to (text 1 thru -4 of (item 3 of x))
else
if (first character of (item 2 of x) = "[") then set nnn to -100
end if
if (item 3 of x) ends with "/2" then
set (item 3 of x) to (text 1 thru -3 of (item 3 of x))
if hasp = 1 then
set nnn to -nnn
else
set nnn to -10
end if
end if
set end of valt to nnn
if (nnn = -100) then
set end of vinit to (text 2 thru -1 of (item 2 of x))
set end of vinc to (text 1 thru -2 of (item 3 of x))
else
set end of vinit to (item 2 of x)
set end of vinc to (item 3 of x)
end if
end repeat
set text item delimiters to oldtid
set viniti to {}
set vinci to {}
set kk to (count of vinit)
repeat with j from 1 to kk
try
set end of viniti to ((item j of vinit) as integer)
on error
set end of viniti to 0
end try
try
set end of vinci to ((item j of vinc) as integer)
on error
set end of vinci to 0
end try
end repeat
set tmp to (paragraphs of s)
set m to (count of tmp)
set tmp2 to {}
repeat with j from 3 to m
set t to (item j of tmp)
if ((count of t) > 1) then
set t to (text 2 thru -1 of t)
else
set t to ""
end if
set end of tmp2 to t
end repeat
set text item delimiters to {lf}
set body to (tmp2 as text)
set text item delimiters to oldtid
set repl to {s}
set newbody to body
repeat with p from 1 to numrep
set newbody to body
repeat with k from 1 to kk
set v to ""
set alt to (item k of valt)
if (alt = -100) then
if (p mod 2) = 0 then
set v to (item k of vinc)
else
set v to (item k of vinit)
end if
else
set v to (item k of viniti)
if (alt < 0) then
set v to (v div 2)
set alt to -alt
end if
if (alt is not 10) and (alt is not 0) then
set v to zero_pad(v, alt)
else
set v to (v as string)
end if
end if
set newbody to switchText of newbody from (root & (item k of vlst)) to v
set item k of viniti to (((item k of viniti) as integer) + (item k of vinci))
end repeat
set end of repl to newbody
end repeat
set text item delimiters to lf
tell application "TeXShop" to set selection of document 1 to (repl as text)
set AppleScript's text item delimiters to oldtid
on zero_pad(value, string_length)
set tmp_string to "000000000" & (value as string)
set padded_value to text ((count of tmp_string) - string_length + 1) thru -1 of tmp_string
return padded_value
end zero_pad
to switchText of t from s to r
set d to text item delimiters
set text item delimiters to s
set t to t's text items
set text item delimiters to r
tell t to set t to beginning & ({""} & rest)
set text item delimiters to d
t
end switchText
on trim(someText)
try
repeat until first character of someText is not in trimitems
set someText to text 2 thru -1 of someText
end repeat
on error
set someText to ""
end try
try
repeat until last character of someText is not in trimitems
set someText to text 1 thru -2 of someText
end repeat
on error
set someText to ""
end try
return someText
end trim
</string>
<key>key</key>
<string></string>
<key>name</key>
<string>Replicate</string>
</dict>
</array>
</dict>
</plist>
|