From 08e65d47f31417013f8aa673f2ad782c8dd2bbb5 Mon Sep 17 00:00:00 2001 From: Nicolas Seriot Date: Sat, 5 Apr 2025 18:00:08 +0200 Subject: [PATCH] added PostScript mode --- Modes/PostScript.seemode/Contents/Info.plist | 20 + .../Resources/AutocompleteAdditions.txt | 0 .../Contents/Resources/ExampleSyntax.txt | 11 + .../Contents/Resources/ModeSettings.xml | 13 + .../Contents/Resources/PostScript.sss | 523 ++++++++++++++++++ .../Contents/Resources/RegexSymbols.xml | 30 + .../Contents/Resources/SyntaxDefinition.xml | 449 +++++++++++++++ .../Contents/Resources/readme.txt | 22 + Modes/README.md | 1 + Modes/zipped/PostScript.seemode.zip | Bin 0 -> 15945 bytes 10 files changed, 1069 insertions(+) create mode 100644 Modes/PostScript.seemode/Contents/Info.plist create mode 100644 Modes/PostScript.seemode/Contents/Resources/AutocompleteAdditions.txt create mode 100644 Modes/PostScript.seemode/Contents/Resources/ExampleSyntax.txt create mode 100644 Modes/PostScript.seemode/Contents/Resources/ModeSettings.xml create mode 100644 Modes/PostScript.seemode/Contents/Resources/PostScript.sss create mode 100644 Modes/PostScript.seemode/Contents/Resources/RegexSymbols.xml create mode 100644 Modes/PostScript.seemode/Contents/Resources/SyntaxDefinition.xml create mode 100644 Modes/PostScript.seemode/Contents/Resources/readme.txt create mode 100644 Modes/zipped/PostScript.seemode.zip diff --git a/Modes/PostScript.seemode/Contents/Info.plist b/Modes/PostScript.seemode/Contents/Info.plist new file mode 100644 index 000000000..0c3a1530d --- /dev/null +++ b/Modes/PostScript.seemode/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleIdentifier + SEEMode.PostScript + CFBundleName + PostScript + NSHumanReadableCopyright + © 2025 seriot.ch + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + SEEMinimumEngineVersion + 4.0 + CFBundleInfoDictionaryVersion + 6.0 + + diff --git a/Modes/PostScript.seemode/Contents/Resources/AutocompleteAdditions.txt b/Modes/PostScript.seemode/Contents/Resources/AutocompleteAdditions.txt new file mode 100644 index 000000000..e69de29bb diff --git a/Modes/PostScript.seemode/Contents/Resources/ExampleSyntax.txt b/Modes/PostScript.seemode/Contents/Resources/ExampleSyntax.txt new file mode 100644 index 000000000..88c198b8c --- /dev/null +++ b/Modes/PostScript.seemode/Contents/Resources/ExampleSyntax.txt @@ -0,0 +1,11 @@ +% A Brainfuck interpreter written in PostScript +% 2023-12-05 Nicolas Seriot https://github.com/nst/bfps + +/P (+[-[<<[+[--->]-[<<<]]]>>>-]>-.-- -.>..>.<<<<-.<+.>>>>>.>.<<.<-.) def + +/d{def}def/p 0 d/_{/p p 1 add d}d/C{P p 1 getinterval}d/M 30000 string d/m 0 d +/V{M m get}d{p P length ge{exit}if C(+)eq{M m V 1 add 255 and put}if C(-)eq{M m +V 1 sub 255 and put}if C(>)eq{/m m 1 add d}if C(<)eq{/m m 1 sub d}if C([)eq{p V +0 eq{mark{C([)eq{0}if C(])eq{pop}if counttomark 0 eq{pop exit}if _}loop}if}if C +(])eq{/x exch d V 0 ne{/p x d p}if}if C(.)eq{/s 1 string d s 0 V put s ==}if +C(,)eq{/f(%lineedit)(r)file d f read pop M m 3 -1 roll put}if _}loop diff --git a/Modes/PostScript.seemode/Contents/Resources/ModeSettings.xml b/Modes/PostScript.seemode/Contents/Resources/ModeSettings.xml new file mode 100644 index 000000000..36548aa2d --- /dev/null +++ b/Modes/PostScript.seemode/Contents/Resources/ModeSettings.xml @@ -0,0 +1,13 @@ + + + + ps + \A%PS\! + + + + + + + + diff --git a/Modes/PostScript.seemode/Contents/Resources/PostScript.sss b/Modes/PostScript.seemode/Contents/Resources/PostScript.sss new file mode 100644 index 000000000..64b606c79 --- /dev/null +++ b/Modes/PostScript.seemode/Contents/Resources/PostScript.sss @@ -0,0 +1,523 @@ +/* Nicolas Seriot https://seriot.ch/ */ + +/* Comments */ +/* +comment.block +comment.block.documentation.tag +comment.line +comment.line.double-dash +comment.line.double-slash +comment.line.number-sign +*/ + +comment { + color:#236e25; + font-style:italic; +} + + +comment.line { +} + +comment.block.documentation { + color:#236e25; + font-weight:bold; +} + +comment.block.documentation.tag { + color:#123a13; +} + +/* Keywords */ +/* +keyword.class +keyword.control.definition +keyword.directive +keyword.variable.global +*/ + +keyword { + color:#5b2a96; + font-weight:bold; +} + +keyword.constant { + color:#0000ff; + font-style:italic; +} + +keyword.control { + color:#a71790; + font-weight:bold; +} + +keyword.property-key.css { + color:#881350; + font-style:italic; + font-weight:normal; +} + +keyword.type { + font-weight:normal; +} + +/* Language */ +/* +language.constant.numeric +language.constant.numeric.preprocessor +language.operator +language.operator.special +language.preprocessor +language.property +language.record +language.variable.string +*/ + +language.constant { + color:#0000ff; +} + +language.operator { + color:#AA3E9D; +} + + +language.constant.numeric.character { + color:#0000ff; + font-style:italic; + font-underline:none; + font-weight:bold; +} + +language.preprocessor { + color:#78492A; +} + +language.subroutine { + color:#003668; +} + +language.subroutine.method { + color:#2d136c; +} + +language.struct.record { + color:#2d136c; + font-weight:bold; +} + +language.variable { + color:#9c5300; +} + +language.variable.class { + color:#008c8c; +} + +language.variable.global { + color:#8a578f; +} + +language.variable.instance { + color:#c94b16; +} + +language.declaration.subroutine { + font-style:italic; +} + + +/* Markup */ +/* +markup.declaration.string.double +markup.declaration.string.single +markup.tag.attribute.value +*/ + +markup.comment { + color:#236e25; +} + +markup.constant.entity { + color:#227799; +} + +markup.declaration { + color:#236e25; +} + +markup.declaration.string { + font-underline:underline; +} + +markup.inline.cdata { + color:#ff0300; +} + +markup.processing { + color:#236e25; + font-style:italic; +} + +markup.processing.attribute.value { + font-underline:underline; +} + +markup.processing.languageswitch { + color:#ff0000; + font-weight:bold; +} + +markup.tag { + color:#89237f; +} + +markup.tag.attribute.name { + color:#9d4503; +} + +markup.tag.attribute.value.string { + color:#022aa5; +} + +/* Meta Scopes */ +/* +meta.block +meta.block.attribute +meta.block.begin +meta.block.create-table +meta.block.css +meta.block.curly +meta.block.directives +meta.block.percentagestring.unescapedbracketrecursive.angle +meta.block.percentagestring.unescapedbracketrecursive.bracket +meta.block.percentagestring.unescapedbracketrecursive.curly +meta.block.percentagestring.unescapedbracketrecursive.parentheses +meta.block.square +meta.block.tag.php +meta.block.tag.php.no-content +meta.important.memorymanagement +meta.invalid.ampersand +meta.invalid.sgmlcomment +meta.link.email +meta.link.portion +meta.state +meta.tag.erbstart +meta.tag.preprocessor +*/ + +meta.block.interpolation { + color:#3e5f5e; +} + +meta.default { + background-color:#ffffff; + color:#000000; + font-weight : normal; + font-style : normal; +} + +meta.highlight.currentline { + background-color:#fbffb2; +} + +meta.important { + color:#ff1800; +} + +meta.invalid { + color:#ff0000; + font-weight:bold; +} + +meta.invisible.character { + color:#aaaaaa; + font-style:normal; + font-weight:normal; +} + +meta.link { + color:#0000ff; + font-underline:underline; +} + +meta.preprocessor.nowiki { + color : #4b4b4b; + font-weight : bold; +} + +/* Strings */ +/* +string.angle +string.array.percent +string.array.percent.angle +string.array.percent.bracket +string.array.percent.curly +string.array.percent.parentheses +string.double +string.double.openstep +string.exec.backtick +string.exec.percentx +string.exec.percentx.angle +string.exec.percentx.bracket +string.exec.percentx.curly +string.exec.percentx.parentheses +string.here-doc +string.here-doc.intended +string.percentage +string.percentage.angle +string.percentage.bracket +string.percentage.curly +string.percentage.parentheses +string.regex.percentage +string.regex.percentage.angle +string.regex.percentage.bracket +string.regex.percentage.curly +string.regex.percentage.parentheses +string.single +string.single.backtick +string.symbol.percent +string.symbol.percent.angle +string.symbol.percent.bracket +string.symbol.percent.curly +string.symbol.percent.parentheses +*/ + +string { + color:#f4181b; +} + +string.exec { + color:#bd1814; +} + +string.regex { + color:#c607d3; +} + +string.symbol { + color:#d6771c; +} + +/* Structured */ +/* +structured.comment +structured.quote +structured.anchor +structured.math +*/ + +structured.bold { + font-weight : bold; + font-style : normal; +} + +structured.changes.added { + color : #549a18; + font-weight : normal; + font-style : italic; +} + +structured.changes.deleted { + color : #b82314; + font-weight : normal; + font-style : italic; +} + +structured.changes.modified { + color : #a57e24; + font-weight : normal; + font-style : italic; +} + +structured.changes.replaced { + color : #c16024; + font-weight : bold; + font-style : italic; +} + +structured.changes.revision { + color : #001bbb; + font-weight : bold; + font-style : normal; +} + +structured.changes.user { + color : #1444b4; + font-weight : bold; + font-style : normal; +} + +structured.emphasis { + color : #000; + font-weight : bold; + font-style : italic; +} + +structured.event { + color : #333; + font-style : italic; +} + +structured.footnote { + color : #236e25; +} + +structured.heading { + color : #8f6d00; + font-weight : bold; + font-style : normal; +} + +structured.heading.1 { + color : #881350; + font-weight : bold; +} + +structured.heading.2 { + color : #970058; + font-weight : bold; +} + +structured.heading.3 { + color : #a70062; + font-weight : bold; +} + +structured.heading.4 { + color : #b20068; + font-weight : bold; +} + +structured.heading.5 { + color : #be006f; + font-weight : bold; +} + +structured.italic { + font-weight : normal; + font-style : italic; +} + +structured.italicbold { + font-weight : bold; + font-style : italic; +} + +structured.list.numbered { + color : #7a4022; +} + +structured.list.unnumbered { + color : #683821; +} + +structured.quote.even { + color : #1b5414; +} + +structured.quote.odd { + color : #7b1e20; +} + +structured.raw.code { + color : #4b4b4b; +} + +structured.raw.indented { + color : #4b4b4b; +} + +structured.reference { + color : #222255; +} + +structured.section { + color : #a61a1a; + font-weight : bold; +} + +structured.separator.horizontal { + color : #555555; + font-weight : bold; + font-style : normal; +} + +structured.separator.vertical { + color : #696969; + font-weight : normal; + font-style : normal; +} + +structured.tool-tip { + color : #076e09; + font-weight : normal; + font-style : italic; +} + +structured.variable { + color : #881280; +} + +/* Styles */ +/* +style.comment +style.comment.block.documentation +style.property.name +style.value +style.value.color.rgb-value +style.value.string.double +style.value.string.single +*/ + +style.at-rule { + color:#6a3820; + font-style:italic; + font-weight:bold; +} + +style.comment.block { + color:#216a26; +} + +style.property.name { + color:#88134f; +} + +style.value.color { + color:#791314; +} + +style.value.keyword { + color:#9e4403; +} + +style.value.numeric { + color:#0000ff; +} + +style.value.string { + color:#791314; +} + +/* Language Support */ +/* +support.accessor +support.class +support.class.standard +support.class.standard.cocoa +support.constant.cocoa +support.type.cocoa +*/ + +support { + color:#5b2a96; +} + +support.constant { + font-style:italic; +} + +support.type { + font-style:italic; +} diff --git a/Modes/PostScript.seemode/Contents/Resources/RegexSymbols.xml b/Modes/PostScript.seemode/Contents/Resources/RegexSymbols.xml new file mode 100644 index 000000000..3e22c339a --- /dev/null +++ b/Modes/PostScript.seemode/Contents/Resources/RegexSymbols.xml @@ -0,0 +1,30 @@ + + + + + + { + } + + + + .*?/([A-Za-z0-9_!=]+)\s*\{ + + + + (% TODO:.*) + + % TODO:(.*) + \1 + + + + + (% FIXME:.*) + + % FIXME:(.*) + \1 + + + + diff --git a/Modes/PostScript.seemode/Contents/Resources/SyntaxDefinition.xml b/Modes/PostScript.seemode/Contents/Resources/SyntaxDefinition.xml new file mode 100644 index 000000000..341b410d6 --- /dev/null +++ b/Modes/PostScript.seemode/Contents/Resources/SyntaxDefinition.xml @@ -0,0 +1,449 @@ + + + + PostScript + + + + + + + + + + (?<![\w\d_])((?:[+-]?(?:(?:[0-9]+\.[0-9]*)|(?:\.[0-9]+))(?:[eE][+\-]?[0-9]+)?[fFlL]?)|(?:(?:(?:[1-9][0-9]*)|0[0-7]*|(?:0[xX][0-9a-fA-F]+))(?:(?:[uU][lL]?)|(?:[lL][uU]?))?))(?![\w\d_]) + + + + + % + [\n\r] + + + + + + \( + \) + + + + + + + + (/[A-Za-z0-9_!=\-]+)\s* + + + + {} + } + + + + + + = + == + flushpage= + + + + + + << + >> + + exec + if + ifelse + repeat + for + forall + loop + exit + stop + put + putinterval + def + + + + + abs + add + aload + anchorsearch + and + arc + arcn + arct + arcto + array + ashow + astore + atan + awidthshow + begin + bind + bitshift + bytesavailable + cachestatus + ceiling + charpath + clear + cleartomark + cleardictstack + clip + clippath + closefile + closepath + colorimage + concat + concatmatrix + condition + configurationerror + copy + copypage + cos + count + countdictstack + countexecstack + counttomark + cshow + currentblackgeneration + currentcacheparams + currentcmykcolor + currentcolor + currentcolorrendering + currentcolorscreen + currentcolorspace + currentcolortransfer + currentcontext + currentdash + currentdevparams + currentdict + currentfile + currentflat + currentfont + currentglobal + currentgray + currentgstate + currenthalftone + currenthalftonephase + currenthsbcolor + currentlinecap + currentlinejoin + currentlinewidth + currentmatrix + currentmiterlimit + currentobjectformat + currentpacking + currentpagedevice + currentpoint + currentrgbcolor + currentscreen + currentshared + currentstrokeadjust + currentsystemparams + currenttransfer + currentundercolorremoval + currentuserparams + curveto + cvi + cvlit + cvn + cvr + cvrs + cvs + cvx + defaultmatrix + definefont + defineresource + defineusername + defineuserobject + deletefile + detach + deviceinfo + dict + dictfull + dictstack + dictstackoverflow + dictstackunderflow + div + dtransform + dup + echo + eexec + end + eoclip + eofill + eoviewclip + eq + erasepage + errordict + exch + execform + execstack + execstackoverflow + execuserobject + executeonly + executive + exp + false + file + filenameforall + fileposition + fill + filter + findencoding + findfont + findresource + flattenpath + floor + flush + flushfile + flushpage + FontDirectory + fork + ge + get + getinterval + globaldict + GlobalFontDirectory + glyphshow + grestore + grestoreall + gsave + gstate + gt + handleerror + identmatrix + idiv + idtransform + image + imagemask + index + ineofill + infill + initclip + initgraphics + initmatrix + initviewclip + instroke + internaldict + interrupt + inueofill + inufill + inustroke + invalidaccess + invalidcontext + invalidexit + invalidfileaccess + invalidfont + invalidid + invalidrestore + invertmatrix + ioerror + ISOLatin1Encoding + itransform + join + kshow + known + languagelevel + le + length + limitcheck + lineto + ln + load + lock + log + lt + makefont + makepattern + mark + matrix + maxlength + mod + monitor + moveto + mul + ne + neg + newpath + noaccess + nocurrentpoint + not + notify + null + nulldevice + or + packedarray + pathbbox + pathforall + pop + print + printobject + product + prompt + pstack + quit + rand + rangecheck + rcurveto + read + readhexstring + readline + readonly + readstring + realtime + rectclip + rectfill + rectstroke + rectviewclip + renamefile + resetfile + resourceforall + resourcestatus + restore + reversepath + revision + rlineto + rmoveto + roll + rootfont + rotate + round + rrand + run + save + scale + scalefont + scheck + search + selectfont + serialnumber + setbbox + setblackgeneration + setcachedevice + setcachedevice2 + setcachelimit + setcacheparams + setcharwidth + setcmykcolor + setcolor + setcolorrendering + setcolorscreen + setcolorspace + setcolortransfer + setdash + setdevparams + setfileposition + setflat + setfont + setglobal + setgray + setgstate + sethalftone + sethalftonephase + sethsbcolor + setlinecap + setlinejoin + setlinewidth + setmatrix + setmiterlimit + setobjectformat + setoverprint + setpacking + setpagedevice + setpattern + setrgbcolor + setscreen + setshared + setstrokeadjust + setsystemparams + settransfer + setucacheparams + setundercolorremoval + setuserparams + setvmthreshold + shareddict + show + showpage + sin + sqrt + srand + stack + stackoverflow + stackunderflow + StandardEncoding + start + startjob + status + statusdict + stopped + store + string + stringwidth + stroke + strokepath + sub + syntaxerror + systemdict + timeout + transform + translate + true + truncate + type + typecheck + token + uappend + ucache + ucachestatus + ueofill + ufill + undef + undefined + undefinedfilename + undefineresource + undefinedresult + undefinefont + undefineresource + undefinedresource + undefineuserobject + unmatchedmark + unregistered + upath + userdict + UserObjects + usertime + ustroke + ustrokepath + version + viewclip + viewclippath + VMerror + vmreclaim + vmstatus + wait + wcheck + where + widthshow + write + writehexstring + writeobject + writestring + wtranslation + xcheck + xor + xshow + xyshow + yield + yshow + + + + + diff --git a/Modes/PostScript.seemode/Contents/Resources/readme.txt b/Modes/PostScript.seemode/Contents/Resources/readme.txt new file mode 100644 index 000000000..da45dbe7a --- /dev/null +++ b/Modes/PostScript.seemode/Contents/Resources/readme.txt @@ -0,0 +1,22 @@ +PostScript mode for SubEthaEdit +------------------------------- + +To install the mode, copy: + + PostScript.seemode + +into + + ~/Library/Containers/SubEthaEdit/Data/Library/Application\ Support/de.codingmonkeys.SubEthaEdit.Mac/Modes/ + +To install the optional stylesheet, copy: + + PostScript.sss + +into + + ~/Library/Containers/SubEthaEdit/Data/Library/Application\ Support/de.codingmonkeys.SubEthaEdit.Mac/Styles/ + +Nicolas Seriot +http://seriot.ch +February 2025 diff --git a/Modes/README.md b/Modes/README.md index 1d42c3ad8..121336b2d 100644 --- a/Modes/README.md +++ b/Modes/README.md @@ -7,6 +7,7 @@ Language | Version | Update Date | Comment | Author Dtrace ([zip](../../../raw/master/Modes/zipped/Dtrace.seemode.zip)) | 1.0.1 | 2014-06-24 | Mode for DTrace scripts | [tbartelmess](https://github.com/tbartelmess) SQL ([zip](../../../raw/master/Modes/zipped/SQL.seemode.zip)) | 4.0 | 2014-07-09 | SQL Mode - ported from built-in SEE 3 Mode | [ellduin](https://github.com/ellduin) Thrift ([zip](../../../raw/master/Modes/zipped/Thrift.seemode.zip)) | 1.0 | 2014-06-22 | Mode for Apache thrift | [tbartelmess](https://github.com/tbartelmess) + PostScript ([zip](../../../raw/master/Modes/zipped/PostScript.seemode.zip)) | 1.0 | 2025-04-05 | Mode for PostScript | [nst](https://github.com/nst) # SubEthaEdit 4 Modes (probably outdated) diff --git a/Modes/zipped/PostScript.seemode.zip b/Modes/zipped/PostScript.seemode.zip new file mode 100644 index 0000000000000000000000000000000000000000..10d716ef5833dc23daeee075706d9a9a8331ba7b GIT binary patch literal 15945 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