Här kommer en XML-XSLT nöt för syntax highlightingen för kod här på pellesoft. Hej, foldingen är: Hmm ja då blev det var lite jobbigare ;) Den fungerar prima , Kul att den fungerar och kan komma till användning. Hej , nu har jag kodatsönder din xslt lite :P en liten "feature request".. radnumrering skulle vara rätt trevligt/praktiskt att få med om det är möjligt. Hej, Ny version att testa Härligt att se er hjälpas åt - nu börjar det likna nåt! Keep up the good work... Ett önskemål från min sida är att det står vilket programmeringspråk som koden är skriven i när man postar... Bör inte vara så svårt att implementera då man skeriver <code språk> för att välja språk på sin kod.XML/XSLT Nöt
Pelle har tjatat på mig ett tag för att fixa html exporteringen av highlightad kod här.
men eftersom jag inte är världmästare på standardiserad html och javascript så har jag nu gjort en XML exporter för parsern istället.
Här är ett exempel på parsad kod i XML format.
http://www.compona.com/pellekod.xml
xml filen har följande taggar:
<root> - dokumentroot
<row> - tag för början av en rad
<ws length="3"> - whitespace tag , length attribet är antalet blanksteg
<word bold="true" italic="true" underline="true" backcolor="#ffffff" forecolor="#000000"> - ett ord
<childrows> - container för childrader , dvs rader som ska kollapsas om ägande rad foldas
(ni ser förhoppningsvis ungefär hur det är tänkt)
så uppgiften är , skriv en XSLT fil som transformerar XML dokumentet till HTML som :
* wordwrappar om en rad är bredare än sin container (tex en div med fast css bredd)
* är copypaste vänlig
* javascript för folding
alla färger och om text ska vara bold/italic/underlined och vad som kan foldas finns i xmlfilen.
[edit]
det borde gå att göra ganska kul saker , tex generera htmlkod där man får en javascript knapp som kopierar koden till clipboardet.
[/edit]
//Roger
Sv: XML/XSLT Nöt
Detta såg ut som en kul grej så jag skapade en liten XSLT som är testad i XMLSPY. (Resultatet blir HTML.) Vad jag inte fattade riktigt var "folding". Ska det vara typ som i VS med #region och kommer detta att komma med i XMLen någonstans?
Mvh
JohanSv: XML/XSLT Nöt
public void Blah
{ //folding <--
if (bla)
{ //<-- mer folding
}
}
för att lösa detta genererar jag två div'ar .
en div som spänner över alla rader fom { tom } och en div som bara innehåller "{...}"
om någon klickar på - så gömmer jag den första divven och visar den andra och kickar man på + så blir det tvärt om...
och det är därför man får med en extra rad med "{...}" om man copy pejstar härifrån..
så jag tänkte att om jag istället exporterar till xml , så kan ju ni som kan html och javascript på riktigt fixa den biten ;)
och då har jag exporterad med alla folding sektioner som < childrows > taggar i xml'en , så ni inte behöver göra annat än att spotta ut rätt html och javascript..
---
en tanke jag haft var att om det kanske går att efter själva snippeten med foldbar kod , så lägger man en knapp med "copy to clipboard" som kanske kan kopiera snippeten som ren text och inte som html med massa gegga i..
//Roger
Sv: XML/XSLT Nöt
Men jag har en version som du skulle kunna testa. Tyvärr är inte wordwrapp löst ännu men man slipper de extra {...} om man markerar och kopierar.
Det ska till 2 st bilder för att det ska fungera men det är lite svårt att klistra in dom här.
bild 1 namn: closed.gif ska visa "{...}"
Bild 2 namn: transp_pixel.gif en transparent pixel
<code>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:user="http://www.pellesoft.se" extension-element-prefixes="msxsl" exclude-result-prefixes="user">
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
<msxsl:script language="JScript" implements-prefix="user">
//**
//Create a string of spaces
function formatSpace(noOfSpaces)
{
var res = "";
for(i=0;i<noOfSpaces;i++)
{
res += "&nbsp;";
}
return res;
}
//**
//Get unique div neme
function getDivName()
{
return "div" + Math.floor(Math.random() * 99999);
}
</msxsl:script>
<xsl:template match="/root">
<script language="JavaScript">
/*
Client functions
*/
//**
//Create a string of spaces
function formatSpace(noOfSpaces)
{
var res = "";
for(i=0;i<noOfSpaces;i++)
{
res += "&nbsp;";
}
return res;
}
//**
//Open close div tags
function OpenClose(divId, noOfSpaces)
{
var oDiv;
var oSpan;
oDiv = document.all[divId]
oSpan= document.all['s' + divId];
if(oDiv)
{
if(oDiv.style.display=='none')
{
oDiv.style.display=''
oSpan.innerHTML= "";
}
else
{
oDiv.style.display='none'
oSpan.innerHTML= "<img onclick='OpenClose(" + "\"" + divId+ "\",\"" + noOfSpaces +"\"" + ")' src='PlusNoLines.gif'></img>" + formatSpace(noOfSpaces) + "<img src='closed.gif' ><br>";
}
}
}
</script>
<table style="background-color:#f5f5f5;width:100%;background-color:#FAFAFA;border: 1px solid #C0C0C0;font-family:Verdana, Lucida Console, Arial;">
<tr>
<td width="550" nowrap="1" class="Text">
<xsl:apply-templates select="/root/row"/>
</td>
</tr>
</table>
</xsl:template>
<!-- row template -->
<xsl:template match="row">
<xsl:variable name="divId">
<xsl:value-of select="user:getDivName()"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="./word = '{'">
<span>
<xsl:attribute name="id">s<xsl:value-of select="$divId"/></xsl:attribute>
</span>
<xsl:text disable-output-escaping="yes"><![CDATA[<div style="display=block" id="]]></xsl:text>
<xsl:value-of select="$divId"/>
<xsl:text disable-output-escaping="yes"><![CDATA[">]]></xsl:text>
<img src="minus.gif" align="top" border="0">
<xsl:attribute name="onclick">OpenClose('<xsl:value-of select="$divId"/>','<xsl:value-of select="string(ws[1]/@length)"/>')</xsl:attribute>
</img>
<xsl:apply-templates select="./*">
<xsl:with-param name="divId" select="$divId"/>
</xsl:apply-templates>
<xsl:choose>
<xsl:when test="./childrows">
<!-- do nothing -->
</xsl:when>
<xsl:otherwise>
<xsl:if test="./word != '}'">
<br/>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="./word = '}'">
<img src="L.gif" align="top" border="0"/>
<xsl:apply-templates select="./*">
<xsl:with-param name="divId" select="$divId"/>
</xsl:apply-templates>
<xsl:text disable-output-escaping="yes"><![CDATA[</div>]]></xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="preceding-sibling::*[word = '{']">
<img src="I.gif" border="0" align="top"/>
</xsl:when>
<xsl:when test="name(./..) = 'childrows'">
<img src="I.gif" border="0" align="top"/>
</xsl:when>
<xsl:otherwise>
<img src="transp_pixel.gif" border="0" width="11" height="16" align="top"/>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates select="./*">
<xsl:with-param name="divId" select="$divId"/>
</xsl:apply-templates>
<br/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- word template -->
<xsl:template match="word">
<xsl:param name="divId"/>
<xsl:if test="position() != 0">
<span>
<xsl:value-of select="user:formatSpace(string(preceding-sibling::*[1]/@length))" disable-output-escaping="yes"/>
</span>
</xsl:if>
<span>
<xsl:attribute name="style">color:<xsl:value-of select="@forecolor"/></xsl:attribute>
<xsl:if test="@bold = 'true'">
<xsl:text disable-output-escaping="yes"><![CDATA[<b>]]></xsl:text>
</xsl:if>
<xsl:if test="@italic= 'true'">
<xsl:text disable-output-escaping="yes"><![CDATA[<i>]]></xsl:text>
</xsl:if>
<xsl:if test="@underline= 'true'">
<xsl:text disable-output-escaping="yes"><![CDATA[<u>]]></xsl:text>
</xsl:if>
<xsl:value-of select="."/>
<xsl:if test="@underline= 'true'">
<xsl:text disable-output-escaping="yes"><![CDATA[</u>]]></xsl:text>
</xsl:if>
<xsl:if test="@italic= 'true'">
<xsl:text disable-output-escaping="yes"><![CDATA[</i>]]></xsl:text>
</xsl:if>
<xsl:if test="@bold = 'true'">
<xsl:text disable-output-escaping="yes"><![CDATA[</b>]]></xsl:text>
</xsl:if>
</span>
</xsl:template>
<!-- childrows template -->
<xsl:template match="childrows">
<br/>
<xsl:apply-templates select="row"/>
</xsl:template>
</xsl:stylesheet>
</code>
/JohanSv: XML/XSLT Nöt
märkte att jag har någon rejäl bugg i exportern så den fick bara med EN childrows sektion.
den ska ju självklart finnas på att som kan foldas och du ska inte själv behöva matcha på '{' och '}'
det var redigt klantigt av mig att inte kolla det innan jag laddade upp xmlkoden...
ska fixatill det och så skickar jag den nya exportern till pelle asap...
//RogerSv: XML/XSLT Nöt
Kan ju nämna att det var ett rent litet h**** att få till '{' och '}' och sen fungerar ju denna bara för C formaterad kod. =)
Men om XMLen innehåller allt som ska foldas så är det nog lite enklare.
Tittar in senare och kollar in den nya XMLen
/JohanSv: XML/XSLT Nöt
har fixat så exportern får med alla sektioner rätt och nu exporterar den även ut hur en rad ser ut som collapsad
http://www.compona.com/pelle/kod.xml
http://www.compona.com/pelle/pellekod.zip
där är både öppna och stängda rader synliga (och så är det några kilo mer buggar)
tanken är iaf att när en öppen rad är synlig så ska den stängda raden gömmas och vise versa..
om du har tid och lust får du gärna fortsätta fila på den där nu när all info finns i xml'en ;)
//RogerSv: XML/XSLT Nöt
Sv: XML/XSLT Nöt
vad är tanken med collapsedrow "{...}"? är inte riktigt med här. Fördelen med att ha "{...}" som en bild är ju att man slipper extra tecken när man gör copy direkt ifrån sidan.
/JohanSv: XML/XSLT Nöt
Försök att inte förstöra den denna gången ;)
Radnummer och copy to clipboard (fungerar nog bara i IE just nu.).
<code>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:user="http://www.pellesoft.se" extension-element-prefixes="msxsl" exclude-result-prefixes="user">
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
<msxsl:script language="JScript" implements-prefix="user">
var rowNumber = 0;
function getRowNumber()
{
rowNumber++;
if(rowNumber < 10)
res = "0" + rowNumber;
else
res = rowNumber;
return res;
}
//**
//Create a string of spaces
function formatSpace(noOfSpaces)
{
var res = " ";
for(i=0;i<noOfSpaces-1;i++)
{
res += "&nbsp;";
}
return res;
}
//**
//Get unique div neme
function getDivName()
{
return "div" + Math.floor(Math.random() * 99999);
}
</msxsl:script>
<xsl:template match="/root">
<xsl:comment>Johan Asplund 2004-11-16</xsl:comment>
<script language="JavaScript">
/*
Client functions
*/
//**
//Create a string of spaces
function formatSpace(noOfSpaces)
{
var res = "";
for(i=0;i<noOfSpaces;i++)
{
res += "&nbsp;";
}
return res;
}
//**
//Open close div tags
function OpenClose(divId, noOfSpaces)
{
var oDiv;
var oSpan;
oDiv = document.all[divId]
oSpan= document.all['s' + divId];
if(oDiv)
{
if(oDiv.style.display=='none')
{
oDiv.style.display=''
oSpan.innerHTML= "";
}
else
{
oDiv.style.display='none'
oSpan.innerHTML= "<img width='11' onclick='OpenClose(" + "\"" + divId+ "\",\"" + noOfSpaces +"\"" + ")' src='PlusNoLines.gif'></img>" + formatSpace(noOfSpaces) + "<img src='closed.gif' ><br>";
}
}
}
//**
//Copy code to clipboard
function copyToClipboard()
{
holdtext.innerText = copytext.innerText;
Copied = holdtext.createTextRange();
Copied.execCommand("RemoveFormat");
Copied.execCommand("Copy");
}
</script>
<table style="background-color:#f5f5f5;width:100%;background-color:#FAFAFA;border: 1px solid #C0C0C0;font-family:Verdana, Lucida Console, Arial;font-size:10px">
<tr>
<td class="Text">
<SPAN ID="copytext">
<xsl:apply-templates select="/root/row"/>
</SPAN>
<TEXTAREA ID="holdtext" STYLE="display:none;"></TEXTAREA>
</td>
</tr>
<tr>
<td>
<input type="button" value="Copy to Clipboard" onclick="copyToClipboard()"></input>
</td>
</tr>
</table>
</xsl:template>
<!-- row template -->
<xsl:template match="row">
<xsl:choose>
<xsl:when test="./childrows">
<xsl:variable name="divId">
<xsl:value-of select="user:getDivName()"/>
</xsl:variable>
<span>
<xsl:attribute name="id">s<xsl:value-of select="$divId"/></xsl:attribute>
</span>
<!--output div-->
<xsl:text disable-output-escaping="yes"><![CDATA[<div style="display=block" id="]]></xsl:text>
<xsl:value-of select="$divId"/>
<xsl:text disable-output-escaping="yes"><![CDATA[">]]></xsl:text>
<img src="minus.gif" width="11" align="top" border="0">
<xsl:attribute name="onclick">OpenClose('<xsl:value-of select="$divId"/>','<xsl:value-of select="string(./childrows//ws[1]/@length + 2)"/>')</xsl:attribute>
</img>
</xsl:when>
<xsl:when test="name(./..) = 'childrows' and position()=last()">
<img src="L.gif" width="11" border="0" align="top"/>
</xsl:when>
<xsl:when test="name(./..) = 'childrows'">
<img src="I.gif" width="11" border="0" align="top"/>
</xsl:when>
<xsl:otherwise>
<img src="clear.gif" border="0" width="11" height="16" align="top"/>
</xsl:otherwise>
</xsl:choose>
<span>
<xsl:value-of select="user:getRowNumber()" disable-output-escaping="yes"/><xsl:value-of select="user:formatSpace(2)" disable-output-escaping="yes"/>
</span>
<xsl:apply-templates select="./*" />
<xsl:choose>
<xsl:when test="name(./..) = 'childrows' and position()=last()">
<xsl:text disable-output-escaping="yes"><![CDATA[</div>]]></xsl:text>
</xsl:when>
<xsl:when test="./childrows">
<!-- do nothing-->
</xsl:when>
<xsl:otherwise>
<br/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- collapsedrow template -->
<xsl:template match="collapsedrow">
<!-- <img src="plus.gif" border="0" align="top"/>
<xsl:apply-templates select="./words" />
<br/>
-->
</xsl:template>
<!-- word template -->
<xsl:template match="ws">
<span>
<xsl:value-of select="user:formatSpace(string(@length))" disable-output-escaping="yes"/>
</span>
</xsl:template>
<xsl:template match="words">
<xsl:apply-templates select="./*" />
</xsl:template>
<!-- word template -->
<xsl:template match="word">
<span>
<xsl:attribute name="style">color:<xsl:value-of select="@forecolor"/></xsl:attribute>
<xsl:if test="@bold = 'true'">
<xsl:text disable-output-escaping="yes"><![CDATA[<b>]]></xsl:text>
</xsl:if>
<xsl:if test="@italic= 'true'">
<xsl:text disable-output-escaping="yes"><![CDATA[<i>]]></xsl:text>
</xsl:if>
<xsl:if test="@underline= 'true'">
<xsl:text disable-output-escaping="yes"><![CDATA[<u>]]></xsl:text>
</xsl:if>
<xsl:value-of select="."/>
<xsl:if test="@underline= 'true'">
<xsl:text disable-output-escaping="yes"><![CDATA[</u>]]></xsl:text>
</xsl:if>
<xsl:if test="@italic= 'true'">
<xsl:text disable-output-escaping="yes"><![CDATA[</i>]]></xsl:text>
</xsl:if>
<xsl:if test="@bold = 'true'">
<xsl:text disable-output-escaping="yes"><![CDATA[</b>]]></xsl:text>
</xsl:if>
</span>
<xsl:apply-templates select="./childrows"></xsl:apply-templates>
</xsl:template>
<!-- collapsedrow template -->
<xsl:template match="collapsedrow">
</xsl:template>
<!-- childrows template -->
<xsl:template match="childrows">
<br/>
<xsl:apply-templates select="row">
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
</code>
Mvh
JohanSv: XML/XSLT Nöt
Sv: XML/XSLT Nöt