Small Rebol
ldci29-Dec-2008/0:22:02+1:00
Salut à tous
Bonnes Fêtes de fin d'Année.
J'ai déposé sur le site http://www.rebol.org/ un petit script pour les débutants en Rebol.C'est un éditeur multi fenêtres qui permet également d'exécuter les scripts. Le programme contient les images ce qui explique sa taille relativement importante. Si on vire les images, le code est minimaliste.
C'est aussi un clin d'oeil à Small Basic de MS (http://msdn.microsoft.com/en-us/devlabs/cc950524.aspx).
Amitiés
Bertrand29-Dec-2008/10:53:37+1:00
Superbe !... C'est quand même mieux avec les images

Par ailleurs je ne connaissais pas ce Small Basic là. Il doit en exister deux ?

Bonne fin d'année
Bertrand30-Dec-2008/11:36:52+1:00
Après quelques essais : pas terrible ce Small Basic

Soi-disant destiné à l'apprentissage et aux débutants en programmation... Franchement il y a mieux, Rebol, par exemple


En ce qui concerne Small Rebol*, je voulais savoir comment il serait possible de rendre les tabulations actives dans l'éditeur. Histoire de faciliter l'indentation du code ?

* : Small Rebol est bien plus pratique que ce Small Basic (de MicroSoft), à la fois trop léger au niveau du langage et assez lourd au niveau de l'interface (lenteur de l'affichage et lenteur des programmes, etc.). Et puis Basic, aussi sympathique qu'il soit, n'est plus vraiment LE langage idéal pour débuter et comprendre les nouveaux paradigmes de la programmation... enfin, à mon avis... de profane
Philippe30-Dec-2008/13:16:19+1:00
Bertrand,

Sinon, tu ouvres une console View, et tu tapes :

editor none


On l'oublie trop souvent mais l'éditeur intégré permet de lancer des scripts, etc..Je ne sais pas s'il sera conservé en R3, mais parfois cela dépanne.

===Philippe
guest230-Dec-2008/14:43:21+1:00
Bertand, si je me souviens bien, le problème des tabulations non reconnues est classique quand on utilise le style area (ou le style text).
Il ne faut pas oublier de rajouter le mot clé as-is.
donc il faut chercher dans les layouts du script les utilisations du style area et vérifier qu'on a bien:
... area as-is ...
Bertrand30-Dec-2008/18:30:45+1:00
Bertrand,

Sinon, tu ouvres une console View, et tu tapes :

editor none


On l'oublie trop souvent mais l'éditeur intégré permet de lancer des scripts, etc..Je ne sais pas s'il sera conservé en R3, mais parfois cela dépanne.

===Philippe


Merci Philippe, c'est vrai que j'oublie parfois l'éditeur intégré, bien pratique. Mais c'est que j'écris bien souvent mes scripts directement dans un éditeur (Notepad2), sans toujours utiliser la console de Rebol, et je teste au coup par coup (ce sont en général de très petits et modestes scripts).

Mais pour le coup, je voulais juste fouiner un peu dans le code de Small Rebol pour apprendre de nouvelles choses. Guest2 me fait découvrir un mot clé as-is que je ne connaissais pas...

A propos d'éditeur, est-ce qu'il y aurait moyen, sur Windows, d'ouvrir un script Rebol directement dans l'éditeur intégré par un clique droit ? Quelle commande faut-il ajouter dans le champ Application utiliser pour exécuter cette action (dans Option des dossiers/Modification de type de fichier) ? Actuellement j'ai mis pour l'action nommée Editer : "C:\Program Files\NotePad2\Notepad2.exe" "%1"...
ldci30-Dec-2008/19:59:08+1:00
Merci pour les commentaires
Le code est libre de droit: à vous de le modifier et l'améliorer.
L'idéal serait une coloration syntaxique...
Quant à Small Basic, je partage le point de vue: rien ne vaut Rebol
A +
shadwolf5-Jan-2009/4:03:20+1:00
Fut un temps (hoooooo lointain tres lointain ...) ou Carl parlait justement de faire en sorte que l'editeur intégré prennent en compte les nouvelles "face" du nouveau "rebol/VIEW" equipant "R3" ( y a des guillemets partout car les noms sont plus les bons et comme ca risque encore de changer avant la version définitive par souci de clareté je garde des noms auquel on est habitués). C'etait a l'epoque ou CArl avait lancer l'idée de la "face" de text RTD (Rich Text Dialect) Du coup beaucoup esperaient que l'editeur deviendrait en fait un IDE integré directement a REBOL rebol devennant ainsi auto suffisant.

Impossible de vous dire ou cette idée en est ni meme si elle aura un jour une existance concrete.
(Ceci dit si la "face" RTE voie le jour il serra tjrs possible de faire un IDE avancé et de le mettre a disposition via le REBOL/View/Desktop ( enfin si ca aussi ca existe encore dans "R3")
Philippe5-Jan-2009/11:29:07+1:00
Salut,

D'après la doc sur le futur VID, le style Text (et ceux qui en découlent) prend en compte deux types d'inputs : soit une chaîne (string!), soit un bloc : dans ce dernier cas, on a du rich text :

text "ceci est simple"
text ["ceci"  yellow "est " red bold " du Rich text"]


Peut-être une piste ?

===Philippe
shadwolf8-Mar-2009/16:24:54+1:00
ldci >
L'idéal serait une coloration syntaxique..

Hihihi oui ... j'y travail mais c'est long ...Enfin faut dire aussi que la piste que j'ai prise c'est celle du 100% AGG ce qui me facilite pas la vie.

pour ceux que ca interresse voici le lien vers ma derniere version de travail sur le rich text et la coloration syntaxique

http://shadwolf.free.fr/RTE-line-Shad-07.r

(c'est libre de droit vous pouvez le reprendre l'améliorer
l'intégrer a vos projets pas de problème tout ce que je demande a la limite c'est qui si vous arrivé a faire concretement avancé la widget c'est de m'en faire part sur ce forum par example (ou ALTME ou mail etc...))
shadwolf8-Mar-2009/16:31:31+1:00
Ce qui me pose le plus de probleme c'est l'algorithme de calcul de la taille des lettre suivant leur taille. Actuellement j'utilise une speudo solution mais qui s'avère etre une impasse.

Speudo solution c'est d'imposer des taille Fixe 12 20 30 et de faire un switch avec des calculs de déplacement du curseur de texte qui sont fixes et adaptés pour ces formats. Enfin suivant la police utilisée un m et un i ou un l ont pas du tout la même taille ce qui pose aussi un ennorme probleme.

Bref si vous avez des idées sur le sujet je suis prenneur.
shadwolf8-Mar-2009/16:39:04+1:00
une autre piste mais là c'est juste pour la coloration syntaxique pure c'est a dire on a un texte ascii sans balise de prototypage (donc pas MakeDoc ni HTML par example) et on veux afficher des mots clef d'une certaine couleur pour rendre ca plus agréable a lire.
Ce serrait donc de prendre une area normal et de redessiner avec AGG par dessu les mots clef en couleur.

Je sais que DideC m'avais aidé a inséré dans une area des images pour marqué le saut de ligne (projet MDP-GUI) mais je suis pas certain que cela puis être employé telquel pour faire de la coloration syntaxique.

Ce que j'essai de faire avec RTE-line c'est plus dans l'optique de formater du texte en temps réel dans le but de conservé se formatage, ce qui plus compliqué que de faire simplement de la colorisation syntaxique (enfin je pense...)
guest29-Mar-2009/18:44:03+1:00
j'ai regardé le code du VID3 actuel et j'ai bien peur qu'on soit toujours assez loin d'une solution vraiment pratique pour faire de l'édition RTE.
A mon avis, il faudrait que le dialecte draw puisse gérer nativement le positionnement et la gestion d'un curseur, hors actuellement rien de cela n'est envisagé par la dream team Rebol.
Actuellement la gestion du curseur est uniquement possible dans les gobs de type text, ce qui limite fortement les possibilités (pas de dessin possible, pas d'inclusions d'images, que du texte avec des styles différents)

Il y'a longtemps j'avais fais une demande (passée inaperçue, une de plus) pour ajouter dans le dialecte draw une façon de capturer le positionnement à n'importe quel endroit d'un bloc draw (de la même façon que dans le dialect parse).
ex:
[ text "bidule" image img1 pos: text "toto"]/

Dans ce exemple (pos récuperai la position graphique (coordonnées graphique).
Ensuite pour gérer un curseur (qui pourrait être une image ayant les coordonnées de pos, il suffirait de déplacer la variable pos dans le bloc en veillant à splitter les textes quand c'est nécessaire (pour insérer pos: dans un texte).
C'est une idée comme une autre mais malheureusement Carl et les autres gurus n'ont jamais pensé à combler cette lacune du dialecte draw qui n'est donc utile que pour faire de l'affichage statique (non modifiable dynamiquement de façon simple).

Donc en résumé, Draw est vraiment très puissant et peut être utilisé pour rendre tout un tas de language markup (comme rtf).
Mais il possède donc 2 lacunes importantes:
- Aucune possibilité de "capturer" automatiquement la position de n'importe quel objet pour gérer l'édition de façon simple.
- Et incapacité de gérer l'affichage rapide (en utilisant efficacement le cliping) lorque le block draw couvre ou dépasse largement la zone affichable.
2 raisons qui le rendent inutilisable (ou presque) pour faire de l'édition graphique temps réel.
coccinelle14-Mar-2009/11:56:19+1:00
Fin 2006, j'avais écrit un script qui faisait déjà de jolie choses en matière d'édition de texte. Les choses principales étaient déjà pas mal gérées, tu peux retrouver la discussion de l'époque ici : http://www.digicamsoft.com/cgi-bin/rebelBB.cgi?thread=<15Nov2006151530004076100>

A l'époque, ce script n'avait intéressé personne même si tout le monde trouvait RTE indispensable. Je l'avais même envoyé à Carl et à Ashley (RebGUI) mais il faut croire que je n'étais pas classé dans guru digne d'intérêt.

Si cela t'amuse, toi ou quelqu'un autre, de le reprendre et le développer, le voici :

REBOL [
	Title: "Text Markup Dialect Style"
	Date: 31-Dec-2006
	Name: "TMD Style"
	Version: 0.8
	File: %tmd-style.r
	Home: http://www.ladyreb.org/wiki
	Author: "Marco (Coccinelle)"
	Owner: "Coccinelle"
	Rights: "Public Domain"
]

tmd-ctx: context [
	line-info: make system/view/line-info []
	item-face: make face [
			offset: 0x0
			size: 0x0
			edge: make face/edge []
			font: make face/font []
			para: make face/para []
			feel: make face/feel []
	]
	wrk-face: make face [
			offset: 0x0
			size: 0x0
			edge: make face/edge []
			font: make face/font []
			para: make face/para []
			feel: make face/feel []
	]
    key-to-insert: make bitset! #{
		01000000FFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
	}
    key-to-map: [
        #"^H" back-char
        #"^-" tab-char
        #"^~" del-char
        #"^M" enter
        #"^A" all-text
        #"^C" copy-text
        #"^X" cut-text
        #"^V" paste-text
        #"^T" clear-tail
    ]

; **********************************************************
; Parse the Text Markup Dialect and palce each piece of text
; **********************************************************
	tmd-render: func [
		face [object!]
		/local text stack info list row rule i current s w
	][
		if equal? face/checksum face/checksum: checksum remold [
			face/data face/size face/edge face/font face/para
		][
			return false
		]
; Initialize the local values
		stack: copy []
		face/list: copy []
		append row: copy [] current: context [
			offset: face/para/origin * 0x1
			size: 0x0
			font-size: 0
		]
		wrk-face/size: item-face/size: face/size - (2 * face/edge/size) - face/para/origin - face/para/margin
		wrk-face/edge: item-face/edge: make face/edge [
			effect: none
			size: 0x0
		]
		wrk-face/para: item-face/para: make face/para [
			origin: 0x0
			margin: 0x0
			indent: 0x0

		]
		wrk-face/font: item-face/font: make face/font [
			offset: 0x0
			space: 0x0
			align: 'left
			valign: 'top
		]

; -----------------------------------
; Parse the Text Markup Dialect block
; and set the horizontal position
;------------------------------------
		parse face/data rule: [(
			insert stack item-face/font
			item-face/font: make item-face/font []
		) any [
			into rule
		|
			s: set text string! (
; Initialize item to current text
 				item-face/text: text
				item-face/para/indent/x: current/size/x
				item-face/line-list: none
; Repeat for each line in the item (if the text is splitted into many lines)
				i: 0
				while [
; Get the line info
					textinfo item-face line-info i
				][
; If it's not the first line in the item
					if positive? i [
; Adjust the horizontal offset of the line
						current/offset/x: face/para/origin/x + switch face/font/align [
							left [0]
							center [(item-face/size/x - current/size/x) / 2]
							right [item-face/size/x - current/size/x]
						]
; Create a new line and set the vertical offset
						append row current: context [
							offset: (current/offset + current/size) * 0x1
							size: 0x0
							font-size: 0
						]
					]
; Calculates the item size
					wrk-face/text: copy/part line-info/start line-info/num-chars
					wrk-face/para: make item-face/para [indent/x: line-info/offset/x]
					wrk-face/font: item-face/font
					current/size/x: first caret-to-offset wrk-face tail wrk-face/text
					current/size/y: max current/size/y line-info/size/y
					current/font-size: max current/font-size wrk-face/font/size
; Append the item to the item list
					append face/list context [
;						data: s
						start: line-info/start
						num-chars: line-info/num-chars
						offset: line-info/offset
;						size: current/size - line-info/offset
						size: line-info/size
						font: item-face/font
						line: current
					]
; Loop foreach line in the item
					i: i + 1
				]
				item-face/font: make stack/1 []
			)
		|
; Style words
			[ set text 'bold | set text 'italic | set text 'underline] (
				item-face/font/style: union any [item-face/font/style copy []] reduce [text]
			)
		|
; Font words
			[set text 'font-serif | set text 'font-sans-serif | set text 'font-fixed] (item-face/font/name: text)
		|
			'font [
				set text string! (item-face/font/name: text)
			|
				set text block! (item-face/font: make item-face/font text)
			]
		|
			set text integer! (item-face/font/size: text)
		|
			set text tuple! (item-face/font/color: text)
		|
			set text word! (
				switch type?/word text: get text [
					integer! [item-face/font/size: text]
					tuple! [item-face/font/color: text]
				]
			)
		|
			skip
		](
			remove stack
			item-face/font: stack/1
		)]

; ---------------------------------------------
; Adjust the horizontal offset of the last line
; ---------------------------------------------
		current/offset/x: face/para/origin/x + switch face/font/align [
			left [0]
			center [(item-face/size/x - current/size/x) / 2]
			right [item-face/size/x - current/size/x]
		]

; --------------------------------------
; Set the vertical position of each item
; --------------------------------------
		foreach info face/list [
			info/offset/x: info/offset/x + info/line/offset/x
 			info/offset/y: info/line/offset/y + info/line/font-size - info/font/size

		]
		return true
	]

; *******************************************
; Build the draw block (called by redraw feel
; *******************************************
	tmd-redraw: func [
		face [object!]
		/local info draw highlight caret start end left center right
	][
		tmd-render face

; --------------------------
; And produce the draw block
; --------------------------
		draw: copy []
		start: none
		end: none
		if all [
			system/view/highlight-start
			system/view/highlight-end
			start: make tmd-offset-and-caret face system/view/highlight-start []
			end: make tmd-offset-and-caret face system/view/highlight-end []
		][
			if any [
				start/offset/y > end/offset/y
				all [
					start/offset/y = end/offset/y
					start/offset/x > end/offset/x
				]
			][
				highlight: start
				start: end
				end: highlight
			]
			start/offset/y: start/info/line/offset/y
			end/offset/y: end/info/line/offset/y + end/info/line/size/y
		]

		highlight: off
		foreach info face/list [
			text-start: info/start
			offset-start: info/offset

			text-end: at info/start info/num-chars
			offset-end: info/offset + (info/size/x * 1x0)

; ----------------------------------------------
; Draw the first part in case of highlight start
; ----------------------------------------------
			left: copy []
			if all [
				start end
				same? start/info/start info/start
			][
				if not same? text-start start/caret [
					left: compose [
						pen (info/font/color)
						text (copy/part text-start subtract index? start/caret index? text-start) (offset-start) aliased
					]
					offset-start/x: start/offset/x
					text-start: start/caret
				]
				highlight: on
			]

; ------------------------------------------
; Draw the end part in case of highlight end
; ------------------------------------------
			right: copy []
			if all [
				start end
				same? end/info/start info/start
			][
				if not same? text-end end/caret [
					offset-end/x: end/offset/x
					right: compose [
						pen (info/font/color)
						text (copy/part end/caret 1 + subtract index? text-end index? end/caret) (offset-end) aliased
					]
					text-end: back end/caret
				]
			]

; -----------------------------------------------
; Draw the middle part in case of highlight start
; -----------------------------------------------
			center: copy []
			center: either highlight [
				compose [
					pen (complement face/color)
					fill-pen (complement face/color)
					box (
						1x0 + (offset-start * 1x0) + (info/line/offset * 0x1)
					)(
						-1x0 + (offset-end/x * 1x0) + ((info/line/offset + info/line/size) * 0x1)
					)
					pen (complement info/font/color)
				]
			][
				compose [
					pen (info/font/color)
				]
			]
			append center compose [
				text (copy/part text-start 1 + subtract index? text-end index? text-start) (offset-start) aliased
			]
			
; ------------------------
; Reset the highlight flag
; ------------------------
			if all [
				start end
				same? end/info/start info/start
			][
				highlight: off
			]

; -------------------------------------------------------
; Append to the draw bloc the three piece of draw dialect
; -------------------------------------------------------
			append draw compose [
				font (info/font)
				(left)
				(center)
				(right)
			]
		]

; -------------------------
; Set the face effect block
; -------------------------
		face/effect: compose/only [
			draw (draw)
		]

; ----------------
; Manage the caret
; ----------------
		if face/caret [
 			face/pane/offset: (face/caret/offset * 1x0) + (face/caret/info/offset * 0x1)+ -1x1
 			face/pane/size: 5x0 + (face/caret/info/line/size * 0x1)
 			face/pane/font: face/caret/info/font
		]
	]

; **************************************************************************
; Calculates the caret and the offset based on the string or offset position
; **************************************************************************
	tmd-offset-and-caret: func [
		face [object!] "The face containing the text."
		offset [string! pair! object!]
		/local item list info result
	][
		if all [
			tmd-render face
			object? offset
		][
			offset: offset/caret
		]

		if object? offset [return offset]

		result: context [
			list: none
			info: none
			caret: none
			offset: none
		]

		list: face/list
		either string? offset [
			result/caret: offset
			forall list [
				info: first list 
				if all [
					same? head info/start head offset
					lesser-or-equal? index? info/start index? offset
					greater-or-equal? add index? info/start info/num-chars index? offset
				][
					result/list: list
					result/info: info
					break
				]
			]
		][
			forall list [
				info: first list 
				if within? offset 
					(info/offset * 1x0) + (info/line/offset * 0x1)
					(info/size * 1x0) + (info/line/size * 0x1)
				[
					result/list: list
					result/info: info
					break
				]
			]
		]
		unless result/info [return none]

		wrk-face/size: result/info/line/size
		wrk-face/size/x: face/size/x - (2 * face/edge/size/x) - face/para/origin/x - face/para/margin/x
		wrk-face/text: copy/part result/info/start result/info/num-chars
		wrk-face/edge/effect: none
		wrk-face/edge/size: 0x0
		wrk-face/para: make face/para [
			origin: 0x0
			margin: 0x0
			indent/x: 0
			indent/y: result/info/offset/y - result/info/line/offset/y
		]
		wrk-face/line-list: none
		wrk-face/font: result/info/font

		if pair? offset [
			result/caret: offset-to-caret wrk-face to pair! reduce [
				offset/x - result/info/offset/x
				wrk-face/para/indent/y
			]
			unless result/caret [return none]
			result/caret: at result/info/start index? result/caret
		]

		result/offset: caret-to-offset wrk-face at wrk-face/text 1 + subtract index? result/caret index? result/info/start
		unless result/caret [return none]

		result/offset: to pair! reduce [
			result/info/offset/x + result/offset/x
			result/info/line/offset/y
		]

		result
	]


; *************************************************
; Calculates the offset based on the caret position
; *************************************************
	tmd-to-offset: func [
		{Returns the offset position relative to the face of the character position.}
		face [object!] "The face containing the text."
		offset [any-string!] "The offset in the text."
		/local item info
	][
		if result: tmd-offset-and-caret face offset [
			result/offset
		]
	]

; *************************************************
; Calculates the caret based on the offset position
; *************************************************
	tmd-to-caret: func [
		{Returns the offset in the face's text corresponding to the offset pair.}
		face [object!] "The face containing the text."
		offset [pair!] "The XY offset relative to the face."
		/local result
	][
		if result: tmd-offset-and-caret face offset [
			result/caret
		]
	]

; *************************************************
; Move to caret
; *************************************************
	move-to-caret: func [
		face [object!] "The face containing the text."
		offset [string! pair! object!]
	][
		system/view/highlight-start: system/view/highlight-end: none
		face/caret: tmd-offset-and-caret face offset
		show face
	]

; *************************************************
; Highlight to caret
; *************************************************
	highlight-to-caret: func [
		face [object!] "The face containing the text."
		offset [string! pair! object!]
		/local wrk-caret
	][
		if wrk-caret: tmd-offset-and-caret face offset [
			unless face/caret [face/caret: wrk-caret]
			unless system/view/highlight-start [system/view/highlight-start: face/caret]
			system/view/highlight-end: face/caret: wrk-caret
			if same? system/view/highlight-start/caret system/view/highlight-end/caret [
				system/view/highlight-start: system/view/highlight-end: none
			]
		]
		show face
	]

; ************************
; Build the tmd-area style
; ************************
	stylize/master [
		tmd-area: area	feel [
			redraw: func [face act pos][
				if act = 'draw [
					if all [in face 'colors block? face/colors][
						face/color: pick face/colors face/pane <> system/view/focal-face
					]
					tmd-redraw face
				]
			]
			engage: func [
				face act event
				/local wrk-caret
			][
				switch act [
					down [ ; the main mouse button was pressed.
						unless same? face/pane system/view/focal-face [
							focus/no-show face/pane
						]
						move-to-caret face event/offset
					]
					over [ ; the mouse was moved over the face while the button was pressed.
						highlight-to-caret face event/offset
					]
					key [
						key: event/key
						if char? key [
							if all [
								find key-to-insert key
								face/caret
							][
								unlight-text
								face/caret: tmd-offset-and-caret face insert face/caret/caret key
								show face
								exit
							]
							unless key: select key-to-map key [
								exit
							]
						]
						switch key [
							left [
								if all [
									not head? face/caret/list
									head? face/caret/caret
								][
									face/caret/list: back face/caret/list
									face/caret/info: first face/caret/list
									face/caret/caret: tail face/caret/info/start
								]
								if not head? face/caret/caret [
									either event/shift [
										highlight-to-caret face back face/caret/caret
									][
										move-to-caret face back face/caret/caret
									]
									exit
								]
							]
							right [
								if all [
									not tail? next face/caret/list
									tail? face/caret/caret
								][
									face/caret/list: next face/caret/list
									face/caret/info: first face/caret/list
									face/caret/caret: head face/caret/info/start
								]
								if not tail? face/caret/caret [
									either event/shift [
										highlight-to-caret face next face/caret/caret
									][
										move-to-caret face next face/caret/caret
									]
									exit
								]
							]
						]
;						probe key
					]
				]
			]
		] para [
			wrap?: true
		] font [
			valign: 'bottom
		] with [
			words: reduce [
				'data func [new args][args]
			]
			me: does [self]
			init: [
				data: select facets 'data
				pane: make face compose/deep [
					offset: 0x0
					size: 0x0
					color: none
					text: ""
					edge: none
					para: make face/para [
						origin: 0x0
						margin: 0x0
						offset: 0x0
					]
					flags: none
					dirty?: none
					feel: make face/feel [
						redraw: func [face act pos][  ; Propagate the redraw event if the face lose the focus
							face: me
							if all [
								in face 'colors block? face/colors
								not-equal? face/color face/color: pick face/colors face/pane <> system/view/focal-face
							] [
								show face
							]
						]
						over: none
						detect: none
						engage: func [face act event][	; Propagate the engage event
							face: me
							face/feel/engage face act event
						]
					]
				]
			]
			data: none
			caret: none
			list: none
			checksum: none
		]
	]
]

; *****************
; Basic test window
; *****************
print "" 
view layout/size [
	across
	s: rotary "400x520" "300x520" "200x520" "100x520" [t/size: to-pair get-face s show t unfocus]
	a: rotary "left" "center" "right" [t/font/align: to-word get-face a show t unfocus ]
	return
	t: tmd-area 400x520 para [origin: 10x10 margin: 10x10] data [
		"This is an example of REBOL markup text."
		" Here the word " bold "bold" " is bolded. "
		bold "This entire sentence is bold."
		font [size: 28 name: 'font-sans-serif][" This is " bold italic 24 "bold and italic" ". "]
		"This text is " blue "blue in color" ". "
		"This text is " 200.80.40 "redish in color" ". "
		underline ["This is an " 24 "example of text "
		bold ["that " 18 "is bold " blue ["blue and " 48 ["REALLY BIG"]]] ". "]
		"And now it's normal text"
	]
] 440x600
probe t/data


 ask""
shadwolf18-Mar-2009/0:00:57+1:00
bon je vais étudier ca et voir si je peux avancer sur le sujet.

Et en effet ta widget est beaucoup plus avancée que la mienne.

reste que conceptuellement dans ta solution on part d'un texte formater et les modifications (ajouts de texte par example) reprennent le formatage courrant de l'endroit ou on insert ce nouveau texte je ne sais pas comment faire pour rendre cela vraiement dynamique.

Peut être qu'en fait la solution serrait de mélanger nos "solution" par example prendre ton moteur de rendu et ma façon d'organiser les données. Chaque char etant traité individuellement il est ainsi plus facile d'en modifier a volonter le format.

Tu traites le texte comme des blocs de texte ayant un format "unique" et qui leur appartient et a eux seul alors que dans un RTE normal n'importe quelle portion du texte est succeptible de voir son format et sa position modifiés par l'utilisateur en temps réel et a n'importe quel moment
(cf MS word ... ou openoffice word ^^)

C'est pas que ta solution me plaise pas ... (je suis un grand fan de coccinelle tout le monde le sait) mais a terme cette solution m'a parrue plus limitée (a tord peut etre) qu'une solution purement basée sur du live text drawing en utilisant uniquement AGG.

Tu part d'un format TDM et après on le modifie (ajout de texte)

Moi je part de rien du tout et on construit les données au fur et à mesure de la saisie.

Ceci étant dit moi je veux vraiment faire avancer le projet
Que ce soit ta solution ou la mienne peut m'importe.
Ce que je voudrai c'est arriver à réaliser cela.

Penses tu qu'on puisse faire une structure atomisée genre

["a" 1 "b" 2 "c" 1 "d" 2 ....] ou 1 et 2 renverrait au contenu d'une autre table qui contiendrait les formatages de texte
[['bold 14 255.0.0 ] ['underline 20 0.0.0]]

Ainsi on aurait le format TDM on le lit on le transpose en 2 tables une avec des char / indexe_format et l'autre avec les ( et dans le cas d'une colorisation syntaxique genre crimson editor on a que la couleur du text qui change en fait couleurs qui sont imposée et propagée a des liste de mots)
apres on crée nos faces "filles" pour chacun des char avec les format dont il dépend.

l'avantage c'est d'amener de la flexibilité dans le formatage l'inconvénient c'est d'avoir à clean les face filles a chaque redraw (donc a chaque action du clavier)
(et vu que rebol et la gestion de mémoire est pas top ca risque de bouffer une tonne de ramme a la longue)
shadwolf18-Mar-2009/0:40:54+1:00
Coccinelle tu as vu la face "doc" de la demo VID3? (c'est en réponse a ton non gurutage lol)

Perso je m'en fiche d'être considéré comme un guru ou pas du momment que mes widgets sont classes :P

Ceci dit on place la barre super haut avec le RTE. mais c'est formateur aussi.

Pour ce qui est de l'interret de ton code Coccinelle moi j'aime bien ton code même si dès que je vois carret-to-offset j'ai la migraine lol ^^...

La face doc est pas mal mais bon apparement c'est pas plus avancé que ne l'etait MakeDoc GUI (face compositing bouffage de mémoire...)

Mon but entre autre c'etait d'en finir avec le face compositing et le bouffage de mémoire. La face maman qui contient 200000 faces filles dans sa pane c'est moche je trouve mais ca c'est un avis purement personnel. Je me dit que VID est suffisement sympa pour faire autrement plus leger plus pratique.

Reste que AGG a pas moyen de déterminer "a la volée" la taille des lettres (en pixel) où bien j'ai pas trouvé comment faire.
shadwolf18-Mar-2009/0:55:10+1:00
Coccinelle si je comprend bien dans ton code tu as 2 passes pour le rendering une ou tu crée des face fille avec le texte et le format et une ou tu prend les informations de tailles de texte et de format de texte pour dessinner le texte avec AGG ?

face/list et les sous widget qui sont dedans te permettant de calculer au mieu la position des blocs de text que tu va dessiner avec AGG dans ton aréa ?
shadwolf18-Mar-2009/1:05:30+1:00
bon dans un premier temps on va essayer de réduire le niveau de difficultée.

On va se concentrer sur ce que souhaite ldci une widget qui affiche du texte coloriée avec numéro de ligne, ligne wrap etc...

on aura 6 block de mots identifiable et on pourra en changer la couleur.

Comme base je vais prendre les travaux de coccinelle.
coccinelle18-Mar-2009/16:10:09+1:00
Salut Shad,

Tu sais ma widget, c'était une ébauche pas du tout finie juste pour voir ce qu'il était possible de faire. Je ne me rapelle plus comment le code fonctionnait mais je crois que c'est à peu près ce que tu dis : une passe pour calculer les infos de taille et une passe pour dessiner le texte avec AGG.

Je n'ai pas vu la face "doc" de VID3 mais de toute façon, je ne vais pas la regarder vu que j'ai abandonné Rebol.

Je me souvent que la difficulté était double, calculer correctement la taille du texte et de retrouver la position du curseur dans le texte.

A part ça, je n'était pas allé plus loin mais il ne doit pas être difficile d'étendre les fonctions d'édition maintenant que la position du curseur est gérée correctement. Ce n'est qu'une question de gestion du block de texte. Seul les key left et right sont traitée, mais pour en faire quelque chose de bien, il faudrait traiter toutes les key contenues dans le block key-to-map ainsi que d'autres comme ^i italic, ^b blod, ^u underline.

Tu devrais d'abord essayer d'étendre mon widget avec le gras et après tu verras ce sera facile d'étendre le tout au bold, underline, font, color, etc...
shadwolf18-Mar-2009/20:55:48+1:00
hum ... pour de la colorisation syntaxique j'ai pas besoin d'un truc trop poussé.

Il me faut une passe pour lire le document brute depuis la fichier et le convertire en TDM (TDM convertie par ta widget en instruction draw)

Il me faut une widget qui supporte tout le mouvement de texte et la ca va pas étre marrant a faire (supprimer un element avec backspace ou suppr)

Enfin reste que la colorisation doit se faire aussi en temps réelle a partir de ce qui est saisi par l'utilisateur
et la ca devient plus compliqué.

Bref je vais essayer d'avancer sur le sujet on verra ce que ca donne quitte a refaire tout. Je retient ta méthode pour calculer la taille des caractere

Y a aussi un autre problème ta widget ne gère pas plusieur ligne de texte mais 1 seule ligne.

Le probleme de position offset du curseur par rapport au coordonnée dans la liste a mon avis on peux le régler assez simplement en traitant lettre par lettre comme le curseur ne se déplace que de lettre en lettre si on a une structure du genre
[ pos lettre index_formatage] faire des recherche des suppression des décalage etc... devient plus facil je pense.
ldci20-Mar-2009/10:14:42+1:00
Salut
Pour ceux qui sont sous Mac OSX et qui utilisent TextWrangler, j'ai créé un fichier rebol.plist qui assure la coloration syntaxique du code rebol.
Récupérez le code ci-joint; sauvez le comme rebol.plist et installez le dans le répertoire /Users/yourname/Library/Application Support/TextWrangler/Language Modules
Au besoin créez le repertoire Langage Modules

Voici le code

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>BBEditDocumentType</key>
   <string>CodelessLanguageModule</string>
   <key>BBLMCanSpellCheckCodeRuns</key>
   <true/>
   <key>BBLMColorsSyntax</key>
   <true/>
   <key>BBLMIsCaseSensitive</key>
   <false/>
   <key>BBLMKeywordList</key>
   <array>
      <string>+</string>
      <string>-</string>
      <string>/</string>
      <string>//</string>
      <string>?</string>
      <string>??</string>
      <string>about</string>
      <string>abs</string>
      <string>absolute</string>
      <string>action?</string>
      <string>add</string>
      <string>alert</string>
      <string>alias</string>
      <string>all</string>
      <string>also</string>
      <string>alter</string>
      <string>and</string>
      <string>and~</string>
      <string>any</string>
      <string>any-block?</string>
      <string>any-function?</string>
      <string>any-string?</string>
      <string>any-type?</string>
      <string>any-word?</string>
      <string>append</string>
      <string>arccosine</string>
      <string>arcsine</string>
      <string>arctangent</string>
      <string>array</string>
      <string>as-binary</string>
      <string>as-pair</string>
      <string>as-string</string>
      <string>ask</string>
      <string>at</string>
      <string>attempt</string>
      <string>back</string>
      <string>binary?</string>
      <string>bind</string>
      <string>bind?</string>
      <string>bitset?</string>
      <string>block?</string>
      <string>bound?</string>
      <string>break</string>
      <string>brightness?</string>
      <string>browse</string>
      <string>build-attach-body</string>
      <string>build-markup</string>
      <string>build-tag</string>
      <string>call</string>
      <string>caret-to-offset</string>
      <string>case</string>
      <string>catch</string>
      <string>center-face</string>
      <string>change</string>
      <string>change-dir</string>
      <string>char?</string>
      <string>charset</string>
      <string>checksum</string>
      <string>choose</string>
      <string>clean-path</string>
      <string>clear</string>
      <string>clear-face</string>
      <string>clear-fields</string>
      <string>close</string>
      <string>comment</string>
      <string>complement</string>
      <string>component?</string>
      <string>compose</string>
      <string>compress</string>
      <string>confine</string>
      <string>confirm</string>
      <string>connected?</string>
      <string>construct</string>
      <string>context</string>
      <string>copy</string>
      <string>copy*</string>
      <string>cosine</string>
      <string>cp</string>
      <string>create-link</string>
      <string>crypt-strength?</string>
      <string>cvs-date</string>
      <string>cvs-version</string>
      <string>datatype?</string>
      <string>date?</string>
      <string>dbug</string>
      <string>debase</string>
      <string>decimal?</string>
      <string>decloak</string>
      <string>decode-cgi</string>
      <string>decode-url</string>
      <string>decompress</string>
      <string>deflag-face</string>
      <string>dehex</string>
      <string>delete</string>
      <string>delete-dir</string>
      <string>desktop</string>
      <string>detab</string>
      <string>dh-compute-key</string>
      <string>dh-generate-key</string>
      <string>dh-make-key</string>
      <string>difference</string>
      <string>dir?</string>
      <string>dirize</string>
      <string>disarm</string>
      <string>dispatch</string>
      <string>divide</string>
      <string>do</string>
      <string>do-boot</string>
      <string>do-browser</string>
      <string>do-events</string>
      <string>do-face</string>
      <string>do-face-alt</string>
      <string>do-thru</string>
      <string>does</string>
      <string>draw</string>
      <string>dsa-generate-key</string>
      <string>dsa-make-key</string>
      <string>dsa-make-signature</string>
      <string>dsa-verify-signature</string>
      <string>dump-face</string>
      <string>dump-obj</string>
      <string>dump-pane</string>
      <string>echo</string>
      <string>edge-size?</string>
      <string>editor</string>
      <string>eighth</string>
      <string>either</string>
      <string>else</string>
      <string>email?</string>
      <string>emailer</string>
      <string>empty?</string>
      <string>enbase</string>
      <string>encloak</string>
      <string>entab</string>
      <string>equal?</string>
      <string>error?</string>
      <string>even?</string>
      <string>event?</string>
      <string>exclude</string>
      <string>exists-thru?</string>
      <string>exists?</string>
      <string>exit</string>
      <string>exp</string>
      <string>extract</string>
      <string>fifth</string>
      <string>file?</string>
      <string>find</string>
      <string>find-key-face</string>
      <string>find-window</string>
      <string>first</string>
      <string>first+</string>
      <string>flag-face</string>
      <string>flag-face?</string>
      <string>flash</string>
      <string>focus</string>
      <string>for</string>
      <string>forall</string>
      <string>foreach</string>
      <string>forever</string>
      <string>form</string>
      <string>forskip</string>
      <string>found?</string>
      <string>fourth</string>
      <string>free</string>
      <string>func</string>
      <string>function</string>
      <string>function?</string>
      <string>get</string>
      <string>get-env</string>
      <string>get-face</string>
      <string>get-modes</string>
      <string>get-net-info</string>
      <string>get-style</string>
      <string>get-word?</string>
      <string>greater-or-equal?</string>
      <string>greater?</string>
      <string>halt</string>
      <string>has</string>
      <string>hash?</string>
      <string>head</string>
      <string>head?</string>
      <string>help</string>
      <string>hide</string>
      <string>hide-popup</string>
      <string>hilight-all</string>
      <string>hilight-text</string>
      <string>hsv-to-rgb</string>
      <string>if</string>
      <string>image?</string>
      <string>import-email</string>
      <string>in</string>
      <string>in-dir</string>
      <string>in-window?</string>
      <string>index?</string>
      <string>info?</string>
      <string>inform</string>
      <string>input</string>
      <string>input?</string>
      <string>insert</string>
      <string>insert-event-func</string>
      <string>inside?</string>
      <string>install</string>
      <string>integer?</string>
      <string>intersect</string>
      <string>issue?</string>
      <string>join</string>
      <string>last</string>
      <string>launch</string>
      <string>launch-thru</string>
      <string>layout</string>
      <string>length?</string>
      <string>lesser-or-equal?</string>
      <string>lesser?</string>
      <string>library?</string>
      <string>license</string>
      <string>link-app?</string>
      <string>link-relative-path</string>
      <string>link?</string>
      <string>list-dir</string>
      <string>list?</string>
      <string>lit-path?</string>
      <string>lit-word?</string>
      <string>load</string>
      <string>load-image</string>
      <string>load-stock</string>
      <string>load-stock-block</string>
      <string>load-thru</string>
      <string>local-request-file</string>
      <string>log-10</string>
      <string>log-2</string>
      <string>log-e</string>
      <string>logic?</string>
      <string>loop</string>
      <string>lowercase</string>
      <string>make</string>
      <string>make-dir</string>
      <string>make-face</string>
      <string>max</string>
      <string>maximum</string>
      <string>maximum-of</string>
      <string>min</string>
      <string>minimum</string>
      <string>minimum-of</string>
      <string>mod</string>
      <string>modified?</string>
      <string>modulo</string>
      <string>mold</string>
      <string>money?</string>
      <string>move</string>
      <string>multiply</string>
      <string>native</string>
      <string>native?</string>
      <string>negate</string>
      <string>negative?</string>
      <string>net-error</string>
      <string>new-line</string>
      <string>new-line?</string>
      <string>next</string>
      <string>ninth</string>
      <string>none?</string>
      <string>not</string>
      <string>not-equal?</string>
      <string>notify</string>
      <string>now</string>
      <string>number?</string>
      <string>object?</string>
      <string>odd?</string>
      <string>offset-to-caret</string>
      <string>offset?</string>
      <string>op?</string>
      <string>open</string>
      <string>open-events</string>
      <string>or</string>
      <string>or~</string>
      <string>outside?</string>
      <string>overlap?</string>
      <string>pair?</string>
      <string>paren?</string>
      <string>parse</string>
      <string>parse-email-addrs</string>
      <string>parse-header</string>
      <string>parse-header-date</string>
      <string>parse-xml</string>
      <string>path</string>
      <string>path-thru</string>
      <string>path?</string>
      <string>pick</string>
      <string>poke</string>
      <string>port?</string>
      <string>positive?</string>
      <string>power</string>
      <string>prin</string>
      <string>print</string>
      <string>probe</string>
      <string>protect</string>
      <string>protect-system</string>
      <string>q</string>
      <string>query</string>
      <string>quit</string>
      <string>random</string>
      <string>read</string>
      <string>read-cgi</string>
      <string>read-io</string>
      <string>read-net</string>
      <string>read-thru</string>
      <string>recycle</string>
      <string>reduce</string>
      <string>refinement?</string>
      <string>reform</string>
      <string>rejoin</string>
      <string>remainder</string>
      <string>remold</string>
      <string>remove</string>
      <string>remove-each</string>
      <string>remove-event-func</string>
      <string>rename</string>
      <string>repeat</string>
      <string>repend</string>
      <string>replace</string>
      <string>request</string>
      <string>request-color</string>
      <string>request-date</string>
      <string>request-dir</string>
      <string>request-download</string>
      <string>request-file</string>
      <string>request-list</string>
      <string>request-pass</string>
      <string>request-text</string>
      <string>resend</string>
      <string>reset-face</string>
      <string>resize-face</string>
      <string>return</string>
      <string>reverse</string>
      <string>rgb-to-hsv</string>
      <string>round</string>
      <string>routine?</string>
      <string>rsa-encrypt</string>
      <string>rsa-generate-key</string>
      <string>rsa-make-key</string>
      <string>run</string>
      <string>same?</string>
      <string>save</string>
      <string>save-user</string>
      <string>screen-offset?</string>
      <string>script?</string>
      <string>scroll-drag</string>
      <string>scroll-face</string>
      <string>scroll-para</string>
      <string>second</string>
      <string>secure</string>
      <string>select</string>
      <string>send</string>
      <string>series?</string>
      <string>set</string>
      <string>set-face</string>
      <string>set-font</string>
      <string>set-modes</string>
      <string>set-net</string>
      <string>set-para</string>
      <string>set-path?</string>
      <string>set-style</string>
      <string>set-user</string>
      <string>set-user-name</string>
      <string>set-word?</string>
      <string>seventh</string>
      <string>shift</string>
      <string>show</string>
      <string>show-popup</string>
      <string>sign?</string>
      <string>sine</string>
      <string>sixth</string>
      <string>size-text</string>
      <string>size?</string>
      <string>skip</string>
      <string>sort</string>
      <string>source</string>
      <string>span?</string>
      <string>split-path</string>
      <string>square-root</string>
      <string>stats</string>
      <string>strict-equal?</string>
      <string>strict-not-equal?</string>
      <string>string?</string>
      <string>struct?</string>
      <string>stylize</string>
      <string>subtract</string>
      <string>suffix?</string>
      <string>switch</string>
      <string>tag?</string>
      <string>tail</string>
      <string>tail?</string>
      <string>take</string>
      <string>tangent</string>
      <string>tenth</string>
      <string>textinfo</string>
      <string>third</string>
      <string>throw</string>
      <string>throw-on-error</string>
      <string>time?</string>
      <string>to</string>
      <string>to-binary</string>
      <string>to-bitset</string>
      <string>to-block</string>
      <string>to-char</string>
      <string>to-datatype</string>
      <string>to-date</string>
      <string>to-decimal</string>
      <string>to-email</string>
      <string>to-error</string>
      <string>to-file</string>
      <string>to-get-word</string>
      <string>to-hash</string>
      <string>to-hex</string>
      <string>to-idate</string>
      <string>to-image</string>
      <string>to-integer</string>
      <string>to-issue</string>
      <string>to-itime</string>
      <string>to-library</string>
      <string>to-list</string>
      <string>to-lit-path</string>
      <string>to-lit-word</string>
      <string>to-local-file</string>
      <string>to-logic</string>
      <string>to-money</string>
      <string>to-none</string>
      <string>to-pair</string>
      <string>to-paren</string>
      <string>to-path</string>
      <string>to-port</string>
      <string>to-rebol-file</string>
      <string>to-refinement</string>
      <string>to-relative-file</string>
      <string>to-set-path</string>
      <string>to-set-word</string>
      <string>to-string</string>
      <string>to-tag</string>
      <string>to-time</string>
      <string>to-tuple</string>
      <string>to-url</string>
      <string>to-word</string>
      <string>trace</string>
      <string>trim</string>
      <string>try</string>
      <string>tuple?</string>
      <string>type?</string>
      <string>unfocus</string>
      <string>uninstall</string>
      <string>union</string>
      <string>unique</string>
      <string>unless</string>
      <string>unlight-text</string>
      <string>unprotect</string>
      <string>unset</string>
      <string>unset?</string>
      <string>until</string>
      <string>unview</string>
      <string>update</string>
      <string>upgrade</string>
      <string>uppercase</string>
      <string>url?</string>
      <string>Usage</string>
      <string>use</string>
      <string>value?</string>
      <string>vbug</string>
      <string>view</string>
      <string>viewed?</string>
      <string>viewtop</string>
      <string>wait</string>
      <string>what</string>
      <string>what-dir</string>
      <string>while</string>
      <string>win-offset?</string>
      <string>within?</string>
      <string>word?</string>
      <string>write</string>
      <string>write-io</string>
      <string>write-user</string>
      <string>xor</string>
      <string>xor~</string>
      <string>zero?</string>
   </array>
   <key>BBLMLanguageCode</key>
   <string>rebc</string>
   <key>BBLMLanguageDisplayName</key>
   <string>Rebol</string>
   <key>BBLMScansFunctions</key>
   <true/>
   <key>BBLMSuffixMap</key>
   <array>
      <dict>
         <key>BBLMLanguageSuffix</key>
         <string>.r</string>
      </dict>
   </array>
   <key>Language Features</key>
   <dict>
      <key>Close Block Comments</key>
      <string></string>
      <key>Close Parameter Lists</key>
      <string></string>
      <key>Close Statement Blocks</key>
      <string></string>
      <key>Close Strings 1</key>
      <string>"</string>
      <key>Close Strings 2</key>
      <string>}</string>
      <key>End-of-line Ends Strings 1</key>
      <false/>
      <key>End-of-line Ends Strings 2</key>
      <false/>
      <key>Escape Char in Strings 1</key>
      <string>\</string>
      <key>Escape Char in Strings 2</key>
      <string>\</string>
      <key>Identifier and Keyword Characters</key>
      <string>0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz-?</string>
      <key>Open Block Comments</key>
      <string></string>
      <key>Open Line Comments</key>
      <string>;</string>
      <key>Open Parameter Lists</key>
      <string></string>
      <key>Open Statement Blocks</key>
      <string></string>
      <key>Open Strings 1</key>
      <string>"</string>
      <key>Open Strings 2</key>
      <string>{</string>
   </dict>
</dict>
</plist>

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2