HTML редактор
Попытка создания простенького редактора
HTML кода на языке
PureBasic .
Из функций пока подсветка тегов, возможность их быстрой вставки.
При открытии html файла, в этой директории создается новый файл с новым именем.
Дальнейшее редактирование производится над ним.
Пока не надоест, буду развивать редактор.
Скачать
архив
Код реализации для версии PB 4.40 :
;---------------------------------------- Редактор HTML -------------------------------------------------
;
; PureBasic 4.40
;
; (c) 2010 - mirashic
;--------------------------------------------------------------------------------------------------------
Enumeration
#Window_0
EndEnumeration
Enumeration
#File_1
#Editor
#Web
#Open
#Template
#Save
#Refresh
#Font_0
#Save_1
#Break_1
#Split
#ListIconGadget_2
#ListIconGadget_3
EndEnumeration
Global file.s,Nasd.s
UsePNGImageDecoder()
UseJPEGImageDecoder()
IncludeFile "SyntaxhighlightingEditorGadget.pb"
IncludeFile "teg.pb"
;---------------Определяем находится ли курсор мышки в пределах данного окна (гаджета)---------
Procedure IsMouseOver(wnd)
GetWindowRect_(wnd,re.RECT)
GetCursorPos_(pt.POINT)
ProcedureReturn PtInRect_(@re, pt\x|(pt\y<<32))
EndProcedure
;----------------------------------------------------------------------------------------------
;-------Чтение и запись файла в EditorGadget при клике "Открыть"--------------
Procedure OFile(file.s)
d=ReadFile(#File_1, file)
If d
While Eof(#File_1)=0
Text$ = Text$+ReadString(#File_1)+Chr(13)+ Chr(10)
Wend
CloseFile(#File_1)
SetGadgetText(#Editor, Text$)
EndIf
EndProcedure
;------------------------------------------------------------------------------
OpenWindow(#Window_0, 0, 0, 1010, 800, "HTML редактор", #PB_Window_ScreenCentered)
;SetWindowColor(#Window_0,RGB(255, 255, 255))
EditorGadget (#Editor, 5, 30, 1000, 200 )
SetGadgetFont(#Editor, LoadFont(#Font_0, "Courier New", 10, 16)) ; шрифт 16/272 Courier New
ListIconGadget(#ListIconGadget_2, 5, 35, 130, 370, "Теги HTML", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
ListIconGadget(#ListIconGadget_3, 5, 410,130, 380, "Теги CSS", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
;------------------Чтение пути и тегов html, CSS-----------------------
ClearGadgetItems(#ListIconGadget_2)
ClearGadgetItems(#ListIconGadget_3)
If OpenPreferences("теги.pcs")
PreferenceGroup("путь")
Rep.s = ReadPreferenceString("директория", "Нет") ; чтение старого пути
PreferenceGroup("html")
;Rep.s = ReadPreferenceString("путь", "Нет") ; чтение старого пути
If ExaminePreferenceKeys()
While NextPreferenceKey()>0
keyValue$ = PreferenceKeyValue()
AddGadgetItem(#ListIconGadget_2, -1,keyValue$)
Wend
EndIf
PreferenceGroup("css")
If ExaminePreferenceKeys()
While NextPreferenceKey()>0
keyValue$ = PreferenceKeyValue()
AddGadgetItem(#ListIconGadget_3, -1,keyValue$)
Wend
EndIf
ClosePreferences()
EndIf
;----------------------------------------------------------------
OFile(Rep.s) ; Открываем старый файл при запуске программы
ButtonGadget(#Open, 20, 5, 70, 20, "Открыть")
ButtonGadget(#Template, 100, 5, 70, 20, "Шаблон")
;ButtonGadget(#Save, 200, 5, 70, 20, "Сохранить")
ButtonGadget(#Refresh, 500, 5, 160, 20, "Обновить браузер")
ButtonGadget(222,900, 5,100,20,"Закрыть")
;-------Создаем меню---------
If CreatePopupMenu(1)
MenuItem(1,"Отменить")
MenuItem(2,"Повторить")
MenuBar ()
MenuItem(3,"Вырезать")
MenuItem(4,"Копировать")
MenuItem(5,"Вставить")
MenuBar ()
MenuItem(6,"Выделить всё")
EndIf
;----------------------------
ProgPath.s=GetPathPart(ProgramFilename())
WebGadget(#Web,5,235,1000,555,Rep.s)
SplitterGadget(#Split, 140, 35, 865, 755, #Editor, #Web) ; двиг. панель
SetGadgetText(#Web,"file://localhost/"+ProgPath+Rep.s)
file.s = Rep.s
Repeat
Event=WaitWindowEvent()
If Event=#WM_RBUTTONUP
If IsMouseOver(GadgetID(#Editor))
DisplayPopupMenu(1,WindowID(0))
EndIf
EndIf
Window=EventWindow()
Gadget=EventGadget()
Syntax(#Editor)
Select Event
;-----------------------------------------------------------------------------------
Case #WM_LBUTTONDBLCLK ; обработка события на двойной клик
If Gadget = #ListIconGadget_2
Fast$=GetGadgetText(#ListIconGadget_2)
SendMessage_(GadgetID(#Editor),#EM_REPLACESEL,0,Fast$) ; запись после курсора
EndIf
If Gadget = #ListIconGadget_3
Fast$=GetGadgetText(#ListIconGadget_3)
SendMessage_(GadgetID(#Editor),#EM_REPLACESEL,0,Fast$) ; запись после курсора
EndIf
Case #PB_Event_Gadget
;------------------------------------------------------------------------------------
Select EventGadget()
Case #Open ; Открываем новый файл при запуске программы
DeleteFile(Rep.s) ; удаляем старую запись
file.s = OpenFileRequester("Открыть файл","","Все файлы|*.*",1) ; путь к файлу
OFile(file.s)
Nasd.s= GetFilePart(file.s) ; получаем имя файла
DeleteFile(GetPathPart(file.s)+"~"+Nasd.s) ; стираем старый файл перед новой записью (можно строку убрать)
OpenFile(0, GetPathPart(file.s)+"~"+Nasd.s) ; создаем файл с изменённым именем в открытой директории
FileSeek(0, 0) ; устанавливаем позицию записи
WriteStringN(0, GetGadgetText(#Editor)) ; записываем в файл инфу из EditorGadget
CloseFile(0)
SetGadgetText(#Web,GetPathPart(file.s)+"~"+Nasd.s) ; загружаем в браузер созданный файл
;------------Запись в настройки нового пути--------------------------------
OpenPreferences("теги.pcs")
PreferenceGroup("путь")
WritePreferenceString("директория",GetPathPart(file.s)+"~"+Nasd.s)
ClosePreferences()
;--------------------------------------------------------------
;Case #Save
;DeleteFile(GetPathPart(file.s)+"~"+Nasd.s)
;OpenFile(0, GetPathPart(file.s)+"~"+Nasd.s)
;FileSeek(0, 0)
;WriteStringN(0, GetGadgetText(#Editor))
;CloseFile(0)
Case #Refresh
If OpenPreferences("теги.pcs")
PreferenceGroup("путь")
Rep.s = ReadPreferenceString("директория", "Нет") ; чтение старого пути
PreferenceGroup("html")
ClosePreferences()
EndIf
DeleteFile(Rep.s)
OpenFile(0, Rep.s)
FileSeek(0, 0)
WriteStringN(0, GetGadgetText(#Editor))
CloseFile(0)
SetGadgetState(#Web, #PB_Web_Refresh)
; SetGadgetText(#Web, Rep.s)
Case 222
OpenWindow(59, 0, 0, 210, 40, "Сохранить изменения перед выходом?", #PB_Window_ScreenCentered)
ButtonGadget(#Save_1, 130, 10, 70, 20, "Сохранить")
ButtonGadget(#Break_1, 10, 10, 70, 20, "Выйти")
Case #Break_1
DeleteFile(GetPathPart(file.s)+"~"+Nasd.s)
Break
Case #Save_1
If OpenPreferences("теги.pcs")
PreferenceGroup("путь")
Rep.s = ReadPreferenceString("директория", "Нет") ; чтение старого пути
PreferenceGroup("html")
ClosePreferences()
EndIf
DeleteFile(Rep.s) ; DeleteFile(GetPathPart(file.s)+Nasd.s)
OpenFile(0, Rep.s) ; OpenFile(0, GetPathPart(file.s)+Nasd.s)
FileSeek(0, 0)
WriteStringN(0, GetGadgetText(#Editor))
CloseFile(0)
Break
Case #Template
OFile("Template.htm")
DeleteFile("~Template.htm") ; стираем старый файл перед новой записью
OpenFile(0,"~Template.htm") ; создаем файл с изменённым именем в открытой директории
FileSeek(0, 0) ; устанавливаем позицию записи
WriteStringN(0, GetGadgetText(#Editor)) ; записываем в файл инфу из EditorGadget
CloseFile(0)
SetGadgetText(#Web,"file://localhost/"+ProgPath+"~Template.htm") ; загружаем в браузер созданный файл
;------------Запись в настройки нового пути--------------------------------
OpenPreferences("теги.pcs")
PreferenceGroup("путь")
WritePreferenceString("директория","~Template.htm")
ClosePreferences()
;--------------------------------------------------------------
EndSelect
EndSelect
;{--------------------- Сохранить/вставить ---------------------------------------------
If Event=#PB_Event_Menu
Menu=EventMenu()
Select Menu
Case 1
SendMessage_(GadgetID(#Editor), #EM_UNDO, #Null, #Null)
Case 2
SendMessage_(GadgetID(#Editor), #EM_REDO, #Null, #Null)
Case 3, 4
SendMessage_(GadgetID(#Editor), #EM_GETSEL, @Min,@Max)
If Min<>Max
If Min
Решил не обновлять код, а дописывать новые решения.
Добавил возможность растягивать программу по ширине монитора.
Заменил кнопки на
MenuTitle .
Добавил кнопки
вперед, назад для браузера.
Куча кнопок, пока не реагируют на действия.
Долго работал над
открыть сохранить старый - новый документ. более менее получилось.
Пока программа в разработке, убрал функцию редактировать оригинальный файл.
Редактирую эту страницу данным редактором - если честно, то очень не удобно.
Проблема - большая задержка при вводе теста.
Проверил - из за подсветки синтаксиса. Вариант не совсем удачный.
Фукция:
Syntax(#Editor)
Убрал ее и всё работает, но не интересно.
;---------------------------------------- Редактор HTML -------------------------------------------------
;
; PureBasic 4.40
;
; (c) 2010 - mirashic
;--------------------------------------------------------------------------------------------------------
Enumeration
#Window_0
#Window_1
EndEnumeration
Enumeration
#File_1
#Editor
#Web
#Open
#Template
#Save
#Refresh
#Close
#Font_0
#Save_1
#Break_1
#Split
#ListIconGadget_2
#ListIconGadget_3
#But_1:#But_2:#But_3:#But_4:#But_5:#But_6:#But_7:#But_8:#But_9:#But_10:#But_11:#But_12:#But_13:#But_27:
#But_14:#But_15:#But_16:#But_17:#But_18:#But_19:#But_20:#But_21:#But_22:#But_23:#But_24:#But_25:#But_26:
#Cr_Menu_1
#Cr_Menu_2
#Cr_Menu_3
#Cr_Menu_4
#Cr_Menu_5
#Cr_Menu_6
#Cr_Menu_7
#Img_1
#Web_1
#Web_2
#a1
#a2
#a3
#a4
#a5
#a6
EndEnumeration
UsePNGImageDecoder()
UseJPEGImageDecoder()
IncludeFile "SyntaxhighlightingEditorGadget.pb"
IncludeFile "teg.pb"
;{---------------Определяем находится ли курсор мышки в пределах данного окна (гаджета)---------
Procedure IsMouseOver(wnd)
GetWindowRect_(wnd,re.RECT)
GetCursorPos_(pt.POINT)
ProcedureReturn PtInRect_(@re, pt\x|(pt\y<<32))
EndProcedure
;}----------------------------------------------------------------------------------------------
;{-------Чтение и запись файла в EditorGadget при клике "Открыть"--------------
Procedure OFile(file.s)
d=ReadFile(#File_1, file)
If d
While Eof(#File_1)=0
Text$ = Text$+ReadString(#File_1)+Chr(13)+ Chr(10)
Wend
CloseFile(#File_1)
SetGadgetText(#Editor, Text$)
EndIf
EndProcedure
;}------------------------------------------------------------------------------
;{---------------------Растягивание программы----------------------------------------
;Procedure Resize()
;ShowWindow_(WindowID(#Window_0), #SW_MAXIMIZE)
;EndProcedure
Procedure WCB(wnd, msg, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select msg
Case #WM_SIZE
ResizeGadget(#Split,#PB_Ignore,#PB_Ignore, WindowWidth(#Window_0)-165, WindowHeight(#Window_0)-45)
EndSelect
ProcedureReturn Result
EndProcedure
;}-----------------------------------------------------------------------------------
CatchImage(1, ?Im1, ?Im1End-?Im1)
CatchImage(2, ?Im2, ?Im2End-?Im2)
CatchImage(3, ?Im3, ?Im3End-?Im3)
CatchImage(4, ?Im4, ?Im4End-?Im4)
CatchImage(5, ?Im5, ?Im5End-?Im5)
CatchImage(6, ?Im6, ?Im6End-?Im6)
OpenWindow(#Window_0, 0, 0, 1010, 800, "HTML редактор",#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
EditorGadget(#Editor, #Null, #Null, #Null, #Null)
SetGadgetFont(#Editor, LoadFont(#Font_0, "Courier New", 10, 16)) ; шрифт 16/272 Courier New
ListIconGadget(#ListIconGadget_2, 5, 28, 130, 370, "Теги HTML", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
ListIconGadget(#ListIconGadget_3, 5, 400,130, 373, "Теги CSS", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
;{------------------Чтение пути и тегов html, CSS-----------------------
ClearGadgetItems(#ListIconGadget_2)
ClearGadgetItems(#ListIconGadget_3)
If OpenPreferences("теги.pcs")
PreferenceGroup("путь")
Rep.s = ReadPreferenceString("директория", "Нет") ; чтение старого пути
PreferenceGroup("html")
;Rep.s = ReadPreferenceString("путь", "Нет") ; чтение старого пути
If ExaminePreferenceKeys()
While NextPreferenceKey()>0
keyValue$ = PreferenceKeyValue()
AddGadgetItem(#ListIconGadget_2, -1,keyValue$)
Wend
EndIf
PreferenceGroup("css")
If ExaminePreferenceKeys()
While NextPreferenceKey()>0
keyValue$ = PreferenceKeyValue()
AddGadgetItem(#ListIconGadget_3, -1,keyValue$)
Wend
EndIf
ClosePreferences()
EndIf
;}----------------------------------------------------------------
OFile(Rep.s) ; Открываем старый файл при запуске программы
If CreateMenu(#Cr_Menu_1,WindowID(#Window_0))
MenuTitle("Файл")
MenuItem(#Open,"Открыть")
MenuBar()
MenuItem(#Template,"Шаблон")
MenuBar()
MenuItem(1,"Сохранить")
MenuBar()
MenuItem(2,"Выход")
MenuTitle("Настройки")
MenuItem(3,"Настр 1")
MenuItem(4,"Настр 1")
MenuItem(5,"Настр 1")
MenuTitle("Справка")
MenuItem(6,"О программе")
MenuTitle(" ")
MenuTitle("Выйти")
MenuItem(#Close,"Выйти")
EndIf
ImageGadget(#Img_1, 10, 2, 180, 25, ImageID(4))
ButtonImageGadget(#Web_1, 650, 0, 25, 25, ImageID(2))
ButtonGadget(#Refresh,680, 0, 110, 25, "Обновить браузер")
ButtonImageGadget(#Web_2, 795, 0, 25, 25, ImageID(3))
ButtonGadget(#But_1, 136, 35, 25,25,"br")
ButtonGadget(#But_2, 136, 60, 25,25,"b")
ButtonGadget(#But_3, 136, 85, 25,25,"div")
ButtonGadget(#But_4, 136, 110,25,25,"p")
ButtonImageGadget(#But_5, 136, 135,25,25,ImageID(6))
GadgetToolTip(#But_5, "Вставить изображение")
ButtonImageGadget(#But_6, 136, 160,25,25,ImageID(5))
GadgetToolTip(#But_6, "Вставить гиперссылка")
ButtonGadget(#But_7, 136, 185,25,25,"")
ButtonGadget(#But_8, 136, 220,25,25,"h1")
ButtonGadget(#But_9, 136, 245,25,25,"h2")
ButtonGadget(#But_10, 136, 270,25,25,"h3")
ButtonGadget(#But_11, 136, 295,25,25,"h4")
ButtonGadget(#But_12, 136, 320,25,25,"h5")
ButtonGadget(#But_13, 200, 0,25,25,"")
ButtonGadget(#But_14, 225, 0,25,25,"")
ButtonGadget(#But_15, 250, 0,25,25,"")
ButtonGadget(#But_16, 275, 0,25,25,"")
ButtonGadget(#But_17, 300, 0,25,25,"")
ButtonGadget(#But_18, 335, 0,25,25,"")
ButtonGadget(#But_19, 360, 0,25,25,"")
ButtonGadget(#But_20, 385, 0,25,25,"")
ButtonGadget(#But_21, 410, 0,25,25,"")
ButtonGadget(#But_22, 435, 0,25,25,"")
ButtonGadget(#But_23, 470, 0,25,25,"")
ButtonGadget(#But_24, 495, 0,25,25,"")
ButtonGadget(#But_25, 520, 0,25,25,"")
ButtonGadget(#But_26, 545, 0,25,25,"")
;ButtonGadget(#Close, 980, 0,25,25,"X")
ButtonImageGadget(#Close, 980, 0, 25, 25, ImageID(1))
;-------Всплывающее меню---------
If CreatePopupMenu(1)
MenuItem(#a1,"Отменить")
MenuItem(#a2,"Повторить")
MenuBar ()
MenuItem(#a3,"Вырезать")
MenuItem(#a4,"Копировать")
MenuItem(#a5,"Вставить")
MenuBar ()
MenuItem(#a6,"Выделить всё")
EndIf
;-------------------------------
ProgPath.s=GetPathPart(ProgramFilename())
WebGadget(#Web, #Null, #Null, #Null, #Null,Rep.s)
SplitterGadget(#Split, 162, 28, WindowWidth(#Window_0)-165, WindowHeight(#Window_0)-55, #Editor, #Web) ; двиг. панель
SetGadgetState(#Split, 450)
SetGadgetText(#Web,"file://localhost/"+ProgPath+Rep.s)
file.s = Rep.s
SetWindowCallback(@WCB())
Repeat
Event=WaitWindowEvent(10)
If Event=#WM_RBUTTONUP
If IsMouseOver(GadgetID(#Editor))
DisplayPopupMenu(1,WindowID(0))
EndIf
EndIf
Window=EventWindow()
Gadget=EventGadget()
Syntax(#Editor)
Select Event
;-----------------------------------------------------------------------------------
Case #WM_LBUTTONDBLCLK ; обработка события на двойной клик
If Gadget = #ListIconGadget_2
Fast$=GetGadgetText(#ListIconGadget_2)
SendMessage_(GadgetID(#Editor),#EM_REPLACESEL,0,Fast$) ; запись после курсора
EndIf
If Gadget = #ListIconGadget_3
Fast$=GetGadgetText(#ListIconGadget_3)
SendMessage_(GadgetID(#Editor),#EM_REPLACESEL,0,Fast$) ; запись после курсора
EndIf
Case #PB_Event_Gadget
;------------------------------------------------------------------------------------
Select EventGadget()
Case #Web_1
SetGadgetState(#Web, #PB_Web_Back)
Case #Refresh
If OpenPreferences("теги.pcs")
PreferenceGroup("путь")
Rep.s = ReadPreferenceString("директория", "Нет") ; чтение старого пути
ClosePreferences()
EndIf
DeleteFile(Rep.s)
OpenFile(0, Rep.s)
FileSeek(0, 0)
WriteStringN(0, GetGadgetText(#Editor))
CloseFile(0)
SetGadgetState(#Web, #PB_Web_Refresh)
Case #Web_2
SetGadgetState(#Web, #PB_Web_Forward)
Case #Close
OpenWindow(#Window_1, 0, 0, 210, 40, "Сохранить изменения перед выходом?", #PB_Window_ScreenCentered)
ButtonGadget(#Save_1, 130, 10, 70, 20, "Сохранить")
ButtonGadget(#Break_1,10, 10, 80, 20, "Не сохранять" )
Case #Break_1
DeleteFile(Rep.s)
Break
Case #Save_1
If OpenPreferences("теги.pcs")
PreferenceGroup("путь")
Rep.s = ReadPreferenceString("директория", "Нет") ; чтение старого пути
ClosePreferences()
EndIf
DeleteFile(Rep.s) ; DeleteFile(GetPathPart(file.s)+Nasd.s)
OpenFile(0, Rep.s) ; OpenFile(0, GetPathPart(file.s)+Nasd.s)
FileSeek(0, 0)
WriteStringN(0, GetGadgetText(#Editor))
CloseFile(0)
Break
Case #Template
OFile("Template.htm")
DeleteFile("~Template.htm") ; стираем старый файл перед новой записью
OpenFile(0,"~Template.htm") ; создаем файл с изменённым именем в открытой директории
FileSeek(0, 0) ; устанавливаем позицию записи
WriteStringN(0, GetGadgetText(#Editor)) ; записываем в файл инфу из EditorGadget
CloseFile(0)
SetGadgetText(#Web,"file://localhost/"+ProgPath+"~Template.htm") ; загружаем в браузер созданный файл
;------------Запись в настройки нового пути--------------------------------
OpenPreferences("теги.pcs")
PreferenceGroup("путь")
WritePreferenceString("директория","~Template.htm")
ClosePreferences()
;--------------------------------------------------------------
EndSelect
EndSelect
;{--------------------- Сохранить/вставить ---------------------------------------------
If Event=#PB_Event_Menu
Menu=EventMenu()
Select Menu
Case #a1
SendMessage_(GadgetID(#Editor), #EM_UNDO, #Null, #Null)
Case #a2
SendMessage_(GadgetID(#Editor), #EM_REDO, #Null, #Null)
Case #a3, #a4
SendMessage_(GadgetID(#Editor), #EM_GETSEL, @Min,@Max)
If Min<>Max
If Min
Скачать архив