[TxMt] properties parser?

Xavier Noria fxn at hashref.com
Wed Jan 5 06:46:24 UTC 2005


On Jan 4, 2005, at 10:04 PM, Allan Odgaard wrote:

> On Jan 4, 2005, at 21:39, Xavier Noria wrote:
>
>>> Which language do you want to write it in?
>> In Perl or Python preferably. The XML solution via plutil looks like 
>> the easiest, but for curiosity how would you deal with the structure 
>> in memory without an intermediate XML file? If there was something in 
>> Cocoa to deal directly with that format maybe I could play a bit with 
>> PyObjC maybe.
>
> There is, NSDictionary (which is a hash/associative array) can load 
> its values using the dictionaryWithContentsOfFile: selector/method.
>
> So in Objective-C that would be:
>  id dict = [NSDictionary dictionaryWithContentsOfFile:syntaxFile];
>
> And now dict is an associative array representing the contents of the 
> syntaxFile. E.g. you'd access patterns, which is an array and each 
> element is again a dictionary (which may have patterns again)...

Magnific, with that class this is far easier than I expected.

I have not generalised the script yet, but since it is gonna be 
something very targeted to what I want to be useful to others anyway, 
here it goes the starting point which is really simple if you know just 
a bit of Python. After installing PyObjC[*] this properly modifies a 
property list (I did the trials with the one for Perl):

<mockup>

#!/usr/bin/python

from Foundation import NSMutableDictionary

fg = "foregroundColor"

perl = u"/path/to/your/Perl.tmbundle/Syntaxes/Perl.plist"
plist = NSMutableDictionary.dictionaryWithContentsOfFile_(perl)
for p in plist['patterns']:
     name = p['name']
     if name == "Control Structures":
         del p['fontStyle']
         p[fg] = "#881950"
     if name == "Reserved Words":
         del p['fontStyle']
         p[fg] = "#000000"
     # ...

plist.writeToFile_atomically_(perl, 1)

</mockup>

Really, that's all.

That needs you to inspect the .plist for the names you are interested 
in. Just printing the plist variable after its creation works like a 
charm and formats the structure for easy reading:

     print plist

In fact, as you see, you have there a clean interface to redefine the 
entire .plist as you wish.

For Perl there's CamelBones[**], which I have not tried yet but looks 
like the task would be as easy.

Great!

-- fxn

[*] http://pyobjc.sourceforge.net/
[**] http://camelbones.sourceforge.net/index.php




More information about the textmate mailing list