[PHP] Universele syntax highlighter - voorbereiding

Pagina: 1
Acties:
  • 211 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Ik wil graag een uitbreiding voor phpBB schrijven die het mogelijk moet maken om code te highlighten voor (in principe) elke programmeertaal. Nou heb ik daar volgens mij een redelijk goede oplossing voor bedacht, maar ik heb het gevoel dat ik iets over het hoofd zie, waardoor ik het me misschien heel moeilijk ga maken.

Mijn idee:
Ik maak voor elke programmeertaal die ik wil supporten een ini file aan, met daarin wat settings (welk karakter geeft een string aan? e.d.), kleurinstellingen, en natuurlijk alle keywords. Voor C++ heb ik de volgende file in mekaar geflanst:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
[settings]
stringchar=",'
escapechar=\
specialchar=#
commentchar=//
commentstart=/*
commentend=*/

[colors]
normal=blue
keywords=darkgreen
strings=darkcyan
comments=purple
operators=red

[keywords]
0=auto
1=break
2=case
3=char
4=const
5=continue
6=default
7=do
8=double
9=else
10=enum
11=extern
12=float
13=for
14=goto
15=if
16=int
17=long
18=register
19=return
20=short
21=signed
22=sizeof
23=static
24=struct
25=switch
26=typedef
27=union
28=unsigned
29=void
30=volatile
31=while
32=bool
33=catch
34=class
35=delete
36=friend
37=inline
38=new
39=namespace
40=operator
41=private
42=protected
43=public
44=template
45=this
46=throw
47=try

Karakters onder het 'settings'-deel zijn comma-seperated.

Nou ben ik van plan simpelweg die ini file te parsen met ini_parse(), naar de settings kijken, en dan met behulp van regular expressions de kleuren aanpassen op basis van de settings en colors secties, door één voor één elk keyword te replacen, en strings/comments/enz. natuurlijk ook apart.

Mijn vraag:
Concreet is mijn vraag: zie ik wat over het hoofd? Gaat dit erg veel tijd kosten om te parsen? Of pak ik het echt veel te simpel aan, en is het gewoon niet mogelijk? Want ik heb bijvoorbeeld nergens een C++ bbcode mod kunnen vinden voor phpBB (let wel, daar heb ik nu geen interesse meer in, ik wil nu graag die aanpassing zelf maken, lijkt me wel een uitdaging :)).

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Niet geheel hieraan gerelateerd, maar kijk voor de grap eens naar het Proxima project. Dat gaat alleen wel iets verder dan syntax highlighting.

Wat betreft je posting zelf: dit is in principe een manier die ik veel editors zie gebruiken. Kijk maar eens naar language files van zo'n editor.

Let er wel op dat als bijvoorbeeld een keyword een gedeelte is van een variabele naam, dat 'ie dan geen apart kleurtje krijgt. Net zoals keywords in string enzo. De diversiteit tussen dergelijke talen is dusdanig klein dat dit soort effecten wel te ondervangen zijn.

[ Voor 52% gewijzigd door Infinitive op 07-08-2004 20:18 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Acties:
  • 0 Henk 'm!

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:13

glashio

C64 > AMIGA > PC

Tja... het is idd leuke projectje.
Hier een klein hulpje :)

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Infinitive schreef op 07 augustus 2004 @ 20:13:
Niet geheel hieraan gerelateerd, maar kijk voor de grap eens naar het Proxima project. Dat gaat alleen wel iets verder dan syntax highlighting.
Ziet er idd interessant uit, maar een beetje te complex voor dit simpele projectje lijkt me. :)
Infinitive schreef op 07 augustus 2004 @ 20:13:
Let er wel op dat als bijvoorbeeld een keyword een gedeelte is van een variabele naam, dat 'ie dan geen apart kleurtje krijgt. Net zoals keywords in string enzo. De diversiteit tussen dergelijke talen is dusdanig klein dat dit soort effecten wel te ondervangen zijn.
Goed punt. Zorgen dat als het een deel van een variabele is, het geen kleur te geven, dat is niet echt een probleem, omdat ik de regular expression zal laten matchen op hele woorden. In een string is het weer wat lastiger omdat het keyword daar weer als heel woord in zou kunnen staan. Misschien moet ik de regular expression de keywords eerst door een maffe string laten vervangen ( {[COLOR=darkred]} ofzo), die ik er later weer uit filter als ie overbodig is... Of is het mogelijk een regexp keywords binnen een string over te laten slaan?
glashio schreef op 07 augustus 2004 @ 20:15:
Tja... het is idd leuke projectje.
Hier een klein hulpje :)
Tnx! Dat ziet er heel bruikbaar uit. Zal het ff bestuderen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Misschien handig om iets te lezen over lexical scanning en tokenizen.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Grijze Vos schreef op 07 augustus 2004 @ 20:48:
Misschien handig om iets te lezen over lexical scanning en tokenizen.
Thx, heb vaker wat van beide termen gehoord, maar heb nooit begrepen waar ze goed voor zijn. Denk dat het toch maar eens tijd wordt dat ik dat uitzoek. :P Heb momenteel geen tijd om het te lezen, maar morgen wel. Daarom voor mezelf, maar meer voor anderen de links naar 2 interessant ogende pagina's over beide onderwerpen. :P
Lexical scanning
Tokenization

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 00:53

Reptile209

- gers -

NMe84 schreef op 07 augustus 2004 @ 20:24:
Goed punt. Zorgen dat als het een deel van een variabele is, het geen kleur te geven, dat is niet echt een probleem, omdat ik de regular expression zal laten matchen op hele woorden. In een string is het weer wat lastiger omdat het keyword daar weer als heel woord in zou kunnen staan. Misschien moet ik de regular expression de keywords eerst door een maffe string laten vervangen ( {[COLOR=darkred]} ofzo), die ik er later weer uit filter als ie overbodig is... Of is het mogelijk een regexp keywords binnen een string over te laten slaan?
En vergeet natuurlijk niet varianten als:
C:
1
2
3
4
5
6
7
8
9
10
11
int foo(void);
void bar(void *);

...

  foo();
  foo ();  // let op de spatie...
  bar(foo()); // wat nou: los woord...
  a = foo();
  a=foo();
...

ect... :)
Uurtje chatten met Chem voor wat tips-'n-tricks :X :D

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Je vergeet aan te geven of comments in de taal genest mogen zijn... er zijn talen waarbij dat niet zo is en iets als /* /* blabla */ meer commentaar */ niet gaat compileren omdat de eerste */ als einde commentaar gezien wordt.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Reptile209 schreef op 07 augustus 2004 @ 21:03:
En vergeet natuurlijk niet varianten als:
C:
1
//blaat

ect... :)
Uurtje chatten met Chem voor wat tips-'n-tricks :X :D
Daar val ik Chem niet voor lastig. :)

Lijkt ook niet zo moeilijk, gewoon een regexp maken die ongeveer hierop lijkt:
PHP:
1
preg_replace("/([a-zA-Z][a-zA-Z0-9]*)([\s].*?\()/si", "<b>\\1</b>\\2", $text);
Gerco schreef op 07 augustus 2004 @ 21:08:
Je vergeet aan te geven of comments in de taal genest mogen zijn... er zijn talen waarbij dat niet zo is en iets als /* /* blabla */ meer commentaar */ niet gaat compileren omdat de eerste */ als einde commentaar gezien wordt.
Dat gebeurt bij mijn weten in elke taal? :?

[ Voor 37% gewijzigd door NMe op 07-08-2004 21:10 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
NMe84 schreef op 07 augustus 2004 @ 20:58:
[...]

Thx, heb vaker wat van beide termen gehoord, maar heb nooit begrepen waar ze goed voor zijn. Denk dat het toch maar eens tijd wordt dat ik dat uitzoek. :P Heb momenteel geen tijd om het te lezen, maar morgen wel. Daarom voor mezelf, maar meer voor anderen de links naar 2 interessant ogende pagina's over beide onderwerpen. :P
Lexical scanning
Tokenization
Misschien heb je wat aan de sheets van compilers aan de TU/e.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

NMe84 schreef op 07 augustus 2004 @ 21:09:
Dat gebeurt bij mijn weten in elke taal? :?
Dan heb je het mis, want in Progress 4GL mag dat namelijk gewoon.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

Verwijderd

NMe84 schreef op 07 augustus 2004 @ 21:09:

Lijkt ook niet zo moeilijk, gewoon een regexp maken die ongeveer hierop lijkt:
PHP:
1
preg_replace("/([a-zA-Z][a-zA-Z0-9]*)([\s].*?\()/si", "<b>\\1</b>\\2", $text);
Dat zou ik dan weer helemaal afraden, en gewoon op een of andere manier de source tokenizen. Ik zou zeggen, kijk eerst eens naar hoe flex ongeveer werkt.

[ Voor 61% gewijzigd door Verwijderd op 07-08-2004 21:11 ]


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Het regeleinde teken is voor de commentaar met // een enter. Dit is voor de code die met een # begint ook zo. Echter voor de andere code is regeleinde een ;.

Verder mis ik de accolades in je config ;).

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

Shadowman schreef op 07 augustus 2004 @ 21:11:
Het regeleinde teken is voor de commentaar met // een enter. Dit is voor de code die met een # begint ook zo. Echter voor de andere code is regeleinde een ;.

Verder mis ik de accolades in je config ;).
; is niet altijd verplicht ;)

verder sluit ik me aan bij Cheatah: reguliere expressies zijn voor dit soort dingen gewoon niet handig en veels te foutgevoelig.
NMe84 schreef op 07 augustus 2004 @ 21:09:
[...]
PHP:
1
preg_replace("/([a-zA-Z][a-zA-Z0-9]*)([\s].*?\()/si", "<b>\\1</b>\\2", $text);
waarom a-zA-Z als je toch al de case-insensitive modifier gebruikt?
en waarom een characterclass voor maar 1 karakter? [\s]

[ Voor 41% gewijzigd door crisp op 07-08-2004 21:16 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Verwijderd schreef op 07 augustus 2004 @ 21:11:
Dat zou ik dan weer helemaal afraden, en gewoon op een of andere manier de source tokenizen. Ik zou zeggen, kijk eerst eens naar hoe flex ongeveer werkt.
Die regexp is het beste wat ik kon bedenken zonder kennis van tokenizers. :+ Ik probeerde er ook alleen mee aan te geven dat het niet zo heel lastig is volgens mij. :)
Shadowman schreef op 07 augustus 2004 @ 21:11:
Het regeleinde teken is voor de commentaar met // een enter. Dit is voor de code die met een # begint ook zo. Echter voor de andere code is regeleinde een ;.

Verder mis ik de accolades in je config ;).
Gewone haakjes en blokhaken ook. Maar die wou ik eigenlijk ook niet kleuren. Toch heb je een punt. :+
Bovendien had ik al 2 verschillende soorten commentaar bedacht, waarbij de ene single line is, en de 2e multiline tussen beide genoemde tekens, dus dat regeleinde had ik al ingecalculeerd. En bij die ; is het regeleinde eigenlijk irrelevant, omdat ik de syntax highlight, en niet op fouten controleer. :)
crisp schreef op 07 augustus 2004 @ 21:13:
waarom a-zA-Z als je toch al de case-insensitive modifier gebruikt?
Gewoonte denkik, je hebt gelijk. :P
crisp schreef op 07 augustus 2004 @ 21:13:
en waarom een characterclass voor maar 1 karakter? [\s]
Omdat ik er eigenlijk ook nog \t bij had staan voor tabs, maar bedacht me dat dat onder \s valt. Ben toen vergeten die blokhaken weg te halen. :)

[ Voor 19% gewijzigd door NMe op 07-08-2004 21:19 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
Een voorbeeld van de .stx-bestanden die EditPlus gebruikt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#DELIMITER=,(){}[]-+*%/="'~!&|<>?:;.#@
#QUOTATION1='
#QUOTATION2="
#CONTINUE_QUOTE=n
#LINECOMMENT=//
#LINECOMMENT2=#
#COMMENTON=/*
#COMMENTOFF=*/
#ESCAPE=\
#CASE=n
#PREFIX3=$
#HTML_EMBEDDED=y
#SCRIPT_BEGIN=<?
#SCRIPT_END=?>
#SKIP_QUOTE=y

#KEYWORD=Reserved words
array
bool
break
case
[ ... ]

#KEYWORD=Built-in functions
;Apache-specific Functions
apache_lookup_uri
apache_note
getallheaders
virtual
ascii2ebcdic
ebcdic2ascii

;Array Functions
array
array_count_values
array_diff

[ ... ]


Volgens mij pak EditPlus met deze aanpak wel zo'n beetje alles met de context-highlighting. Ik vind het van de stapels editors die ik heb geprobeerd, de prettigste (en bovendien snelste) context highlighting hebben.

Ik spoor veilig of ik spoor niet.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Anders schreef op 07 augustus 2004 @ 21:56:
Een voorbeeld van de .stx-bestanden die EditPlus gebruikt:

code:
1
//snip


Volgens mij pak EditPlus met deze aanpak wel zo'n beetje alles met de context-highlighting. Ik vind het van de stapels editors die ik heb geprobeerd, de prettigste (en bovendien snelste) context highlighting hebben.
offtopic:
TextPad heeft ook wel een dergelijke highlighting hoor, built-in functies hebben bij mij allemaal een eigen kleur. Maar ik heb eigenlijk geen idee hoe die syntax files in elkaar zitten, zou ik eigenlijk eens naar moeten kijken. Misschien kan ik ze wel gewoon overnemen. :+

[ Voor 30% gewijzigd door NMe op 07-08-2004 22:27 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 20:38

alienfruit

the alien you never expected

Ik gebruik het taaltje dat oorspronkelijk bij de TSyntaxMemo component zat, werkt prima.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
'</tfoot'       _non_alpha_              ht_TABLE_START         [ss_START]
'</thead'       _non_alpha_              ht_TABLE_START         [ss_START]
'>'             _dont_care_              ht_TABLE_END           [ss_INTABLE]        

'<style'        _non_alpha_             ht_STYLE_START          [ss_START]
'</style'       _non_alpha_             ht_STYLE_END            [ss_INSTYLE]

'<script'       _non_alpha_              ht_TAG_SCRIPT_START    [ss_START]
'</script'      _dont_care_              ht_TAG_SCRIPT_END      [ss_SCRIPT]
'<!--'          _dont_care_              ht_COMMENT_LINE        [ss_SCRIPT] 
'-->'           _dont_care_              ht_COMMENT_END         [ss_SCRIPT]

%%handler
ht_COMMENT          _all_chars_?            '->'            _use_
ht_CFML_COMMENT     _all_chars_?            '\-\-\-\>'      _use_
ht_COMMENT_LINE     '[^\n]'?                '\n'            _discard_
css_COMMENT_STAR    _all_chars_?            '*\/'           _use_

ht_ASP_TAG          _all_chars_?            '\%\>'          _use_
css_HEXNUMBER       '[0-9A-Fa-f]'           '[^0-9a-fA-F]'  _discard_

ht_TAG_SCRIPT_START _all_chars_?            '>'             _use_
ht_TAG_SCRIPT_END   _all_chars_?            '>'             _use_

//     Column 1          Token value
//     Column 2          Single start character specifier
//     Column 3          Single contains character specifier
//     Column 4          End sequence specifier
//     Column 5          Whether end sequence is part of lexeme
//     Column 6          Valid states for token

%%tokens
ht_WHITESPACE           '[\x01-\s]'                 '[\x01-\s]'?       '[^\x01-\s]'     _discard_    [ss_START]
ht_PLAIN_ID             __STD_IDENTIFIER                                                             
ht_SPECIAL              '&'                         '[^;\n\s]'?        '[;\n\s]'        _discard_

InState ss_INTAG
(
  ht_TAGNAME                __STD_IDENTIFIER    
  ht_ATTRIBUTE              __STD_HTML_STRING   
  ht_NUMBER                 __STD_NUMBER_OR_FP  
)

[ Voor 92% gewijzigd door alienfruit op 07-08-2004 22:03 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Hmm, ik heb wat gelezen over tokenizen, en het blijkt dat ik het concept allang ken, alleen niet met die naam. Had er van tevoren niet eens aan gedacht dat het hier ook toepasbaar was, ik hou denk ik teveel van regexps... :+
Ik heb for the time being maar Beautifier geïmplementeerd in phpBB, met wat aanpassingen, want ik vind het maar buggy, en die autoindent was niks. Zoals je hier kan zien bij de VBScript code onderaan kleurt ie de ene "if" wel, en de andere "if" niet. bovendien worden "Then en "Else" niet gekleurd, zal wel iets met het regeleinde wat er vlak achter staat te maken hebben. Maja, ik ga gewoon als ik een keer tijd vind mijn eigen highlighter schrijven, maar vooralsnog ben ik erachter dat het meer tijd gaat kosten dan ik momenteel vrij kan maken. 8)7

[ Voor 4% gewijzigd door NMe op 08-08-2004 23:17 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Of kijk eens naar de vim-syntaxhighlighting, je kan hier wel wat info vinden, en in de source van vim zelf natuurlijk.

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
@NMe84: Heb jij die regelnummering zelf geimplementeerd voor Beautifier, of lees ik ergens heel erg overheen in de code (en voorbeelden) :?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
beetle71 schreef op 09 augustus 2004 @ 12:14:
@NMe84: Heb jij die regelnummering zelf geimplementeerd voor Beautifier, of lees ik ergens heel erg overheen in de code (en voorbeelden) :?
Zelf gedaan, stelt niet zoveel voor. Gewoon de tekst doorgeven aan een functie, en die heb ik laten exploden op een regeleinde. Vervolgens een for lus die een variabele ophoogt en toevoegt aan de rij met getallen totdat ik het juiste aantal regels heb. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
NMe84 schreef op 09 augustus 2004 @ 12:57:
[...]

Zelf gedaan, stelt niet zoveel voor. Gewoon de tekst doorgeven aan een functie, en die heb ik laten exploden op een regeleinde. Vervolgens een for lus die een variabele ophoogt en toevoegt aan de rij met getallen totdat ik het juiste aantal regels heb. :)
Okee, dan knutsel ik dat ook erin, wilde even zeker weten dat ik niet iets aan het implementeren ben wat er al in zat :)

===========EDIT================

Mmm, er zit toch nog een probleem/moeilijkheid in die regelnummers.. (Dat 'probleem' zit overigens ook in de codehighlighter hier op GoT:
Voorbeeld (alleen ter illustratie!):
PHP:
1
2
if($highlighter->highlight_text($highlighter->load_file("../button/button.php"))=='hallo' || 
  $highlighter->highlight_text($highlighter->load_file("../button/button.php"))=='test'){

Ik heb hier de code 'gewrapped' met een echte enter en dat levert een nieuw regelnummer op (ongewenst), maar eigenlijk zou dat moeten gebeuren zoals jij het in je voorbeeld hebt gedaan(zie hieronder), dus er vindt wordwrapping plaats zonder dat de layout verneukt wordt. Maar dan met behoud van nummering!

Afbeeldingslocatie: http://www.iljamaas.nl/images/vb_fout.gif
Dus dat de breedte van de box de wrapping automatisch bepaald, maar dan gaat de regelnummering 'shiften'
Het resultaat dat ik zou willen is dit:
Afbeeldingslocatie: http://www.iljamaas.nl/images/vb_goed.gif
(ff gephotoshopped)

Dus dat het nummer van de regel dan ook echt meeschuift...
Ik heb dit geprobeerd door de regelnummers in een <span> te zetten en deze met een negatieve margin links van de code te drukken, dat levert optisch een goed resultaat, maar als je dan de code wilt kopieren uit de site kopieer je de regelnummers mee, en dat is natuurlijk het laatste wat ik wil.

Het gebruik van een tabel gaat ook niet zomaar werken, omdat er dan een 'beginstyle' in de ene cel kan zitten en het einde in een andere cel, bijv. bij een commentblok over meerdere regels.

Iemand een slim idee?

[ Voor 66% gewijzigd door beetle71 op 09-08-2004 13:50 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Als je dat zou willen doen dan moet je aparte tr's maken van elke regel, wat betekent dat je ook elke regel apart door Beautifier moet gaan halen denkik. Hier op GoT is dat probleem er trouwens helemaal niet omdat code hier zo breed wordt als maar nodig is, dus de nummers kloppen wel. Dat moet ik op mijn template nog ff instellen, weet alleen niet welke CSS setting ik dan moet hebben, maar dat zoek ik nog wel uit. :P


Overigens heb ik de functie gevonden die ik zocht. Ik wilde eerst helemaal niet explode op een newline, alleen om het aantal regels te weten te komen, maar ik wist niet meer welke andere functie het aantal voorkomens van een needle in een haystack kon teruggeven. Heb hem net gevonden: substr_count(). :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
NMe84 schreef op 09 augustus 2004 @ 13:54:
Hier op GoT is dat probleem er trouwens helemaal niet omdat code hier zo breed wordt als maar nodig is, dus de nummers kloppen wel. Dat moet ik op mijn template nog ff instellen, weet alleen niet welke CSS setting ik dan moet hebben, maar dat zoek ik nog wel uit. :P
Ja idd ;) , dat is eigenlijk ook precies wat ik bedoel. Of geen wrapping op je coderegels OF geen lekkere nummering OF niet te selecteren code...
zie ook dit voorbeeld (niet goed te selecteren code) (dit laatste maakt geen gebruik van beautifier maar van php's highlight_file() )

Misschien dat ik toch voor de laatste optie ga kiezen, dus de 'slecht' selecteerbare, maar dan met een extra 'copy code' button oid. Niet echt ideaal, maar ik vind de no_wrap optie niet prettig ivm layout vern...king. En 'rondvliegende' regenummers vind ik ook niet echt handig..

Je optie met TR's levert weer een probleem op met indenting etc. en idd regel voor regel door de highlighter halen :'(

Of mischien wel de handigste optie: GEEN REGELNUMMERS :?

[ Voor 5% gewijzigd door beetle71 op 09-08-2004 14:19 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Ik denk dat je inderdaad die 3 opties hebt, en verder niets. Je zou hooguit kunnen kijken of JavaScript een uitkomst is, maar voor zoiets simpels als dit ga ik geen gecompliceerd script schrijven. :)
Ik denk dat ik het op dezelfde manier op ga lossen als hier op GoT. Ik zet wel in mijn policy dat de layout niet verneukt mag worden, en dat wanneer dat wel gebeurt een post ge-edit moet worden ofzo. Desnoods als admin/moderator ff die edit doen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Elke regel in een eigen <DIV>.

Maar dan wordt (iig) Internet Explorer gek zodra je gaat selecteren...

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Verwijderd schreef op 09 augustus 2004 @ 16:09:
Elke regel in een eigen <DIV>.

Maar dan wordt (iig) Internet Explorer gek zodra je gaat selecteren...
...en ik van het maken van een template waar dat in werkt. :/

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Verwijderd schreef op 09 augustus 2004 @ 16:09:
Elke regel in een eigen <DIV>.

Maar dan wordt (iig) Internet Explorer gek zodra je gaat selecteren...
Dit gaat niet werken! Tenminste niet met de code_highlighters zoals die in dit topic besproken zijn. (tenzij je elke regel los door de highlighter haalt, maar ook dat gaat niet zomaar, bijv. bij strings tussen " " die over meer dan 1 regel gaan)

Je krijgt namelijk problemen met alles dat over meer dan 1 regel loopt.
Daarvan krijg je de <span class="COMMENTORANGE"> in de ene div en de </span> die daarbij hoort in het divje van de volgende regel..

Okee, ook dit is op te lossen, maar dan kan je idd net zo goed even een compleet nieuwe codehighlighter gaan schrijven.....

edit:
typo, en ;) ;) :X vor glashio hieronder......

[ Voor 8% gewijzigd door beetle71 op 09-08-2004 17:36 ]


Acties:
  • 0 Henk 'm!

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:13

glashio

C64 > AMIGA > PC

beetle71 schreef op 09 augustus 2004 @ 16:48:
[...]
Okee, ook dit is op te lossen, maar dan kan je idd net zo goet even een compleet nieuwe codehighlighter gaan schrijven.....
Daar draaide deze [topic] toch om ;)

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
glashio schreef op 09 augustus 2004 @ 17:25:
Daar draaide deze [topic] toch om ;)
Mjah, maar ach, dat regelnummer probleem is wel iets om bij stil te staan natuurlijk. :) De enige manier die ik kan bedenken om het echt synchroon te houden is met een table, en dan een aparte rij voor elke regel. Maar dat selecteert weer niet fijn, dus is het eigenlijk weer niet zo'n goed plan...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

// wat is er eigenlijk mis met scrollbars? Je kan er altijd nog met wat nifty javascript in- en uitklapbare code van maken (not included hier :P )

[ Voor 5% gewijzigd door crisp op 09-08-2004 22:29 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Ook een optie idd, maar dan kun je helaas weer niet in één oogopslag de hele regel zien, wat je bij wrapping wel zou hebben. Toch heb je gelijk: een scrollbar is de meest "cleane" oplossing. :)


Edit: Is er eigenlijk behalve de <pre> tag nog een manier om te zorgen dat die scrollbar zichtbaar wordt? Scheelt mij de moeite van het strippen van alle newline chars uit de tekst. :+
Trouwens, als ik een <div> in mijn table cell zet, dan zet FireFox een enter boven de code (wel binnen de div, niet in de td), en IE niet, terwijl er in de code geen enter staat... Best weird... :?

Naja, dan maar geen scrollbars. :+

[ Voor 54% gewijzigd door NMe op 10-08-2004 00:38 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

http://www.oisyn.nl/ helemaal vergeten met zijn C versie (wordt hier door react gebruikt lijkt me?)

Acties:
  • 0 Henk 'm!

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 19-09 09:59
Verwijderd schreef op 07 september 2004 @ 22:05:
http://www.oisyn.nl/ helemaal vergeten met zijn C versie (wordt hier door react gebruikt lijkt me?)
http://www.oisyn.nl/articles.php/11

Daar is hij te vinden. Dat is inderdaad een oplossing, een C versie die je wel als 'functie' kan gebruiken in PHP. Heb niet echt veel tijd gehad om er eens serieus naar te kijken, ik meen dat het gebaseerd was op Flex, niet?

zeroxcool.net - curity.eu


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

klopt :)

Ik geloof dat er ook een flex-achtige module bestaat voor php. Het voordeel daarvan is dat het dynamisch op te bouwen is, en dat je dus een snelle analyser kunt bouwen op basis van config files (bij die van mij kan dat niet, het wordt namelijk gecompileerd).

Overigens, heb je al bedacht hoe je de subtiele verschillende zoals bijvoorbeeld nummerformaten gaat ondersteunen? In C++ is -12.34e+43f bijvoorbeeld een geldig getal, maar onder PHP niet. In C++ mag er geen newline in een string zitten, in PHP weer wel. De manier van escapen in C++ en PHP is weer compleet anders dan dat van Delphi. Ik zie ook een special char in je config staan, in je C++ voorbeeld zie ik dat dat de # is, wat dus neerkomt op een preprocessor directive. Ben je je ervan bewust dat als je een #define afsluit met een \ dat ie dan verder gaat op de volgende regel? Maar dat er tussen de \ en de newline wel weer een comment mag staan? Imho zijn dat allemaal dingen die gewoon niet in een config file zijn onder te brengen, omdat ze zo enorm divers zijn :)

[mierenneuk-mode]
Ik mis overigens nogal wat keywords in je C++ config file, namelijk (op alfabetische volgorde): asm, const_cast, dynamic_cast, explicit, false, mutable, reinterpret_cast, static_cast, true, typeid, typename, using, virtual en wchar_t ;)
[/mierenneuk-mode]

[ Voor 56% gewijzigd door .oisyn op 08-09-2004 01:19 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
.oisyn schreef op 08 september 2004 @ 01:06:
Overigens, heb je al bedacht hoe je de subtiele verschillende zoals bijvoorbeeld nummerformaten gaat ondersteunen? In C++ is -12.34e+43f bijvoorbeeld een geldig getal, maar onder PHP niet. In C++ mag er geen newline in een string zitten, in PHP weer wel. De manier van escapen in C++ en PHP is weer compleet anders dan dat van Delphi. Ik zie ook een special char in je config staan, in je C++ voorbeeld zie ik dat dat de # is, wat dus neerkomt op een preprocessor directive. Ben je je ervan bewust dat als je een #define afsluit met een \ dat ie dan verder gaat op de volgende regel? Maar dat er tussen de \ en de newline wel weer een comment mag staan? Imho zijn dat allemaal dingen die gewoon niet in een config file zijn onder te brengen, omdat ze zo enorm divers zijn :)
Met de meeste dingen die je hier noemt heb ik inderdaad geen rekening gehouden. Ik ben bij die problemen ook nog niet uitgekomen omdat mijn projectje een beetje on-hold staat, heb momenteel belangrijkere dingen op stapel staan. :)
Over dat escapen heb ik overigens wel nagedacht, er staat een escapechar in. Maar aan de andere kant heb ik eigenlijk geen idee hoe escapen in Delphi werkt, nooit nodig gehad. :P
.oisyn schreef op 08 september 2004 @ 01:06:
[mierenneuk-mode]
Ik mis overigens nogal wat keywords in je C++ config file, namelijk (op alfabetische volgorde): asm, const_cast, dynamic_cast, explicit, false, mutable, reinterpret_cast, static_cast, true, typeid, typename, using, virtual en wchar_t ;)
[/mierenneuk-mode]
Ik had die keywords ook maar ff snel van een (niet al te professioneel ogende) site geplukt, omdat het daar een beetje makkelijk kopieerbaar op stond. :) Achteraf miste ik er ook een paar, maarja, achteraf blijkt ook maar weer dat die hele configfile impraktisch is. Je zegt zelf dat het niet in een configfile op te nemen is. Ik neem aan dat de enige bruikbare optie die over blijft, het hardcoded opnemen van de talen is?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

NMe84 schreef op 08 september 2004 @ 01:30:
omdat mijn projectje een beetje on-hold staat
oh, ik had nog niet gezien dat ie al een maand oud was 8)7
Maar aan de andere kant heb ik eigenlijk geen idee hoe escapen in Delphi werkt
Delphi kent dat volgens mij niet echt? Pascal iig niet, een dubbele ' werd een enkele ', en verder kent het geen escape sequences voor newline enzo. Dan moet je de string afsluiten en een chr (10) eraan plakken oid. Geloof ik tenminste, tijd geleden :)
Ik neem aan dat de enige bruikbare optie die over blijft, het hardcoded opnemen van de talen is?
Och, er zijn zat editors die gebruik maken van dit soort config files. Sommige gebruiken een simpele config file zoals jij deed, sommige hadden config files met hele scriptingmogelijkheden zodat je de quircks van de taal zelf kunt implementeren. Ik denk dat je op zich ook best kan voldoen met een simpele versie en er gewoon genoegen mee nemen dat ie niet perfect is. Hij hoeft zelf geen code te compileren dus op zich maakt dat ook niet zoveel uit ;) (en wanneer gebruik je die vage constructies nou, 't is voor een forum met korte code snippets, er worden niet hele projecten gepost)

[ Voor 77% gewijzigd door .oisyn op 08-09-2004 01:37 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Je kunt trouwens ook een heleboel .stx bestanden hier kant en klaar downloaden.

Ik heb trouwens ook een "universele" code highlighter gemaakt in PHP, hij gebruikt de standaard highlight_string() functie in php, maar die kun je ook heel goed gebruiken voor HTML/CSS/Javascript/Java en iedere andere programmeertaal die er een beetje op lijkt.

http://www.brainerror.net...hlight/highlight_code.php

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • Hielko
  • Registratie: Januari 2000
  • Laatst online: 21:56
het hardcoded opnemen van de talen is?
Lijkt me niet. Je moet gewoon een soort van taaltje defineren waarmee je kan beschrijven hoe andere talen eruit mogen zien.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
.oisyn schreef op 08 september 2004 @ 01:33:
Delphi kent dat volgens mij niet echt? Pascal iig niet, een dubbele ' werd een enkele ', en verder kent het geen escape sequences voor newline enzo. Dan moet je de string afsluiten en een chr (10) eraan plakken oid. Geloof ik tenminste, tijd geleden :)
Hmm, dan had ik het toch goed. Dan werkt die constructie met de "escapechar" in die configfile ook hier wel. :)
offtopic:
Voor een enter kun je trouwens ook gewoon #13#10 in de string gebruiken geloof ik. :)
.oisyn schreef op 08 september 2004 @ 01:33:
Och, er zijn zat editors die gebruik maken van dit soort config files. Sommige gebruiken een simpele config file zoals jij deed, sommige hadden config files met hele scriptingmogelijkheden zodat je de quircks van de taal zelf kunt implementeren. Ik denk dat je op zich ook best kan voldoen met een simpele versie en er gewoon genoegen mee nemen dat ie niet perfect is. Hij hoeft zelf geen code te compileren dus op zich maakt dat ook niet zoveel uit ;) (en wanneer gebruik je die vage constructies nou, 't is voor een forum met korte code snippets, er worden niet hele projecten gepost)
Mjah, heb je gelijk in. Maar ik streef altijd perfectie na, sterker nog, ik eis het vaak van mezelf. Hoewel dat natuurlijk ook slecht uit kan pakken, vind ik dat toch een goede eigenschap van mezelf, maarja, het maakt het soms ook wat lastiger voor me. :) Bovendien ben ik van plan de code zo te schrijven dat het te implementeren is in elke PHP file, en niet alleen op een forum, en als ik een version control systeem zou schrijven in PHP (ik noem maar iets), waarbij je ook de code kan bekijken, dan kunnen er natuurlijk wel hele projecten bij zitten. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1