[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kwrite-devel
Subject:    Help with creating Syntax Highlighting File for KVIrc script
From:       Omega Weapon <omegaphil () gmail ! com>
Date:       2010-08-27 14:34:44
Message-ID: 4C77CD04.40908 () gmail ! com
[Download RAW message or body]

Hello,

I am currently trying to make a Syntax Highlighting File for KVIrc 
script (http://www.kvirc.net/), so that I can develop scripts in a 
functional editor outside of the program. I have read the 'Writing a 
Syntax Highlighting File' documentation 
(http://kate-editor.org/2005/03/24/writing-a-syntax-highlighting-file/), 
however I am obviously not clever enough as I haven't been able to 
understand it to the extent that I can match all the text I want and not 
use 'deprecated syntax'.

I have attached the current state of the file (kvircscript.xml) and an 
example script thats linked by the KVIrc site (install_ita.kvs) - I'm 
aiming to recreate KVIrc's syntax highlighting, see 
http://yfrog.com/06kvircsyntaxhighlightingp for the same script in the 
Alias Editor dialog.

I'm at a loss with what to do with it now - it works just well enough to 
be usable for me, however I do want to get it working properly so that I 
can contribute it to KVIrc as a tool (presumably its too fringe to be of 
interest to Kate directly).


My problems:

1. 'deprecated syntax':

/usr/share/kde4/apps/katepart/syntax/kvircscript.xml:Deprecated syntax. 
Context Operator not addressed by a symbolic name
/usr/share/kde4/apps/katepart/syntax/kvircscript.xml:Deprecated syntax. 
Context Delimiter not addressed by a symbolic name
/usr/share/kde4/apps/katepart/syntax/kvircscript.xml:Deprecated syntax. 
Context Operator not addressed by a symbolic name
/usr/share/kde4/apps/katepart/syntax/kvircscript.xml:Deprecated syntax. 
Context Punctuation not addressed by a symbolic name
/usr/share/kde4/apps/katepart/syntax/kvircscript.xml:Deprecated syntax. 
Context Operator not addressed by a symbolic name
/usr/share/kde4/apps/katepart/syntax/kvircscript.xml:Deprecated syntax. 
Context Delimiter not addressed by a symbolic name
/usr/share/kde4/apps/katepart/syntax/kvircscript.xml:Deprecated syntax. 
Context Operator not addressed by a symbolic name
/usr/share/kde4/apps/katepart/syntax/kvircscript.xml:Deprecated syntax. 
Context Punctuation not addressed by a symbolic name


When you ignore this and let the script file be parsed:

2. The '=' character is classed as an 'Operator', however where the 
character is used and surrounded by other characters the parser fails to 
pick it up. I have created a pink catch-all itemData node to show 
everything the parser thinks it can't match (note that I havent told the 
parser to use this itemData anywhere, I eventually discovered it uses 
the first node when it decides it can't match anything).

3. '(' and ')' are classed as 'Punctuation', however their detection 
seems to fail in the same way as 2.

4. ';' is classed as 'Delimiter', and this is generally handled 
correctly however I can see cases near the end of the example file where 
';' remains undetected.


Hopefully these problems are rooted in a central concept I'm not 
getting, and thus easy to solve. This is my first experience with Kate 
(and any form of syntax highlighting definition), and so far I'm really 
looking forward to using the editor (I was very happy to see code 
folding come for free with the highlighting, and it looks like I can use 
bookmarks to quickly navigate between functions, which should mean I 
don't need the usual drop-down function list in an IDE).

Thankyou for any help (I am also idling in #kate as OmegaPhil).

["install_ita.kvs" (text/x-kvs)]

	%Instalscript=$file.localdir
	file.mkdir -q %Instalscript/princodir;
	file.copy -o $file.extractPath($0)/install_ita.kvs \
$file.localdir(princodir/install_ita.kvs)  file.copy -o \
$file.extractPath($0)/Prs_eventi_ita.kvs $file.localdir(princodir/Prs_eventi_ita.kvs) \
file.copy -o $file.extractPath($0)/Prs_alias_ita.kvs \
$file.localdir(princodir/Prs_alias_ita.kvs)  file.copy -o \
$file.extractPath($0)/Prs_menu_ita.kvs $file.localdir(princodir/Prs_menu_ita.kvs)  \
#file.copy -o $file.extractPath($0)/Prs_stable_ita.kvs \
$file.localdir(princodir/Prs_stable_ita.kvs) #copiamo le icone di bellaciao e tutte \
le sue diavolerie

	run /bin/sh -c "cp -rf $file.extractPath($0)/icons/ $file.localdir(princodir/)"

echo  COPIO I FILES E LE ICONE NELLA DIR PRINCODIR

	%Princonfig=%Instalscript/princodir/princonfig.kvc


	#parse $file.localdir(princodir/Prs_stable_ita.kvs)
	parse $file.localdir(princodir/Prs_eventi_ita.kvs)
	parse $file.localdir(princodir/Prs_alias_ita.kvs)
	parse $file.localdir(princodir/Prs_menu_ita.kvs)


%Princonfig=$file.localdir(princodir/princonfig.kvc)
if($file.exists(%Princonfig)=="1"){
	echo  IL FILE DI CONFIGURAZIONE E' GIA' PRESENTE ...
	echo   QUESTO E' UN UPGRADE DELLO SCRIPT .... GRAZIE !!
	halt;
	}
	else{
#aggiungo qui il disabilitare gli eventi di controllo e la inzializzazione
#delle variabili di attivazione e spegnimento

	eventctl -d onchannelmessage princoflood;
		echo  Disabilita princoflood
	%OnOfffloodcheck = 0

	eventctl -d onirc autojoinevent;
		echo  Disabilita autojoin
	%OnOffautojoinidentifycheck=0

	eventctl -d onchannelmessage capscontrol;
		echo  Disabilita capscontrol
	%OnOffcapscheck=0   

	eventctl -d onirc nickidentifyonconnect;
		echo  Disabilita identify on connected
	%OnOffnickidentifycheck=0

#valori delle variabili di controllo di default...
#secondo il punto di vista degli autori.

%Princoversione=  Princoscript-0.8.1 for Kvirc3 Linux
%Floodtemp=6
%Capsvaloreminimo=15;
%Capsvar=350;
%Righe2=5;	
%Aconf=$config.open(%Princonfig);
config.setsection %Aconf floodcontrol;
config.write %Aconf OnOfffloodcheck %OnOfffloodcheck;
config.write %Aconf OnOffautojoinidentifycheck %OnOffautojoinidentifycheck;
config.write %Aconf OnOffnickidentifycheck %OnOffnickidentifycheck;
config.write %Aconf OnOffcapscheck %OnOffcapscheck;
config.write %Aconf Capsvar %Capsvar;
config.write %Aconf Capsvaloreminimo %Capsvaloreminimo;
config.write %Aconf Righe2 %Righe2;
config.write %Aconf Floodtemp %Floodtemp;
config.write %Aconf Princoversione %Princoversione
config.write %Aconf Canale1 %Canale1;
config.write %Aconf Canale2 %Canale2;
config.write %Aconf Canale3 %Canale3;
config.write %Aconf Canale4 %Canale4;
config.write %Aconf Canale5 %Canale5;
config.write %Aconf Canale6 %Canale6;

config.close
 %Aconf;
echo  LA CONFIGURAZIONE DEI FILES  E DELLE VARIABILI E' PRONTA!
echo E' ANDATO TUTTO BENE,
echo ADESSO RIAVVIA KVIRC ..
echo TI CONSIGLIO DI VERIFICARE CHE  LE ICONE SIANO PRESENTI NEI MENU' E CHE  IN \
PRINCOSETUP TUTTO VADA BENE ....

}


["kvircscript.xml" (text/xml)]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language>
<!--
  KVIrc script test syntax file
-->
<language name="KVIrc Script" version="2.06" kateversion="2.4" section="Scripts" \
extensions="*.kvs" mimetype="application/x-kvircscript;text/x-kvircscript" \
author="Omega Weapon" license="GPLv3+">  <highlighting>
	
		<!-- Lists - arbitrary lists of separate groups of text to format in a particular \
way -->  <list name="Keywords">
		    <item>about.kvirc</item>
		    <item>action.create</item>
		    <item>action.destroy</item>
		    <item>action.disable</item>
		    <item>actioneditor.open</item>
		    <item>action.enable</item>
		    <item>action.list</item>
		    <item>action.trigger</item>
		    <item>addon.configure</item>
		    <item>addon.dialog</item>
		    <item>addon.help</item>
		    <item>addon.list</item>
		    <item>addon.register</item>
		    <item>addon.setconfigurecallback</item>
		    <item>addon.sethelpcallback</item>
		    <item>addon.uninstall</item>
		    <item>admin</item>
		    <item>aliaseditor.open</item>
		    <item>alias</item>
		    <item>avatar.notify</item>
		    <item>avatar.query</item>
		    <item>avatar.set</item>
		    <item>avatar.unset</item>
		    <item>away</item>
		    <item>awhois</item>
		    <item>back</item>
		    <item>ban</item>
		    <item>beep</item>
		    <item>break</item>
		    <item>buttonctl</item>
		    <item>button</item>
		    <item>channelsjoin.open</item>
		    <item>class</item>
		    <item>clock.add</item>
		    <item>codepage</item>
		    <item>codetester.open</item>
		    <item>config.clear</item>
		    <item>config.clearsection</item>
		    <item>config.close</item>
		    <item>config.flush</item>
		    <item>config.setsection</item>
		    <item>config.write</item>
		    <item>ctcp</item>
		    <item>dcc.abort</item>
		    <item>dcc.chat</item>
		    <item>dcc.get</item>
		    <item>dcc.recv</item>
		    <item>dcc.rsend</item>
		    <item>dcc.send</item>
		    <item>dcc.setBandwidthLimit</item>
		    <item>dcc.voice</item>
		    <item>debug</item>
		    <item>defpopup</item>
		    <item>delete</item>
		    <item>delpopupitem</item>
		    <item>deop</item>
		    <item>destroy</item>
		    <item>devoice</item>
		    <item>dialog.file</item>
		    <item>dialog.image</item>
		    <item>dialog.message</item>
		    <item>dialog.textinput</item>
		    <item>die</item>
		    <item>dockwidget.hide</item>
		    <item>dockwidget.hide</item>
		    <item>dockwidget.hidewindow</item>
		    <item>dockwidget.hidewindow</item>
		    <item>dockwidget.show</item>
		    <item>dockwidget.show</item>
		    <item>do</item>
		    <item>echo</item>
		    <item>echoprivmsg</item>
		    <item>error</item>
		    <item>eval</item>
		    <item>eventctl</item>
		    <item>eventeditor.open</item>
		    <item>event</item>
		    <item>exec</item>
		    <item>exit</item>
		    <item>file.addimagepath</item>
		    <item>file.copy</item>
		    <item>file.delimagepath</item>
		    <item>file.mkdir</item>
		    <item>file.remove</item>
		    <item>file.rename</item>
		    <item>file.rmdir</item>
		    <item>filetransferwindow.open</item>
		    <item>file.write</item>
		    <item>file.writeLines</item>
		    <item>foreach</item>
		    <item>for</item>
		    <item>function</item>
		    <item>global</item>
		    <item>halt</item>
		    <item>help</item>
		    <item>help.open</item>
		    <item>help.search</item>
		    <item>host</item>
		    <item>host</item>
		    <item>http.asyncGet</item>
		    <item>http.get</item>
		    <item>ident.start</item>
		    <item>ident.stop</item>
		    <item>if</item>
		    <item>include</item>
		    <item>info</item>
		    <item>invite</item>
		    <item>iograph.add</item>
		    <item>join</item>
		    <item>kick</item>
		    <item>killtimer</item>
		    <item>leave</item>
		    <item>links</item>
		    <item>links.open</item>
		    <item>list</item>
		    <item>list.open</item>
		    <item>log.flush</item>
		    <item>log.start</item>
		    <item>log.stop</item>
		    <item>logview.open</item>
		    <item>lusers</item>
		    <item>mediaplayer.detect</item>
		    <item>mediaplayer.hide</item>
		    <item>mediaplayer.jumpTo</item>
		    <item>mediaplayer.minimize</item>
		    <item>mediaplayer.mute</item>
		    <item>mediaplayer.next</item>
		    <item>mediaplayer.pause</item>
		    <item>mediaplayer.play</item>
		    <item>mediaplayer.playMrl</item>
		    <item>mediaplayer.prev</item>
		    <item>mediaplayer.quit</item>
		    <item>mediaplayer.setEqData</item>
		    <item>mediaplayer.setPlayer</item>
		    <item>mediaplayer.setPlayListPos</item>
		    <item>$mediaplayer.setRepeat</item>
		    <item>$mediaplayer.setShuffle</item>
		    <item>mediaplayer.setVol</item>
		    <item>mediaplayer.show</item>
		    <item>mediaplayer.stop</item>
		    <item>me</item>
		    <item>[-m]</item>
		    <item>mode</item>
		    <item>motd</item>
		    <item>msg</item>
		    <item>my.startIdleTimer</item>
		    <item>my.stopIdleTimer</item>
		    <item>nick</item>
		    <item>notice</item>
		    <item>notifier.hide</item>
		    <item>notifier.message</item>
		    <item>notifier.show</item>
		    <item>objects.bitblt</item>
		    <item>objects.blend</item>
		    <item>objects.classes</item>
		    <item>objects.clear</item>
		    <item>objects.connect</item>
		    <item>objects.disconnect</item>
		    <item>objects.exists</item>
		    <item>objects.instances</item>
		    <item>objects.killclass</item>
		    <item>objects.variables</item>
		    <item>openurl</item>
		    <item>oper</item>
		    <item>op</item>
		    <item>option</item>
		    <item>options.dialog</item>
		    <item>options.edit</item>
		    <item>options.pages</item>
		    <item>options.save</item>
		    <item>parse</item>
		    <item>part</item>
		    <item>pass</item>
		    <item>perl.begin</item>
		    <item>perl.destroy</item>
		    <item>perl.end</item>
		    <item>play</item>
		    <item>popupeditor.open</item>
		    <item>popup</item>
		    <item>privateimpl</item>
		    <item>privmsg</item>
		    <item>query</item>
		    <item>quit</item>
		    <item>quote</item>
		    <item>raise</item>
		    <item>raweditor.open</item>
		    <item>raw</item>
		    <item>rebind:</item>
		    <item>regchan.add</item>
		    <item>regchan.remove</item>
		    <item>regchan.setproperty</item>
		    <item>regchan.showlist</item>
		    <item>reguser.add</item>
		    <item>reguser.addmask</item>
		    <item>reguser.delmask</item>
		    <item>reguser.edit</item>
		    <item>reguser.remove</item>
		    <item>reguser.setIgnoreEnabled</item>
		    <item>reguser.setIgnoreFlags</item>
		    <item>reguser.setproperty</item>
		    <item>reguser.showlist</item>
		    <item>reguser.wizard</item>
		    <item>return</item>
		    <item>run</item>
		    <item>say</item>
		    <item>server</item>
		    <item>service</item>
		    <item>setmenu</item>
		    <item>setreturn</item>
		    <item>sharedfile.add</item>
		    <item>sharedfile.clear</item>
		    <item>sharedfile.list</item>
		    <item>sharedfile.remove</item>
		    <item>sharedfileswindow.open</item>
		    <item>snd.mute</item>
		    <item>snd.play</item>
		    <item>snd.unmute</item>
		    <item>sockets</item>
		    <item>socketspy.open</item>
		    <item>spaste.clipboard</item>
		    <item>spaste.file</item>
		    <item>spaste.list</item>
		    <item>spaste.setdelay</item>
		    <item>spaste.stop</item>
		    <item>squery</item>
		    <item>squit</item>
		    <item>srand</item>
		    <item>stats</item>
		    <item>switch</item>
		    <item>system.setClipboard</item>
		    <item>system.setenv</item>
		    <item>system.setSelection</item>
		    <item>system.toClipboard</item>
		    <item>term.open</item>
		    <item>texticons.set</item>
		    <item>theme.dialog</item>
		    <item>theme.install</item>
		    <item>theme.screenshot</item>
		    <item>time</item>
		    <item>timer</item>
		    <item>tip.open</item>
		    <item>tmphighlight.add</item>
		    <item>tmphighlight.remove</item>
		    <item>toolbar.additem</item>
		    <item>toolbar.clear</item>
		    <item>toolbar.create</item>
		    <item>toolbar.destroy</item>
		    <item>toolbareditor.open</item>
		    <item>toolbar.hide</item>
		    <item>toolbar.remove</item>
		    <item>toolbar.show</item>
		    <item>topic</item>
		    <item>torrent.announce</item>
		    <item>torrent.setClient</item>
		    <item>torrent.setFilePriority</item>
		    <item>torrent.setMaxDownloadSpeed</item>
		    <item>torrent.setMaxUploadSpeed</item>
		    <item>torrent.startAll</item>
		    <item>torrent.start</item>
		    <item>torrent.stopAll</item>
		    <item>torrent.stop</item>
		    <item>trace</item>
		    <item>trload</item>
		    <item>trunload</item>
		    <item>unban</item>
		    <item>unset</item>
		    <item>url.config</item>
		    <item>url.list</item>
		    <item>version</item>
		    <item>voice</item>
		    <item>warning</item>
		    <item>while</item>
		    <item>whois</item>
		    <item>who</item>
		    <item>whowas</item>
		    <item>window.activate</item>
		    <item>window.clearOutput</item>
		    <item>window.close</item>
		    <item>window.demandAttention</item>
		    <item>window.dock</item>
		    <item>window.insertInInputText</item>
		    <item>window.listtypes</item>
		    <item>window.maximize</item>
		    <item>window.minimize</item>
		    <item>window.restore</item>
		    <item>window.setBackground</item>
		    <item>window.setCaption</item>
		    <item>window.setCryptEngine</item>
		    <item>window.setInputText</item>
		    <item>window.undock</item>
		</list>
		
		<contexts>
		
			<context name="Normal" fallthrough="1" fallthroughContext="Normal Text" \
lineEndContext="#stay">

				<keyword attribute="Keywords" String="Keywords" context="#pop"/>
				
				<DetectChar char="#" context="Single line comment" attribute="Comment"/>
				<!--<DetectChar char="#" attribute="Comment" context="#stay"/>-->
				<!--Doesn't work?? <StringDetect attribute="Comment" string="//" context="Single \
line comment"/>-->  <Detect2Chars char="/" char1="/" attribute="Comment" \
context="Single line comment"/>  <Detect2Chars char="/" char1="*" attribute="Comment" \
context="Multi line comment"/>  
				<DetectChar char="{" context="braced" beginRegion="brace" attribute="Brace" />
				<DetectChar char="}" context="#pop" endRegion="brace" attribute="Brace" />
      
				<DetectChar char="%" context="Variable" attribute="Variable" />
				
				<DetectChar char="$" context="Function" attribute="Function" />
				
				<AnyChar String="+*/\|=\!&lt;&gt;!^&amp;~-" context="Operator" \
attribute="Operator" />  
				<DetectChar char=";" context="Delimiter" attribute="Delimiter" />
				
				<AnyChar String="()" context="Punctuation" attribute="Punctuation" />				
			</context>

			<context name="Single line comment" attribute="Comment" lineEndContext="#pop" />
			<context name="Multi line comment" attribute="Comment" lineEndContext="#stay">
				<Detect2Chars attribute="Comment" char="*" char1="/" context="#pop"/>
			</context>

			<context name="Variable" attribute="Variable" lineEndContext="#pop">
				<RegExpr String="[^A-za-z\.0-9]" context="#pop"/>
			</context>

			<context name="braced" lineEndContext="#stay" noIndentationBasedFolding="true">
			
				<!-- Initiate syntax parsing on this new braced block -->
				<IncludeRules context="Normal" />
			</context>

			<context name="Function" attribute="Function" lineEndContext="#pop">
				<RegExpr String="[^A-za-z\.0-9]" context="#popNormal"/>
			</context>

		</contexts>
		<itemDatas>
		    
			<!-- This one should never be hit, but is when the parser decides it cant match \
anything -->  <itemData name="Unknown" color="#FF00FF" spellChecking="false"/>		
			<itemData name="Variable" color="#C8C8C8"/>		
			<itemData name="Normal Text" color="#AA5500" spellChecking="false"/>			
			<itemData name="Comment" color="#007800"/>
			<itemData name="Brace" color="#FF0000"/>	
			<itemData name="Operator" color="#B4B400"/>
			<itemData name="Punctuation" color="#B4B400"/>
			<itemData name="Delimiter" color="#787896"/>
			<itemData name="Keywords" color="#787896"/>
			<itemData name="Function" color="#FFAA00"/>			
		</itemDatas>
	</highlighting>
	<general>
		<emptyLines>
			<emptyLine regexpr="\s+" casesensitive="false"/>
			<emptyLine regexpr="\s*#.*$" casesensitive="false"/>
		</emptyLines>
		<comments>
			<!-- This node instructs the editor as to what a comment is when the user uses the \
comment shortcut -->  <comment name="singleLine" start="#" \
position="afterwhitespace"/>  </comments>
		<keywords casesensitive="0" weakDeliminator="." />
		<folding indentationsensitive="false" />
	</general>
</language>



_______________________________________________
KWrite-Devel mailing list
KWrite-Devel@kde.org
https://mail.kde.org/mailman/listinfo/kwrite-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic