Linux::EditorGadget() Enrichir texte comme ss Windows

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Linux::EditorGadget() Enrichir texte comme ss Windows

Message par Ollivier »

Bonjour,

je déplace ma question ici.

C'est donc pour savoir s'il y a un équivalent RTF sous Linux?
(Ajouté : pour l'utilisation de EditorGadget() )
Dernière modification par Ollivier le dim. 30/août/2015 10:49, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Equivalent RTF sous Linux

Message par Ar-S »

Je sais que Abiword peut lire le RTF, je suppose que libre office aussi, c'est tout ce que je peux te dire.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Equivalent RTF sous Linux

Message par Ollivier »

Même si c'est démodé, c'est un moyen très simple d'enrichir un texte.
Ce serait dommage que ça reste indispo sous Linux.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Equivalent RTF sous Linux

Message par Ollivier »

@Spock

Je doute de trouver les infos sur le forum EN. Sur ce forum, il y a notre assez ancienne discussion (il y a quelques années en tout cas), si elle n'a pas été effacé sur ce forum-ci.

Je ne sais pas si tu te souviens, on injectait du RTF les yeux fermés avec SetGadgetText() dans un EditorGadget().

C'est précisément ce procédé qui est intéressant. En une quarantaine de lignes, on se passe de Scintilla. C'est quand même appréciable!

Penses-tu que l'on puisse injecter du HTML de la même manière?
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Linux::EditorGadget() Enrichir texte comme ss Windows

Message par Ollivier »

Spock a écrit : ps: contrairement a ce que tu affirmes , un simple SetGadgetText() , ne simplifie pas le probleme
car RTF demande un context !
pour qu'il écrive en couleur, il te faut préparer ta palette , a l'avance ... c'est un exemple , mais l'air de rien
ça ajoute pas mal de lignes
Meuh tu rigoles toi! Tout est à la volée, au scope entier, ou à la ligne près. C'était Octavius qui nous a fait partager ça sur ce forum! Mais c'est sous Windows. J'ignore pour les autres OS.

Je cherche à savoir si Linux a une intégration similaire (même en HTML, c'est bien).
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Linux::EditorGadget() Enrichir texte comme ss Windows

Message par Ollivier »

Spock a écrit :apparemment, fonctionne sous Linux
Si ça s'avère exact, ce serait de la balle.
Sous quels OS t'as testé?

(Edité) Je précise que c'est du RTF que je parle.
Dernière modification par Ollivier le dim. 30/août/2015 11:31, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Linux::EditorGadget() Enrichir texte comme ss Windows

Message par falsam »

ça ne fonctionne pas sous linux (Testé sous Linux Mint). Ne connaissant pas les API linux, je ne pourrais pas t'aider.

Toufefois un lien sur quelques API linux. Regarde l'EditorGadget
http://www.chabba.de/LinuxAPI.html
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Linux::EditorGadget() Enrichir texte comme ss Windows

Message par Ollivier »

@Falsam

Merci pour ce lien bien qu'il n'aborde pas le sujet des polices et couleurs dans l'éditorgadget.
Falsam a écrit :ça ne fonctionne pas sous linux (Testé sous Linux Mint). Ne connaissant pas les API linux,
je ne pourrais pas t'aider.
Loin d'être maso, je me dois cependant de te remercier pour la douche froide...

J'espère bien que tes tests, c'est le RTF (avant-dernier) testé sous Linux, non pas le HTML (dernier code)

Il y a aussi le critère UNICODE/ASCII que j'ai oublié de citer.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Linux::EditorGadget() Enrichir texte comme ss Windows

Message par Ollivier »

Houla... Ce code-là va passer au banc d'essai...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Linux::EditorGadget() Enrichir texte comme ss Windows

Message par Ollivier »

MultibyteToWideChar_()

Qu'est-ce que c'est que ce machin?
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Linux::EditorGadget() Enrichir texte comme ss Windows

Message par Ollivier »

Non non c'est très bien ton histoire de webmachin.

Par contre, je ne comprends pas qu'il parlent du code de page Macintosh dans la doc Microsoft... Je ne suis pas dans le coup, là... Microsof et Macintosh vont fusionner ou quoi?
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Linux::EditorGadget() Enrichir texte comme ss Windows

Message par G-Rom »

le RTF est juste une spécification Microsoft, les logiciels sous Linux l'implémente ou non, le plus simple, je pense est de convertir ton RTF en HTML et de passer par un webgadget.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Linux::EditorGadget() Enrichir texte comme ss Windows

Message par Ar-S »

Autant scintilla fonctionne sous W10 que les commandes RTF ne fonctionnent plus.

Code : Tout sélectionner

Define rtf.s

rtf = "{\rtf1\ansi\ansicpg1252\deff0\deflang1036{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}"
rtf + "{\f1\fswiss\fcharset0 Arial;}}"
rtf + "{\colortbl ;\red0\green0\blue255;\red255\green0\blue0;\red128\green128\blue128;}"
rtf + "{\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\qc\cf1\ul\b\f0\fs52 PureBasic Language\par"
rtf + "\cf0\ulnone\b0 Version 4.10 \par"
rtf + "\cf2\fs32 Beta 2\par" ; couleur est defini par cfx le x egale a la position e la couleur dans la table
rtf + "\cf3 For Windows, Linux, MacOS\cf2\f1\fs20\par }"

OpenWindow(0, 0, 0, 540, 200, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

EditorGadget(0, 10, 10, 520, 180)
SetGadgetText(0, rtf)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
; Epb
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Linux::EditorGadget() Enrichir texte comme ss Windows

Message par Ar-S »

ah oui merde désolé.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Linux::EditorGadget() Enrichir texte comme ss Windows

Message par Ollivier »

Bon... J'ai un peu fait dans la colle mais déjà, ça simplifie le problème en cas de conversion.

C'est un simple visualisateur de code source fait grâce au RTF dans l'EditorGadget ss Windows. Ce n'est pas grandiose, mais bon...

Code : Tout sélectionner

 ;{ Suppl�ment }

;- Window

Procedure WindowSize(Window, *W.INTEGER, *H.INTEGER)
	
	*W\I = WindowWidth(Window)
	*H\I = WindowHeight(Window)
EndProcedure

;- Compiler options

Global CompilerProgram.I
Global CompilerMessage.S
Global CompilerBasicFile.S
Global CompilerFunctionQuantity.I

Procedure.S CompilerRead()
	CompilerMessage = ReadProgramString(CompilerProgram)
	ProcedureReturn CompilerMessage
EndProcedure

Procedure.I CompilerWrite(Message.S)
	ProcedureReturn WriteProgramStringN(CompilerProgram, Message)
EndProcedure

Procedure.I CompilerOpen()
	CompilerProgram = RunProgram("PbCompiler.EXE", "/STANDBY", #PB_Compiler_Home + "\Compilers", #PB_Program_Open | #PB_Program_Read | #PB_Program_Write | #PB_Program_Hide)
	CompilerRead()
	CompilerRead()	
EndProcedure

Procedure.I CompilerClose()
	CompilerWrite("END")
EndProcedure

Procedure.I CompilerFunctionListLoad(*RtSetKeyword, Color.I, Alinea.I, KeywordType.I)
	Protected Result, n, Message.S, FunctionName.S
	CompilerOpen()
	If CompilerProgram
		CompilerWrite("FUNCTIONLIST")
		CompilerFunctionQuantity = Val(CompilerRead() )
		n = 0
		Repeat
			Message = CompilerRead()
			n + 1
			FunctionName = StringField(Message, 1, " ")
			CallFunctionFast(*RtSetKeyword, @FunctionName, Color, Alinea, KeywordType)
		Until Message = "OUTPUT" + Chr(9) + "COMPLETE"
		If n = CompilerFunctionQuantity + 1
			Result = 1
		EndIf
		CompilerClose()	
	EndIf
	ProcedureReturn Result
EndProcedure

;- Rich text String

Procedure.S Rich(Text.S) ; merci Octavius
	
	fonte0$ = "{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}" ; d�sign� par \f0 
	fonte1$ = "{\f1\fswiss\fcharset0 Arial;}" ; d�sign� par \f1 
	fonte2$ = "{\f2\fcharset0 Courier;}}" ; d�sign� par \f2 
	table_couleur$ = "{\colortbl ;\red0\green0\blue127;\red0\green127\blue0;\red0\green127\blue127;"
	table_couleur$ + "\red127\green0\blue0;\red127\green0\blue127;\red191\green127\blue0;\red127\green127\blue127;" 
	table_couleur$ + "\red63\green63\blue63;\red0\green0\blue255;\red0\green255\blue0;\red0\green255\blue255;"
	table_couleur$ + "\red255\green0\blue0;\red255\green0\blue255;\red255\green255\blue0;\red255\green255\blue255;}" 
	langue$ = "{\deflang1036}"
	ProcedureReturn "{\rtf1\ansi " + langue$ + table_couleur$ + fonte0$ + fonte1$ + fonte2$ + Text + "}"	
EndProcedure

Procedure.S RichChar(IT.S, Chars.S)
	CharsQuantity = Len(Chars)
	For I = 1 To CharsQuantity
		A.S = Mid(Chars, I, 1)
		IT = ReplaceString(IT, A, "\'" + LCase(Hex(Asc(A) ) ) )
	Next
	ProcedureReturn IT
EndProcedure

Procedure.S RichText(IT.S, Prefix.S)
	ProcedureReturn "{\" + Prefix + " " + IT + "}"
EndProcedure

Procedure.S RtBold(IT.S)
	ProcedureReturn RichText(IT, "b")
EndProcedure

Procedure.S RtCourier(IT.S)
	ProcedureReturn RichText(IT, "f2")
EndProcedure

Procedure.S RtArial(IT.S)
	ProcedureReturn RichText(IT, "f1")
EndProcedure

;- Structure RtKeyword

Structure RtKeyword
	CasedName.S ; Mot-clef avec casse
	Color.I
	Alinea.I			; 0  : Indiff�rent
	; 1  : Dresse la ligne suivante
	; 2  : Baisse imm�diate
	; 3  : Baisse imm�diate et dresse la ligne suivante
	; 4  : Double l'effet (pour 'Select' & 'EndSelect')
	Type.I
EndStructure

Global NewMap RtKey.RtKeyword()
Global Alinea, NextAlinea

Global ProcedureStep
Global ProcedureOutType
Global ProcedureColor = 12
Global ProcedureName.S
#BasicKeyword = 1
#ProcNameKeyword = 2
#FunctionKeyword = 4

Procedure RtSetKeyword(Name.S, Color.I, Alinea.I, KeywordType.I)
	With RtKey(UCase(Name) )
		\CasedName = Name
		\Color = Color
		\Alinea = Alinea
		\Type = KeywordType
	EndWith
EndProcedure

Procedure RtInit()
	RtSetKeyword("Procedure", 2, 1, #BasicKeyword)
	RtSetKeyword("EndProcedure", 2, 2, #BasicKeyword)
	RtSetKeyword("ProcedureReturn", 2, 0, #BasicKeyword)
	RtSetKeyword("With", 2, 1, #BasicKeyword)
	RtSetKeyword("EndWith", 2, 2, #BasicKeyword)
	RtSetKeyword("Structure", 1, 1, #BasicKeyword)
	RtSetKeyword("EndStructure", 1, 2, #BasicKeyword)
	RtSetKeyword("Select", 9, 5, #BasicKeyword)
	RtSetKeyword("EndSelect", 9, 6, #BasicKeyword)
	RtSetKeyword("Case", 9, 3, #BasicKeyword)
	RtSetKeyword("If", 9, 1, #BasicKeyword)
	RtSetKeyword("Else", 9, 3, #BasicKeyword)
	RtSetKeyword("EndIf", 9, 2, #BasicKeyword)
	RtSetKeyword("Protected", 3, 0, #BasicKeyword)
	RtSetKeyword("Define", 3, 0, #BasicKeyword)
	RtSetKeyword("Global", 3, 0, #BasicKeyword)
	RtSetKeyword("Shared", 3, 0, #BasicKeyword)
	RtSetKeyword("Static", 3, 0, #BasicKeyword)
	RtSetKeyword("Repeat", 13, 1, #BasicKeyword)	
	RtSetKeyword("Until", 13, 2, #BasicKeyword)
	RtSetKeyword("For", 13, 1, #BasicKeyword)	
	RtSetKeyword("Next", 13, 2, #BasicKeyword)	
	RtSetKeyword("While", 13, 1, #BasicKeyword)	
	RtSetKeyword("Wend", 13, 1, #BasicKeyword)	
	CompilerFunctionListLoad(@RtSetKeyword(), 6, 0, #FunctionKeyword)
EndProcedure

RtInit()

Procedure.S RtKeyword(IT.S) ; (Input Text String)
	Protected Key.S
	Protected Effect = 1
	Key = UCase(IT)
	If ProcedureStep = 2 ; le point '.' de type de sortie de proc�dure a �t� d�tect� pr�alablement
		ProcedureOutType = Asc(Key)
		ProcedureStep = 3 ; en attente de l'identification du nom de la proc�dure...
		ProcedureReturn IT
	EndIf
	Debug Key
	If FindMapElement(RtKey(), Key) ; Mot-clef identifi�?
		; 1.Marges
		If RtKey(Key)\Alinea & 4
			Effect * 2
		EndIf
		If RtKey(Key)\Alinea & 2
			Alinea - Effect
			NextAlinea = Alinea
		EndIf
		If RtKey(Key)\Alinea & 1
			NextAlinea = Alinea + Effect
		EndIf
		IT = RichText(RtKey(Key)\CasedName, "cf" + Str(RtKey(Key)\Color) )
		; 2.Analyses		
		If Key = "PROCEDURE"
			ProcedureStep = 1 ; en attente du typage de sortie de proc�dure...
		EndIf
	Else
		If ProcedureStep = 1 ; si le point '.' de type de sortie de proc�dure non d�tect�
			ProcedureOutType = Asc("I") ; alors c'est un entier
			ProcedureStep = 3 ; en attente de l'identification du nom de la proc�dure...
		EndIf
		If ProcedureStep = 3 ; Identification du nom de la proc�dure
			RtSetKeyword(IT, ProcedureColor, 0, #ProcNameKeyword)
			ProcedureName = IT
			IT = RichText(RtKey(Key)\CasedName, "cf" + Str(RtKey(Key)\Color) )
			ProcedureStep = 0
		EndIf
	EndIf
	ProcedureReturn RtCourier(RtBold(IT) )
EndProcedure

Procedure.S RtAlinea()
	Protected OT.S
	For I = 1 To Alinea
		OT + Chr(9)
	Next
	ProcedureReturn OT
EndProcedure


;- Text

Procedure LoadText(FileName.S, *Text.STRING)
	
	Protected Size
	Protected TextFile
	Size = FileSize(FileName)
	If Size > -1
		TextFile = OpenFile(#PB_Any, FileName, #PB_File_SharedRead)
		If TextFile
			*Text\S = ReadString(TextFile, #PB_File_IgnoreEOL, Size)		
			CloseFile(TextFile)
		EndIf
	EndIf
EndProcedure

Procedure SaveText(FileName.S, *Text.STRING)
	
	Protected TextFile
	TextFile = CreateFile(#PB_Any, FileName)
	If TextFile
		WriteString(TextFile, *Text\S)		
		CloseFile(TextFile)
	EndIf
EndProcedure

Procedure PaintText(TreeID, TextID, *Text.STRING, Item = -16)
	
	Protected EnableLineFeed = 1
	Protected Keyword.S
	Protected IT.S ;   Input Text
	Protected CT.S ; Current Text
	Protected OT.S ;  Output Text
	Protected LineBegin = 1
	If Item = -16
		IT = UCase(*Text\S)
		LIT = Len(IT)
		For I = 1 To LIT
			A = Asc(Mid(IT, I, 1) )
			If LineBegin
				If A > 32
					LineBegin = 0
				EndIf
				If A = 13
					CT = "\par "
					Alinea = NextAlinea
					LineBegin = 1
					OT + CT
					CT = ""
				EndIf
			EndIf
			
			If LineBegin = 0
				If A = 34
					Inext = FindString(IT, Chr(34), I + 1)
					CT + Chr(34) + RtArial(RichChar(Mid(*Text\S, I + 1, Inext - I - 1), "\{}") ) + Chr(34)
					I = Inext
				Else
					If A = Asc(";")
						If Mid(*Text\S, I + 1, 5) = " IDE "
							Break
						EndIf
						Inext = FindString(IT, Chr(13), I)
						If Inext = 0 ; Pas de retour de ligne...
							Inext = LIT ; ... Donc fin de listing
						EndIf
						Inext - 1
						CT + ";" + RtBold(RtArial(RichChar(Mid(*Text\S, I + 1, Inext - I), "\{}") ) )
						I = Inext
					Else
						A0 = Asc(Mid(*Text\S, I, 1) ) ; R�cup�re la vraie casse
						If (A => 65 And A <= 90) Or (A => 48 And A <= 57) Or (A = 95) Or (A > 127) ; Nom de variable?
							If Expr = 0
								Expr = 1
								Keyword = Chr(A0)
							Else
								Keyword + Chr(A0)
							EndIf
						Else ; Pas Nom de variable?
							If Expr = 1 ; Mais on vient de terminer la lecture d'un nom de variable?
								Expr = 0
								CT + RtKeyword(Keyword)
							EndIf
							If (A > 31) Or (A = 9)
								If ProcedureStep = 1
									;Debug "->" + Chr(A)
									If A = Asc(".")
										ProcedureStep = 2
									;	End
									EndIf
								EndIf								
								CT + RichChar(Chr(Asc(Mid(*Text\S, I, 1) ) ), "\{}")
							Else
								Select A
									Case 13
										CT = RtAlinea() + CT + "\par "
										Alinea = NextAlinea
										LineBegin = 1
										OT + CT
										CT = ""
								EndSelect
							EndIf							
						EndIf
					EndIf
				EndIf
			EndIf
			If ProcedureName
				AddGadgetItem(TreeID, -1, ProcedureName, 0, Alinea)
				ProcedureName = ""
			EndIf
		Next		
		SetGadgetText(TextID, Rich(OT) )
	Else
		;SetGadgetItemText(TextID, Item, Rich(Text) )
	EndIf
EndProcedure

;}










WinW = 600
WinH = 300
WinFlag = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget
TreW = 200
Define Text.STRING
Define Line.STRING
Define FileName.S = #PB_Compiler_File

WinID = OpenWindow(#PB_Any, 0, 0, WinW, WinH, FileName, WinFlag)
TreID = TreeGadget(#PB_Any, 0, 0, TreW, WinH)
EdiID = EditorGadget(#PB_Any, TreW, 0, WinW - TreW, WinH)
St0ID = SplitterGadget(#PB_Any, 0, 0, WinW, WinH, TreID, EdiID, #PB_Splitter_Vertical | #PB_Splitter_FirstFixed)
SetActiveGadget(EdiID)
LoadText(FileName, Text)
PaintText(TreID, EdiID, Text)

Repeat
	WinEv = WaitWindowEvent()
	If WinEv = #PB_Event_SizeWindow
		WindowSize(WinID, @WinW, @WinH)
		ResizeGadget(St0ID, 0, 0, WinW, WinH)
	EndIf
Until WinEv = #PB_Event_CloseWindow
Text\S = GetGadgetText(EdiID)
;SaveText(FileName, Text)
CloseWindow(WinID)

 
Répondre