[Решено] synedit и русский

Модератор: Модераторы

[Решено] synedit и русский

Сообщение rellai2 » 09.11.2016 13:23:46

Можно ли добавить русские слова для подсветки?
Решил для начала тупо подправить Syn Sql highliter но русские сочетания добавленные в него не понимает... английские добавленные понимает...
начал смотреть там есть функция которая говорит какие символы принимать...и тип char
тоесть я так понимаю что научить ее русскому нереально???

Добавлено спустя 4 часа 21 минуту 42 секунды:
Добавил поддержку русского в SynHighlighterAny
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: [Решено] synedit и русский

Сообщение vitaly_l » 10.11.2016 00:10:28

А потом при обновлении Лазаруса будете каждый раз менять код исходников?
При обновлении Лазаруса, все Ваши переделки, на анси кодировку, вернуться обратно.
Там кстати, можно вместо анси кодировки, заменить всё на массив и тогда сохранится кодировка UTF-8.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: [Решено] synedit и русский

Сообщение rellai2 » 10.11.2016 16:17:12

хм а есть пример? для замены на массив не очень понял как
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: [Решено] synedit и русский

Сообщение LearnMagic » 11.11.2016 20:10:32

Sample.png

Если речь идет о таком, то достаточно сделать наследник от TSynCustomHighlighter и
установить свойство SynEdit.Higlighter
Код: Выделить всё
TSynMySyn = class(TSynCustomHighlighter)
protected
   function GetIdentChars: TSynIdentChars; override;
end;

function TSynMySyn.GetIdentChars: TSynIdentChars;
begin
  Result := TSynValudStringChars;
end;
У вас нет необходимых прав для просмотра вложений в этом сообщении.
LearnMagic
новенький
 
Сообщения: 66
Зарегистрирован: 10.11.2016 23:13:38

Re: [Решено] synedit и русский

Сообщение vitaly_l » 11.11.2016 20:16:50

Я не помню точно код, как там, но я тогда делал и оно работало, а потом на меня все программисты накричали,
что исходники править нельзя и тогда мне пришлось делать код в юните.

А суть кода была такой же, просто массив меняете:
Код: Выделить всё
Const arrayOfBukv = ('А', 'Б', 'В','Г','Д'  ИТД, ВЕСЬ МАССИВ РУССКИХ и БУРЖУЙСКИХ БУКВ);

countOfArray := length( arrayOfBukv ); // могу ошибиться полгода работал с PHP

for (i:=0; i<countOfArray; i++) do
      if arrayOfBukv[i] = iskomoe then begin
            // короче здесь тот же самый код что при переборе char-ов в исходниках SynHighlighterAny, там где Вы меняли код,
            // только теперь Вы уже перебираете массив букв в кодировке UTF-8.
         end;


Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: [Решено] synedit и русский

Сообщение Alex2013 » 14.11.2016 02:09:30

Гм а разве Cи-шный цикл for (i:=0; i<countOfArray; i++) do в Лазарусе работает ? :roll: Если да то это не слабый прикол ... :idea:
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

Re: [Решено] synedit и русский

Сообщение vitaly_l » 14.11.2016 10:21:03

Alex2013 писал(а):Гм а разве Cи-шный цикл for (i:=0; i<countOfArray; i++) do в Лазарусе работает ? Если да то это не слабый прикол ...

Это не Cи-шный цикл, это цикл из PHP :roll: :wink: - там же в коде написано: // могу ошибиться полгода работал с PHP.
:!: Но Ваше замечание меня улыбнуло, особенно если представить что этот код, скопировали как есть и вставили.
:arrow: В любом случае суть: автору топика - должна быть понятна, т.к. "только" он знает кусок кода, в котором новый код - можно вставить.



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: [Решено] synedit и русский

Сообщение rellai2 » 16.11.2016 22:41:48

да я понял, спасибо! пока переделывать не планирую. Система для которой пишу только cp1251 понимает все равно )))
там много глюков кроме этого - например если вставляешь в synedit не в той кодировке. то подвисает все и т.п.
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: [Решено] synedit и русский

Сообщение rellai2 » 24.11.2016 09:35:11

поправил SynComplition для поддержки русских букв. например если вызвано автодополнение и начинаешь набирать "пере" и далее из списка выбираешь "перестраховщик" то получалось "переперестраховщик".
Нашел где косяк. Исправил. там суть какая он передавал в определение буква это или нет со смещением в -1 а если буква русская например, то все равно смещал -1 а нужно уже -2. и соответсвенно он не распознавал что это буква и выходил из цикла.
я поправил - но не знаю может коряво...
хорошо бы кто проверил и можно было бы внести в апстрим :)

Код: Выделить всё
Function UTF8ReverseString(const AText: string): string;
var
    i,j:longint;
begin
  i:=0;
  j:=UTF8Length(atext);
  while (i<=j) do
    begin
      result := result + UTF8Copy(atext,j-i,1);
      inc(i);
    end;
end;   

procedure TSynCompletion.Validate(Sender: TObject; KeyChar: TUTF8Char;
  Shift: TShiftState);
var
  F: TSynBaseCompletionForm;
  Value, CurLine: string;
  NewBlockBegin, NewBlockEnd: TPoint;
  LogCaret: TPoint;
  HighlighterIdentChars: TSynIdentChars;
  pos: integer;
  utf8Str : String;
  i: integer;
begin
  //debugln('TSynCompletion.Validate ',dbgsName(Sender),' ',dbgs(Shift),' Position=',dbgs(Position));
  F := Sender as TSynBaseCompletionForm;
  // Note: Form.Visible can be false, for example when completion only contains one item
  if F.CurrentEditor is TCustomSynEdit then
    with TCustomSynEdit(F.CurrentEditor) do begin
      BeginUndoBlock{$IFDEF SynUndoDebugBeginEnd}('TSynCompletion.Validate'){$ENDIF};
      BeginUpdate;
      try
        if Editor.Highlighter<>nil then
          HighlighterIdentChars := Editor.Highlighter.IdentChars
        else
          HighlighterIdentChars := [];
        LogCaret := LogicalCaretXY;
        NewBlockBegin:=LogCaret;
        CurLine:=Lines[NewBlockBegin.Y - 1];
        utf8Str := UTF8ReverseString(Copy(CurLine,1,NewBlockBegin.X-1)); //Реверсируем строку
        i:=1;
        while (i<=length(utf8Str))
        and ((IsIdentifierChar(@utf8Str[i]))
             or (utf8Str[i] in HighlighterIdentChars))
        do
        begin
          pos:=  UTF8CharacterLength(@utf8Str[i]);  // Length(Copy(CurLine, NewBlockEnd.X  ,1)) ; //Определяем приращение
          inc(i,pos);                                                                                                                       //Приращиваем
        end;
        NewBlockBegin.X := NewBlockBegin.X - i + 1 ;   //Уменьшаем изменяем начальный символ

        //BlockBegin:=NewBlockBegin;
        if ssShift in Shift then begin
          // replace only prefix
          NewBlockEnd := LogCaret;
        end else begin
          // replace the whole word
          NewBlockEnd := LogCaret;
          CurLine:=Lines[NewBlockEnd.Y - 1];
          while (NewBlockEnd.X<=length(CurLine))
          and ((IsIdentifierChar(@CurLine[NewBlockEnd.X]))
               or (CurLine[NewBlockEnd.X] in HighlighterIdentChars))
          do
          begin
            pos:=  UTF8CharacterLength(@CurLine[NewBlockEnd.X]);  // Length(Copy(CurLine, NewBlockEnd.X  ,1)) ;   //Определение на сколько приращивать
            inc(NewBlockEnd.X,pos);                                                                                                                          //Прирастили на нужную длинну
          end
        end;
        //debugln('TSynCompletion.Validate B Position=',dbgs(Position));
        if Position>=0 then begin
          if Assigned(FOnCodeCompletion) then
          begin
            Value := ItemList[Position];
            FOnCodeCompletion(Value, TextBetweenPoints[NewBlockBegin, NewBlockEnd],
                              NewBlockBegin, NewBlockEnd, KeyChar, Shift);
            if (CompareCarets(NewBlockBegin, NewBlockEnd) <> 0) or (Value <> '') then
            begin

              TextBetweenPointsEx[NewBlockBegin, NewBlockEnd, scamEnd] := Value;
              TCustomSynEdit(F.CurrentEditor).SetFocus;
            end;
          end else begin
            TextBetweenPointsEx[NewBlockBegin, NewBlockEnd, scamEnd] := ItemList[Position];
            TCustomSynEdit(F.CurrentEditor).SetFocus;
          end;
        end
        else
        if (ItemList.Count = 0) then
          Cancel(Sender);
      finally
        EndUpdate;
        EndUndoBlock{$IFDEF SynUndoDebugBeginEnd}('TSynCompletion.Validate'){$ENDIF};
      end;
    end;
end;                         
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45


Вернуться в SynEdit и UniHighlighter

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru