Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

js kode-highlighter

3 views
Skip to first unread message

Erik Ginnerskov

unread,
Dec 18, 2011, 1:07:40 PM12/18/11
to
Jeg sidder og bøvler med et par javascripts, der kan highlighte noget kode i
en boks. Resultatet er - ud over den ønskede highlight - en uønsket
ombrydning af den viste kode.

Fejlen kan ses på

http://hjemmesideskolen.dk/css/egenskaber/box-shadow-demo.php

Nederst på siden er en tilsvarende boks uden highlight; den viser (bortset
fra den røde farve) hvordan koden skal være vist.

De ansvarlige scripts er disse:

http://hjemmesideskolen.dk/css/egenskaber/shCore.js
http://hjemmesideskolen.dk/css/egenskaber/shBrushCss.js

De 2 scripts er hentet herfra:

http://alexgorbatchev.com/SyntaxHighlighter/

og en velfungerende demo kan ses her:

http://webdesign.ranunkelvej.com/csseksempler/demobox.php

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk

scootergrisen

unread,
Dec 18, 2011, 2:53:53 PM12/18/11
to
Hvad linierskift gemmer du dine filer med ?

Ser ud til koden er lavet til unix linieskift (\n).

Så prøv engang og lav en kopi af din side og konverter alle linieskift
til unix linieskift.

Hvis du bruger notepad++ kan du gøre det i Edit > EOL conversion.

Stig Johansen

unread,
Dec 19, 2011, 3:48:42 AM12/19/11
to
Erik Ginnerskov wrote:

> http://hjemmesideskolen.dk/css/egenskaber/shCore.js

Føj for s*.....
Gør dig selv en tjeneste at lade være med at bruge 'packer'.

Der er 2 overordnede problemstillinger:
1) Kræver unødig behandling på klienten (performance).
2) Måske vigtigst - denne teknik bruges i vid udstrækning at
'virusprogrammører'.

Hvis du vil minimere kode, så brug gzip som alle browserer/søgemaskiner
understøtter, og det er ovenikøbet en gammelkendt standard:
http://en.wikipedia.org/wiki/Gzip

(Ja ja - skal nok lade være med at underholde om 'problemtiden' hvor
browserer alene understøttede gzip mens 'den' alene understøttede
deflate :-)

Sikke meget tis man har spildt på 'ham' for at lave dobbeltløsninger ;-)

--
Med venlig hilsen
Stig Johansen

Erik Ginnerskov

unread,
Dec 19, 2011, 9:15:32 AM12/19/11
to
scootergrisen wrote:
>> Fejlen kan ses på
>>
>> http://hjemmesideskolen.dk/css/egenskaber/box-shadow-demo.php
>
> Hvad linierskift gemmer du dine filer med ?

Jeg plejer at redigere i WebWriter, som må formodes at anvende
Windows-linjeskift. Har også prøvet Notepad, som vel anvender samme format.

> Ser ud til koden er lavet til unix linieskift (\n).
>
> Så prøv engang og lav en kopi af din side og konverter alle linieskift
> til unix linieskift.
>
> Hvis du bruger notepad++ kan du gøre det i Edit > EOL conversion.

Prøvede i NP++ at skifte mellem Windows-, Unix- og Mac-linjeskift. Det gav
ingen forskel - stadig uønsket linjeombrydning før og efter kolon og før
semikolon samt mellem enkeltværdier. Prøvede vedrørende sidstnævnte at
udskifte mellemrum med   - det gjorde heller ingen forskel. Det hjalp
heller ikke at skrive alle egenskaberne på samme linje. Fjernelse af
mellemrum efter kolon ændrede heller ikke noget - stadig uønsket ombrydning.

Må sgu nok skrotte det projekt, med Stigs frygt for at det kan bruges til
virus-injection og besværet med at få det til at makke ret.

Erik Ginnerskov

unread,
Dec 19, 2011, 9:26:05 AM12/19/11
to
Stig Johansen wrote:

> Føj for s*.....
> Gør dig selv en tjeneste at lade være med at bruge 'packer'.

Har skrottet ideen. Venter på at noget funktionelt i php skulle dukke op.

> Der er 2 overordnede problemstillinger:
> 1) Kræver unødig behandling på klienten (performance).
> 2) Måske vigtigst - denne teknik bruges i vid udstrækning at
> 'virusprogrammører'.

Hvor er 'Virus Nejtak'-knappen?

> (Ja ja - skal nok lade være med at underholde om 'problemtiden' hvor
> browserer alene understøttede gzip mens 'den' alene understøttede
> deflate :-)
>
> Sikke meget tis man har spildt på 'ham' for at lave dobbeltløsninger
> ;-)

Vi ved vist alle, hvad 'den' og hvem 'ham' er. Lad os holde os til de
vedtagne standarder.

Erik Ginnerskov

unread,
Dec 19, 2011, 9:43:52 AM12/19/11
to
Stig Johansen wrote (i php-gruppen):

> Men hvorfor lave det i PHP når det kan laves i JS og virke på 'alt' ?

> Her er lidt impulser:
> Min highlight.js:

Jeg ser umiddelbart to js-scripts i det indlæg. Skal de bruges begge to - og
gemmes som to selvstændige filer?

scootergrisen

unread,
Dec 19, 2011, 10:46:46 AM12/19/11
to
> Må sgu nok skrotte det projekt, med Stigs frygt for at det kan bruges
> til virus-injection og besværet med at få det til at makke ret.

Det skulle da nok kunne lade sig gøre at lave.

Jeg prøver at se om jeg kan finde en løsning der virker.

scootergrisen

unread,
Dec 19, 2011, 11:09:41 AM12/19/11
to
> Jeg sidder og bøvler med et par javascripts, der kan highlighte noget
> kode i en boks. Resultatet er - ud over den ønskede highlight - en
> uønsket ombrydning af den viste kode.
>
> Fejlen kan ses på
>
> http://hjemmesideskolen.dk/css/egenskaber/box-shadow-demo.php

Det er fordi du i din hss-main.css fil har :

code {
display: block;
}

Karl Erik Christensen

unread,
Dec 19, 2011, 11:25:27 AM12/19/11
to
On 19-12-2011 17:09, scootergrisen wrote:
>> Jeg sidder og břvler med et par javascripts, der kan highlighte noget
>> kode i en boks. Resultatet er - ud over den řnskede highlight - en
>> uřnsket ombrydning af den viste kode.
>>
>> Fejlen kan ses pĺ
>>
>> http://hjemmesideskolen.dk/css/egenskaber/box-shadow-demo.php
>
> Det er fordi du i din hss-main.css fil har :
>
> code {
> display: block;
> }

<pre class="brush: css; gutter: false">
div {
height: 30px;
width: 200px;
box-shadow: 8px 8px 4px #666;
}
</pre>

<script type="text/javascript">
SyntaxHighlighter.all()
</script>

<pre>div {
height: 30px;
width: 200px;
box-shadow: 8px 8px 4px #666;
}</pre>


--
http://dmwebdesign.dk - DM i Webdesign
http://produceret-i.dk/ - Křb danske produkter
http://webdesign.ranunkelvej.com - Artikler om webdesign

Karl Erik Christensen

unread,
Dec 19, 2011, 11:27:56 AM12/19/11
to
On 19-12-2011 17:25, Karl Erik Christensen wrote:

>> Det er fordi du i din hss-main.css fil har :
>>
>> code {
>> display: block;
>> }
>
> <pre class="brush: css; gutter: false">
> div {
> height: 30px;
> width: 200px;
> box-shadow: 8px 8px 4px #666;
> }
> </pre>
>
> <script type="text/javascript">
> SyntaxHighlighter.all()
> </script>
>
> <pre>div {
> height: 30px;
> width: 200px;
> box-shadow: 8px 8px 4px #666;
> }</pre>
>

Hovsa - den smuttede afsted _uden_ den bedske kommentar jeg havde tænkt :-)

Karl Erik.

--
http://dmwebdesign.dk - DM i Webdesign
http://produceret-i.dk/ - Køb danske produkter

scootergrisen

unread,
Dec 19, 2011, 11:33:19 AM12/19/11
to
Prøv og fjern display: block; i :

code {
display: block;
}

...og vupti så virker det.

Erik Ginnerskov

unread,
Dec 19, 2011, 1:08:54 PM12/19/11
to
scootergrisen wrote:

> Det er fordi du i din hss-main.css fil har :
>
> code {
> display: block;
> }

Negativ. Den definition har ingen effekt på en <pre>.

Erik Ginnerskov

unread,
Dec 19, 2011, 1:14:48 PM12/19/11
to
OK, prøvedet. Fatter ikke, at det har noget at sige. En definition for,
hvordan code skal opføre sig, burde ingen virkning have for, hvordan en pre
præsenteres.

Bertel Lund Hansen

unread,
Dec 19, 2011, 4:28:03 PM12/19/11
to
Erik Ginnerskov skrev:

> OK, prøvedet. Fatter ikke, at det har noget at sige. En definition for,
> hvordan code skal opføre sig, burde ingen virkning have for, hvordan en pre
> præsenteres.

Det har den heller ikke. Typen af linjeskift er også uden
betydning. Jeg forstår ikke hvorfor scootergrisen trækker dig
sådan rundt ved næsen.

--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/

Erik Ginnerskov

unread,
Dec 19, 2011, 5:39:11 PM12/19/11
to
Bertel Lund Hansen wrote:

>> OK, prøvedet. Fatter ikke, at det har noget at sige. En definition
>> for, hvordan code skal opføre sig, burde ingen virkning have for,
>> hvordan en pre præsenteres.
>
> Det har den heller ikke. Typen af linjeskift er også uden
> betydning. Jeg forstår ikke hvorfor scootergrisen trækker dig
> sådan rundt ved næsen.

Det gør han heller ikke. Faktum er, at når jeg på den side sætter
code{display:inline;} falder tingene på plads. Jeg fatter bare ikke
hvorfor - der er ingen logik i det, for den viste kode står i en <pre>.

scootergrisen

unread,
Dec 19, 2011, 9:38:59 PM12/19/11
to
> Det gør han heller ikke. Faktum er, at når jeg på den side sætter
> code{display:inline;} falder tingene på plads. Jeg fatter bare ikke
> hvorfor - der er ingen logik i det, for den viste kode står i en <pre>.

Det er fordi den javascript highlight kode laver om på din side.

Hvis jeg går ind på
http://hjemmesideskolen.dk/css/egenskaber/box-shadow-demo.php og kigger
i kildekoden står der :

<pre class="brush: css; gutter: false">
div {
height: 30px;
width: 200px;
box-shadow: 8px 8px 4px #666;
}
</pre>

Men når din javascript highlight kode er færdig så bliver det til :

<div><div id="highlighter_624676" class="syntaxhighlighter nogutter
css"><div class="toolbar"><span><a href="#" class="toolbar_item
command_help help">?</a></span></div><table border="0" cellpadding="0"
cellspacing="0"><tbody><tr><td class="code"><div class="container"><div
class="line number1 index0 alt2"><code class="css plain">div
{</code></div><div class="line number2 index1 alt1"><code class="css
keyword">height</code><code class="css plain">: </code><code class="css
value">30px</code><code class="css plain">;</code></div><div class="line
number3 index2 alt2"><code class="css keyword">width</code><code
class="css plain">: </code><code class="css value">200px</code><code
class="css plain">;</code></div><div class="line number4 index3
alt1"><code class="css keyword">box-shadow</code><code class="css
plain">: </code><code class="css value">8px</code> <code class="css
value">8px</code> <code class="css value">4px</code> <code class="css
value">#666</code><code class="css plain">;</code></div><div class="line
number5 index4 alt2"><code class="css
plain">}</code></div></div></td></tr></tbody></table></div></div>

...og der i blandt kan du se der er nogen <code> som så bliver påvirket
af din CSS.

Du kan prøve og gå ind på
http://hjemmesideskolen.dk/css/egenskaber/box-shadow-demo.php og gem
siden så kan du se outputte efter javascript har været igang... de gør
den i hvert fald i firefox når man vælger "Webpage, complete".

Stig Johansen

unread,
Dec 20, 2011, 2:11:13 AM12/20/11
to
Erik Ginnerskov wrote:

> Må sgu nok skrotte det projekt, med Stigs frygt for at det kan bruges til
> virus-injection og besværet med at få det til at makke ret.

Nej det er ikke en frygt.
Det er mere en formodet konstatering af, at 'virusprogrammer' vil reagere på
denne 'struktur'.

'Frygten' går mere på at der over tid vil komme false positives i
forbindelse med 'packer', og dermed udnævne din side som 'possible malware'
- med deraf følger ;-)

(ER set in real life - altså faslse positives)

Hvis du vil fortsætte vil jeg blot råde dig til at bruge den originale
version, og ikke den 'packede' version.

Stig Johansen

unread,
Dec 20, 2011, 2:19:50 AM12/20/11
to
Bertel Lund Hansen wrote:

> Det har den heller ikke. Typen af linjeskift er også uden
> betydning.

Blot et lille hint.

<pre> bør opretholde den originale 'tekst' inklusive linieskift m.v., men
der er et særligt problem med IE, hvor netop det at udlæse teksten og
genindlæse teksten bliver ødelagt i IE.

Derfor havde jeg denne warning i min HTML:
<span id="iewarning">Warning!<br/>The line and space formatting may be
corrupted due to a bug in Internet Explorer.<br/>Copy paste may not work as
expected.</span>

SVJH eksisterede problemet stadig i IE8, hvor resultastet blev højst
mærkeligt.

Bemærk jeg udelukkende snakker <pre> i denne forbindelse, men den er
essientiel hvis man skal kunne copy/paste fra en (redigeret) box.

Stig Johansen

unread,
Dec 20, 2011, 2:23:35 AM12/20/11
to
Erik Ginnerskov wrote:

> Hvor er 'Virus Nejtak'-knappen?

Mellem ørerne ;)

>> Sikke meget tis man har spildt på 'ham' for at lave dobbeltløsninger
>> ;-)

Hah ;-)
Skulle nok have læst korrektur inden afsendelse.

Der er tale om en slåfejl - du ved det med mindre tastaturer, hvor tasterne
sidder tættere.

Der skulle have stået _tid_ og ikke tis - men det giver en sjov 'mening' :-)

Stig Johansen

unread,
Dec 20, 2011, 2:36:27 AM12/20/11
to
Erik Ginnerskov wrote:

> Stig Johansen wrote (i php-gruppen):
>
>> Men hvorfor lave det i PHP når det kan laves i JS og virke på 'alt' ?
>
>> Her er lidt impulser:
>> Min highlight.js:
>
> Jeg ser umiddelbart to js-scripts i det indlæg. Skal de bruges begge to -
> og gemmes som to selvstændige filer?

I virkeligheden skal man også bruge events.js - den har jeg vist postet
tidligere.

Om det skal lægges som 1, 2 eller 3 filer er udelukkende et spørgsmål om
struktur.

På samme måde som med css er det en god ide at strukturere niveauerne så man
har noget globalt, mindre globalt samt noget lokalt.

Deler man det op i mange filer er det let at vedligeholde, men kræver lige
så mange <script... tags som der er filer - på samme måde som med .css.

Jeg lavede derfor en funktion (i asp), så man kan udtrække filer fra et
'repository' med et enkelt kommasepareret tag a. la:
<script type="text/javascript"
src="/javascript/jsrepository.asp?f=events,qsort,sorttable,highlight"></script>

Det er sådan lidt med holdninger - skal man:
1) Forsøge at lave et 'allmighty can do everything swiss army knife' ala
jQuery
2) Lave det struktureret så det er nemt at vedligeholde/rette?

Det liger jo sådan at diverse (.js, .css m.m.) filer ikke kræver en
tilsvarende endelse, men er styret af content-type, så man kan lave det i
hvilket som helst sprog.

Her er min ASP funktion, som sikkert er nem at 'PHP-ficere' (Går ud fra
datofunktionerne er indbygget':
--------------------------------- jsrepository.asp -----------------
<%@ LANGUAGE = VBScript%><%Option Explicit%><%
Dim Lastmodified
Dim Ifmodified
Dim Filelist
Dim fcounter
Dim fso
Dim thisfile
Dim thisdate

Filelist = split(Request.QueryString("f"),",")
if uBound(Filelist) < 0 then
Response.Write "no arguments found"
Response.end
end if

LastModified=0
set fso = CreateObject("Scripting.FileSystemObject")
' Find last modified
for fcounter = 0 to uBound(Filelist)
thisdate =
fso.GetFile(Server.MapPath(filelist(fcounter)+".js")).DateLastModified
if thisdate > LastModified then LastModified = thisdate
next

Response.AddHeader "Last-Modified",XMLDatetime(LastModified)
Response.ContentType = "text/javascript"
if Request.QueryString("d")>"!" then
Response.AddHeader "Content-disposition","attachment;
filename="""+Request.QueryString("d")+".js"""
end if

Ifmodified = Request.ServerVariables("HTTP_IF_MODIFIED_SINCE")
if Ifmodified < "!" then
Ifmodified = 0
else
'Response.Write "if modified" + DatetimefromXML(ifmodified)
Ifmodified = cDate(DatetimefromXML(ifmodified))
end if


if LastModified <= Ifmodified then
Response.Status = "304 Not modified"
Response.end
end if
' modified, serve the content

for fcounter = 0 to uBound(Filelist)
Response.Write
fso.OpenTextFile(Server.Mappath(filelist(fcounter)+".js"),1).readall
next

' Response.Write vbCrLf+"Last modified= " + XMLDatetime(LastModified)+vbCrLf


Function XMLDatetime (Datetime)
Dim Weekdaynames
Dim Monthnames
Weekdaynames = Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat")
Monthnames =
Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")
XMLDatetime = Weekdaynames(DatePart("w",Datetime)-1) + ", " + _
cStr(DatePart("d",Datetime)) + " " + _
Monthnames(DatePart("m",Datetime)-1) + " " + _
cStr(DatePart("yyyy",Datetime)) + " " + _
cStr(DatePart("h",Datetime)) + ":" + _
cStr(DatePart("n",Datetime)) + ":" + _
cStr(DatePart("s",Datetime)) + " GMT"
end Function ' XMLDatetime

Function DatetimefromXMLold (DatetimeXML)
Dim Months
months = "JanFebMarAprMayJunJulAugSepOctNovDec"
Dim Y,M,D,H,N,S
'Mon, 04 Jan 2010 23:28:50 GMT

D = mid(DatetimeXML,6,2)
M = instr(months,mid(DatetimeXML,9,3)) \ 3 + 1
Y = mid(DatetimeXML,13,4)
H = mid(DatetimeXML,18,2)
N = mid(DatetimeXML,21,2)
S = mid(DatetimeXML,24,2)

DatetimefromXML= DatetimeXML+"/"+Y+"-"+cStr(M)+"-"+D+" "+H+":"+N+":"+S

end Function ' XMLDatetime

Function DatetimefromXML (DatetimeXML)
Dim Months
months = "JanFebMarAprMayJunJulAugSepOctNovDec"
Dim Y,M,D,H,N,S
'Mon, 04 Jan 2010 23:28:50 GMT
Dim DateArray
Dim TimeArray
DateArray = split(DatetimeXML," ")
D = DateArray(1)
M = instr(months,DateArray(2)) \ 3 + 1
Y = DateArray(3)
TimeArray = split(DateArray(4),":")
H = TimeArray(0)
N = TimeArray(1)
S = TimeArray(2)

DatetimefromXML= Y+"-"+cStr(M)+"-"+D+" "+H+":"+N+":"+S

end Function ' XMLDatetime

%>

Erik Ginnerskov

unread,
Dec 20, 2011, 8:04:09 AM12/20/11
to
Stig Johansen wrote:

> Nej det er ikke en frygt.
> Det er mere en formodet konstatering af, at 'virusprogrammer' vil
> reagere på denne 'struktur'.
>
> 'Frygten' går mere på at der over tid vil komme false positives i
> forbindelse med 'packer', og dermed udnævne din side som 'possible
> malware' - med deraf følger ;-)

Det stempel vil jeg gerne være foruden på mine sider, så ...

> Hvis du vil fortsætte vil jeg blot råde dig til at bruge den originale
> version, og ikke den 'packede' version.

Jeg ser, om jeg kan lokalisere en sådan.

Erik Ginnerskov

unread,
Dec 20, 2011, 8:09:12 AM12/20/11
to
scootergrisen wrote:

> Det er fordi den javascript highlight kode laver om på din side.

Ja, det kan jeg forstå, en "Vis kilde" afslører bare ikke noget.

> Du kan prøve og gå ind på
> http://hjemmesideskolen.dk/css/egenskaber/box-shadow-demo.php og gem
> siden så kan du se outputte efter javascript har været igang... de gør
> den i hvert fald i firefox når man vælger "Webpage, complete".

Gider ikke, tror dig, når du siger det. Jeg kan jo også se, at der sker
noget med farverne.

Erik Ginnerskov

unread,
Dec 20, 2011, 8:26:00 AM12/20/11
to
Stig Johansen wrote:

> I virkeligheden skal man også bruge events.js - den har jeg vist
> postet tidligere.

Den må jeg have overset. En søgning på events.js som indhold gav ikke noget

> Om det skal lægges som 1, 2 eller 3 filer er udelukkende et spørgsmål
> om struktur.

Jow. Men præcis hvor skal der så indsættes et array af nøgleord og hvordan
skal det formateres?


> Jeg lavede derfor en funktion (i asp), så man kan udtrække filer fra
> et 'repository' med et enkelt kommasepareret tag a. la:
> <script type="text/javascript"
> src="/javascript/jsrepository.asp?f=events,qsort,sorttable,highlight"></script>

Men nu kan jeg ikke køre asp på den server, så det kan ikke bruges til
noget.

> Her er min ASP funktion, som sikkert er nem at 'PHP-ficere'

Ikke for undertegnede.

Rune Jensen

unread,
Dec 20, 2011, 10:45:24 AM12/20/11
to
On 20 Dec., 05:09, "Erik Ginnerskov" <erik.ginners...@live.dk> wrote:
> scootergrisen wrote:
> > Det er fordi den javascript highlight kode laver om på din side.
>
> Ja, det kan jeg forstå, en "Vis kilde" afslører bare ikke noget.

Javascript kan ikke lave om i den kode, som du ser via vis kilde. Det
sker udelukkende "run-time", så du vil kunne se det med diverse JS-
debuggers f.eks. ved DOM-ændringer (både Chrome og Opera har JS-
debuggers), men altså ikke i vis kilde.

Det ville nok også kunne skabe diverse sjove udfald ifht. cashing og
gøre hjemmesider sårbare som bare helv.... hvis man kunne lave ægte
selv-ændrende kode. Det er udelukkende din serverside kode, som
bestemmer, hvad koden skal være i vis kilde.


MVH
Rune Jensen

Karl Erik Christensen

unread,
Dec 20, 2011, 11:24:38 AM12/20/11
to
Du har sguda dine lyse øjeblikke :-)

Stig Johansen

unread,
Dec 21, 2011, 9:14:44 AM12/21/11
to
Jeg skal nok vende tilbage med en bedre beskrivelse/oversigt m.m.
Men lige nu kører jeg på Google groups --- suk!

On Dec 20, 2:26 pm, "Erik Ginnerskov" <erik.ginners...@live.dk> wrote:
> Stig Johansen wrote:
> > I virkeligheden skal man også bruge events.js - den har jeg vist
> > postet tidligere.
>
> Den må jeg have overset. En søgning på events.js som indhold gav ikke noget

Jeg skal nok poste den igen, men det var i et svar til scootergrisen.

>
> > Om det skal lægges som 1, 2 eller 3 filer er udelukkende et spørgsmål
> > om struktur.
>
> Jow. Men præcis hvor skal der så indsættes et array af nøgleord og hvordan
> skal det formateres?

Det skal jeg nok beskrive (når jeg kommer til et ordentligt
interface) ;-)

> > Jeg lavede derfor en funktion (i asp), så man kan udtrække filer fra
> > et 'repository' med et enkelt kommasepareret tag a. la:
> >   <script type="text/javascript"
> > src="/javascript/jsrepository.asp?f=events,qsort,sorttable,highlight"></scr­ipt>
>
> Men nu kan jeg ikke køre asp på den server, så det kan ikke bruges til
> noget.

Det ved jeg godt - Erik.
Det var blot ment som en impuls til planlægning af organisering af
mange filer.

Browsere er ligeglade om det er en, mange filer i <head> eller
<script> i head, eller hvorsomhelst.

> > Her er min ASP funktion, som sikkert er nem at 'PHP-ficere'
>
> Ikke for undertegnede.

Det ved jeg også godt, men det kunne jo være der var en PHP
interesseret, der ville strikke sådan en stump til fælles glæde ;-)

Stig Johansen

unread,
Dec 22, 2011, 6:14:17 AM12/22/11
to
Stig Johansen wrote:

> On Dec 20, 2:26 pm, "Erik Ginnerskov" <erik.ginners...@live.dk> wrote:
>> Jow. Men præcis hvor skal der så indsættes et array af nøgleord og
>> hvordan skal det formateres?
>
> Det skal jeg nok beskrive (når jeg kommer til et ordentligt
> interface) ;-)

I'M BACK!! :-)

Jeg skulle lige søge i 'arkiverne', og komme til min foretrukne VM.

Jeg har samlet hele 'skidtet' til et enkelt dokument, så man blot kan gemme
og afprøve (kode til sidst).

Jeg har klippet de forskellige js-filer ind i selve html'et, og forsøgt at
adskille det med kommentarer.

'Principskitsen' er:
1) Events.js - bruges globalt og alle steder hvor der behandles events.
2) Highlight.js - bruges alle steder hvor der ønskes highlight.
Disse 2 filer ligger for sig selv, da de er generelle.

Den sidste, og lokale er så storm.monitor.highlight.js, som angiver _data_
for netop dette dokument.

Denne fil (eller 'funktion' ) består af 2 dele.
1) definition af ord og klasser (klasser til css'et).
Dvs. denne her:
addarray(jsarray,['pubs','database']);

fortæller at ordet 'pubs' skal have tilføjet en class='database', hvor
præsentationen af class='database' angives i css'et.

2) funktionen 'do_highlight' er i princippet ikke nødvendig men IE har
åbenbart den kedelige egenskab at lave om på whitespace i en pre ved
udlæsning og genindlæsning.

I princippet betyder det ikke så meget, men netop denne side var lavet til
at man kan copy/paste 'koden' ind i Query Analyzer.

'koden' er et (T)SQL statement, og skal være 100% _præcist_, så det er
årsagen til min warning om IE, da forkert 'kode' til en database kan have
uoverskuelige konsekvenser.

Da man formentlig ikke ønsker highligt på _alt_, kaldes highligt til en
given id:
if (confirmed) highlight_ids(['triggercode'],jsarray);

Kig efter 'triggercode' i dokumentet.

Har man flere afsnit, eller id'er, der skal highlightes, kaldes den blot med
de forskellige id'er

*********************************************
* Samlet kode hvor JS er i selve dokumentet
*********************************************

(PS: Jeg bliver squ nødt til at sige det: Det virker _naturligvis_ i min
'gamle' Konqueror :-))

<%@ LANGUAGE = VBScript%><%Option Explicit%><%
Dim pagetitle
pagetitle = "W.O.P.R STORM monitor - MS SQLServer - Creation of the
triggers"

%><!--#include virtual="/include_files/doctype.inc.asp"-->
<style type="text/css">
.database {color:yellowgreen;}
.trigger {color:green;}
.table {color:blue;}
.field {color:red;}
.keyfield {color:Magenta;}
.textholder {white-space: pre; display:none; }
#iewarning {color:red; white-space: pre; display:none; font-size:
12pt;}
</style>
<!--script type="text/javascript"
src="/javascript/jsrepository.asp?f=events,highlight"></script-->

<script type="text/javascript"> <!-- events.js kan udskilles i fil -->
function addEvents (eventobject,eventtype,eventfunction) {
if ( eventobject.addEventListener ) {
eventobject.addEventListener (eventtype,eventfunction,false) ;
} else if( eventobject.attachEvent ) {
eventobject.attachEvent ('on'+eventtype,eventfunction) ;
} else {
eventobject['on' + eventtype] = eventfunction ;
}
}

function removeEvents (eventobject,eventtype,eventfunction) {
if ( eventobject.removeEventListener ) {
eventobject.removeEventListener (eventtype,eventfunction,false) ;
} else if( eventobject.detachEvent ) {
eventobject.detachEvent ('on'+eventtype,eventfunction) ;
} else {
eventobject['on' + eventtype] = null ;
}
}

function eventsource(e) {
var src ;
if (window.event) {
src = window.event.srcElement; // For IE
} else {
src = e.target; // For Firefox
}
if ( src.nodeName == '#text') src = src.parentNode ;
return src ;
}

function keynbr(e) {
e = e || window.event;
return e.keyCode || e.which ;
}

function mousecoords(ev) {
var e = ev || window.event ;
if(e.pageX || e.pageY){
return {x:e.pageX,y:e.pageY };
} else {
return {x:e.clientX,y:e.clientY} ;
}

}

function getXY(element) {
var top = 0;
var left = 0;
while (element.offsetParent){
top += element.offsetTop;
left += element.offsetLeft;
element = element.offsetParent;
}
top += element.offsetTop;
left += element.offsetLeft;
return {x:left,y:top} ;
}

function scroll () {
if (document.all) {
var iebody=(document.compatMode && document.compatMode !=
"BackCompat")? document.documentElement : document.body
var X = iebody.scrollLeft ;
var Y = iebody.scrollTop ;
} else {
var X = window.pageXOffset ;
var Y = window.pageYOffset ;
}
return {x:X,y:Y} ;
}

</script>

<script type="text/javascript"> <!-- highlight.js kan udskilles i fil -->

function replaceWord(instring, rfrom, rto) {
var rstring = instring;
var i = instring.indexOf(rfrom);
if (i > -1) {
var charbefore = instring.charAt(i-1) ;
var charafter = instring.charAt(i+rfrom.length) ;
var isword = (' -/()[].,"\x27*%=&|+<>\r\n'.indexOf(charbefore) > -1 &&
' -/()[].,"\x27*%=&|+<>\r\n'.indexOf(charafter) > -1 ) ;
if (isword) {
rstring = instring.substring(0, i);
rstring += rto + replaceWord(instring.substring(i +
rfrom.length),rfrom,rto);
} else {
rstring = instring.substring(0,i+rfrom.length) +
replaceWord(instring.substring(i + rfrom.length),rfrom,rto);
}
}
return rstring;
}

function addarray(to_array,item) {
to_array[to_array.length] = item ;
}

function highlight_ids(idarray,wordarray) {
for (var i = 0 ; i< idarray.length ; i++ ) {
var string = document.getElementById(idarray[i]).innerHTML ;
for (var w=0; w<wordarray.length;w++){
string = replaceWord(string, wordarray[w][0],'<span class="'+
wordarray[w][1]+'">'+wordarray[w][0]+'</span>') ;
}
document.getElementById(idarray[i]).innerHTML = string ;
}
}

</script>


<!--script type="text/javascript"
src="storm.monitor.highlight.js"></script-->
<script type="text/javascript"> <!-- storm.monitor.highlight.js kan
udskilles i fil -->

var jsarray = new Array ;
addarray(jsarray,['pubs','database']);
addarray(jsarray,['tr_storm','trigger']);
addarray(jsarray,['pub_info','table']);
addarray(jsarray,['pr_info','field']);
addarray(jsarray,['pub_id','keyfield']);

function do_highlight () {
var confirmed = true ;
if (document.all) {
confirmed = confirm('WARNING!\r\nYou are using some kind of Internet
Explorer.\r\nIf you continue here, the text will be highlighted to better
read it\r\n*BUT* the line formatting will be lost.\r\nPress OK to get
*Readability* and Cancel to get *Copy/Paste* ability.\r\n\r\n*FULL*
functionality can be obtained by installing, and using Firefox.')
if (confirmed) {
var s = document.getElementById('triggercode').innerHTML ;
s = s.replace(/\n/g,'<br/>');
document.getElementById('triggercode').innerHTML = s ;
document.getElementById('iewarning').style.display='block';
}
}
if (confirmed) highlight_ids(['triggercode'],jsarray);
}

addEvents (window,'load',do_highlight);


</script>

</head>

<body>
<!--#include virtual="/include_files/body.start.inc.asp"-->
<h3><u>Creation of the trigger.</u></h3>
<div class="ppre">Requires <a href="mssql.create.udf.asp" title="Creating
the helper function">Helper function</a> and <a
href="mssql.create.table.asp" title="Create the monitor table">monitor
table</a>

This is a sample code of creating a trigger on the demo database <span
class="database">pubs</span> which is included with MS SQLServer.
To customize it to your database, you need to change the various entities.

The legends used in this example are:

<span class="database">database</span>, which in this example is <span
class="database">pubs</span>
The statement, use <span class="database">pubs</span>, however should be
removed.
It is written to illustrate the database which is used.
Creation of a <span class="trigger">trigger</span> requires the first
statement to be CREATE <span class="trigger">trigger</span>, so connect to
the right <span class="database">database</span> and comment out this line.
Comment by preceeding --

<span class="trigger">trigger</span>, which in this example is <span
class="trigger">tr_storm</span>
A trigger name must be unique to a database, so you may use your own
mnemonics.
Could be tr_ followed by the tablename.

<span class="table">table</span>, which in this example is <span
class="table">pub_info</span>
Replace <span class="table">pub_info</span> to the tablename on which you
would establish monitoring.

<span class="field">field</span>, which in this example is <span
class="field">pr_info</span>
Replace <span class="field">pr_info</span> to the fieldname you want to
monitor.
Multiple fields can be monitored, in which case you can repeat the block
from
-- ******* Start field block ************
to
-- ******* End field block, repeat for each field in table ************

<span class="keyfield">keyfield</span>, which in this example is <span
class="keyfield">pub_id</span>
This is the name of the field which identifies each record.
In the pubs example it is pub_id, which is a unique key on the pub_info
table.
Notice it is a Varchar, and if you use some kind of integer/identity you
need to change the definitions of @cpub_id.

<span id="iewarning">Warning!<br/>The line and space formatting may be
corrupted due to a bug in Internet Explorer.<br/>Copy paste may not work as
expected.</span>
The code to create the trigger copy/pasting in Query Analyzer ( or similar
tool ):
<pre><code id="triggercode">-- This is an example of a trigger on the
pub_info table in the pubs database checking the pr_info field logging the
pub_id key value
use pubs
CREATE TRIGGER tr_storm ON pub_info
FOR INSERT, UPDATE, DELETE
AS
SET NOCOUNT ON
DECLARE @cpr_info INT, @cpub_id VARCHAR (20) -- pub_id is the key/identifier
field
DECLARE inserted_cursor CURSOR LOCAL FOR
SELECT I.pub_id,dbo.CrC32(P.pr_info)
FROM INSERTED I
INNER JOIN pub_info P
ON I.pub_id=P.pub_id
OPEN inserted_cursor
FETCH NEXT FROM inserted_cursor INTO @cpub_id,@cpr_info
WHILE @@FETCH_STATUS = 0
BEGIN
-- ******* Start field block ************
IF NOT Exists(SELECT id FROM StormMonitor WHERE Tablename = 'pub_info'
AND ColoumName = 'pr_info' AND KeyField = CAST(@cpub_id AS Varchar) ) BEGIN
insert into stormmonitor VALUES(CAST('pub_info' AS
Varbinary),CAST('pr_info' AS
Varbinary),CONVERT(float,GetDate()),0,@cpr_info,CAST(@cpub_id AS
Varbinary))
END ELSE BEGIN
UPDATE StormMonitor SET
LastCrc=CurrentCrc,CurrentCrc=@cpr_info,LastRun=CONVERT(float,GetDate())
WHERE Tablename = 'pub_info' AND ColoumName = 'pr_info' AND KeyField =
@cpub_id AND CurrentCrc &lt;&gt; @cpr_info
END
-- ******* End field block, repeat for each field in table ************

FETCH NEXT FROM inserted_cursor INTO @cpub_id,@cpr_info
END
CLOSE inserted_cursor
DEALLOCATE inserted_cursor
</code></pre>
<div class="textholder" id="database">The actual database where the trigger
should be installed. In this example we use pubs, but you must change it to
the actual database you are installing on.</div>
<div class="textholder" id="trigger">The trigger name. Ir it unique in the
database, so you might consider some semanthics where the tablename is part
of it. tr_storm_pub_info could be a guess.</div>
<div class="textholder" id="table">The name of the table on which you will
monitor changes.</div>
<div class="textholder" id="field">The field name inside the table where
changes will be recorded.</div>
<div class="textholder" id="keyfield">Key field, which identifies the very
record inside the table. It is used to identify the entry to backtrace
changes. </div>
</div>
</body>
</html>

*****************************
* End of dokument
*****************************

Erik Ginnerskov

unread,
Dec 22, 2011, 8:04:10 AM12/22/11
to
Stig Johansen wrote:

> Jeg har samlet hele 'skidtet' til et enkelt dokument, så man blot kan
> gemme og afprøve (kode til sidst).

Har gemt hele skidtet på harddisken. Mailen gemt samlet i en .eml, asp-filen
som helhed i en fil og de tre js-filer i tre filer.

Kigger på det senere - kan ikke sige, om det bliver mellem jul og nytår
eller mellem nytår og jul. Men tak for input.

Stig Johansen

unread,
Dec 22, 2011, 8:26:06 AM12/22/11
to
Erik Ginnerskov wrote:

> Har gemt hele skidtet på harddisken. Mailen gemt samlet i en .eml,
> asp-filen som helhed i en fil og de tre js-filer i tre filer.
>
> Kigger på det senere - kan ikke sige, om det bliver mellem jul og nytår
> eller mellem nytår og jul. Men tak for input.

Der er ikke noget krav om at kigge ;-)

Men når du lige nævner .asp delen, så skal du blot erstatte denne øverste
del:
--------------------
<%@ LANGUAGE = VBScript%><%Option Explicit%><%
Dim pagetitle
pagetitle = "W.O.P.R STORM monitor - MS SQLServer - Creation of the
triggers"

%><!--#include virtual="/include_files/doctype.inc.asp"-->
..........................
Med en normal doctype osv.

Bortset fra denne 'fuser', burde du kunne klippe selve teksten ind i din
foretrukne editor, gemme den, og kalde den - så burde alt virke.

(Hvis man har javascript enabled).

I øvrigt god jul til alle, og de her grupper plejer jeg kun at følge
når/hvis jeg er forbi knægtens maskine (når han er på arbejde), så vi ses
nok engang i det nye år.
0 new messages