mirror of https://gitlab.com/basile.b/dexed.git
refact indent patching
This commit is contained in:
parent
da889090db
commit
ade5b65fa3
|
@ -30,6 +30,14 @@ type
|
||||||
|
|
||||||
THasMain = (mainNo, mainYes, mainDefaultBehavior);
|
THasMain = (mainNo, mainYes, mainDefaultBehavior);
|
||||||
|
|
||||||
|
// desscibes leading whites of a line
|
||||||
|
TIndentComposition = record
|
||||||
|
// num spaces
|
||||||
|
numS: integer;
|
||||||
|
// num tabs
|
||||||
|
numT: integer;
|
||||||
|
end;
|
||||||
|
|
||||||
// function used as string hasher in fcl-stl
|
// function used as string hasher in fcl-stl
|
||||||
TStringHash = class
|
TStringHash = class
|
||||||
class function hash(const key: string; maxBucketsPow2: longword): longword;
|
class function hash(const key: string; maxBucketsPow2: longword): longword;
|
||||||
|
@ -312,9 +320,11 @@ type
|
||||||
|
|
||||||
procedure tryRaiseFromStdErr(proc: TProcess);
|
procedure tryRaiseFromStdErr(proc: TProcess);
|
||||||
|
|
||||||
procedure leadingTabsToSpaces(var value: string; width: integer);
|
// Converts all leading whites to spaces. Tabs takes width * spaces.
|
||||||
|
function leadingTabsToSpaces(const value: string; width: integer): string;
|
||||||
|
|
||||||
procedure leadingSpacesToTabs(var value: string; width: integer);
|
// Converts all leading whites to tabs. Fails if width doesn't fivide number of spaces.
|
||||||
|
function leadingSpacesToTabs(const value: string; width: integer): string;
|
||||||
|
|
||||||
var
|
var
|
||||||
// additional directories to find background tools
|
// additional directories to find background tools
|
||||||
|
@ -1397,56 +1407,113 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure leadingTabsToSpaces(var value: string; width: integer);
|
function leadingTabsToSpaces(const value: string; width: integer): string;
|
||||||
var
|
var
|
||||||
m: integer;
|
p: integer;
|
||||||
s: string;
|
b: string;
|
||||||
|
c: TIndentComposition;
|
||||||
|
u: char;
|
||||||
begin
|
begin
|
||||||
if value.length = 0 then
|
assert(width > 0);
|
||||||
exit;
|
|
||||||
|
|
||||||
m := 1;
|
p := 1;
|
||||||
while true do
|
c.numS := 0;
|
||||||
|
c.numT := 0;
|
||||||
|
while p < value.length do
|
||||||
begin
|
begin
|
||||||
if value[m] <> #9 then
|
u := value[p];
|
||||||
|
if u = ' ' then
|
||||||
|
c.numS += 1
|
||||||
|
else if u = #9 then
|
||||||
|
c.numT += 1
|
||||||
|
else
|
||||||
break;
|
break;
|
||||||
if m = value.length then
|
p += 1;
|
||||||
break;
|
|
||||||
m += 1;
|
|
||||||
end;
|
end;
|
||||||
|
if p <> 1 then
|
||||||
width *= (m - 1);
|
begin
|
||||||
setLength(s, width);
|
setLength(b, c.numT * width + c.numS);
|
||||||
if s.length <> 0 then
|
FillChar(b[1], b.length, ' ');
|
||||||
fillChar(s[1], width, ' ');
|
result := b + value[p .. value.length];
|
||||||
|
end
|
||||||
value := s + value[m..value.length];
|
else result := value;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure leadingSpacesToTabs(var value: string; width: integer);
|
function leadingSpacesToTabs(const value: string; width: integer): string;
|
||||||
var
|
var
|
||||||
m: integer;
|
p: integer;
|
||||||
t: string;
|
c: TIndentComposition;
|
||||||
|
i: integer;
|
||||||
begin
|
begin
|
||||||
if value.length = 0 then
|
assert(width > 0);
|
||||||
|
|
||||||
|
result := '';
|
||||||
|
if value = '' then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
m := 1;
|
p := 1;
|
||||||
while true do
|
while true do
|
||||||
begin
|
begin
|
||||||
if value[m] <> ' ' then
|
|
||||||
|
if p > value.length then
|
||||||
break;
|
break;
|
||||||
if m = value.length then
|
if not (value[p] in [#9, ' ']) then
|
||||||
break;
|
break;
|
||||||
m += 1;
|
|
||||||
|
c.numS := 0;
|
||||||
|
c.numT := 0;
|
||||||
|
|
||||||
|
while (p < value.length) and (value[p] = ' ') do
|
||||||
|
begin
|
||||||
|
c.numS += 1;
|
||||||
|
p += 1;
|
||||||
|
end;
|
||||||
|
c.numT := c.numS div width;
|
||||||
|
c.numS -= c.numT * width;
|
||||||
|
|
||||||
|
for i := 0 to c.numT-1 do
|
||||||
|
result += #9;
|
||||||
|
for i := 0 to c.numS-1 do
|
||||||
|
result += ' ';
|
||||||
|
|
||||||
|
c.numT := 0;
|
||||||
|
while (p < value.length) and (value[p] = #9) do
|
||||||
|
begin
|
||||||
|
c.numT += 1;
|
||||||
|
p += 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
for i := 0 to c.numT-1 do
|
||||||
|
result += #9;
|
||||||
|
|
||||||
|
if p >= value.length then
|
||||||
|
break;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
result += value[p .. value.length];
|
||||||
width := (m - 1) div width;
|
|
||||||
setLength(t, width);
|
|
||||||
if t.length <> 0 then
|
|
||||||
fillChar(t[1], width, #9);
|
|
||||||
|
|
||||||
value := t + value[m..value.length];
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{$IFDEF DEBUG}
|
||||||
|
initialization
|
||||||
|
|
||||||
|
assert(leadingTabsToSpaces('', 2) = '');
|
||||||
|
assert(leadingTabsToSpaces(' start', 2) = ' start');
|
||||||
|
assert(leadingTabsToSpaces('start', 2) = 'start');
|
||||||
|
assert(leadingTabsToSpaces('start ', 2) = 'start ');
|
||||||
|
assert(leadingTabsToSpaces('start '#9, 2) = 'start '#9);
|
||||||
|
assert(leadingTabsToSpaces(' '#9' '#9'start', 2) = ' start');
|
||||||
|
assert(leadingTabsToSpaces(' '#9#9'start', 2) = ' start');
|
||||||
|
assert(leadingTabsToSpaces(#9' ', 4) = ' ');
|
||||||
|
|
||||||
|
assert(leadingSpacesToTabs('', 2) = '');
|
||||||
|
assert(leadingSpacesToTabs('start', 2) = 'start');
|
||||||
|
assert(leadingSpacesToTabs('start ', 2) = 'start ');
|
||||||
|
assert(leadingSpacesToTabs('start '#9, 2) = 'start '#9);
|
||||||
|
assert(leadingSpacesToTabs(' '#9' '#9'start', 2) = #9#9#9#9'start');
|
||||||
|
assert(leadingSpacesToTabs(' '#9#9'start', 2) = #9#9#9'start');
|
||||||
|
assert(leadingSpacesToTabs(#9' ', 4) = #9' ');
|
||||||
|
assert(leadingSpacesToTabs(' '#9, 4) = ' '#9);
|
||||||
|
assert(leadingSpacesToTabs(#9' ' , 2) = #9#9' ');
|
||||||
|
|
||||||
|
{$ENDIF}
|
||||||
end.
|
end.
|
||||||
|
|
|
@ -1495,60 +1495,21 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCESynMemo.forceIndentation(m: TIndentationMode; w: integer);
|
procedure TCESynMemo.forceIndentation(m: TIndentationMode; w: integer);
|
||||||
type
|
|
||||||
TIndentComposition = record
|
|
||||||
numS: integer;
|
|
||||||
numT: integer;
|
|
||||||
end;
|
|
||||||
var
|
var
|
||||||
s: string;
|
|
||||||
i: integer;
|
i: integer;
|
||||||
p: integer;
|
|
||||||
b: string;
|
|
||||||
c: TIndentComposition;
|
|
||||||
u: char;
|
|
||||||
begin
|
begin
|
||||||
assert(w > 0);
|
assert(w > 0);
|
||||||
for i:= 0 to lines.Count-1 do
|
for i:= 0 to lines.Count-1 do
|
||||||
begin
|
case m of
|
||||||
p := 1;
|
imTabs:
|
||||||
c.numS := 0;
|
|
||||||
c.numT := 0;
|
|
||||||
s := lines.Strings[i];
|
|
||||||
while p <= s.length do
|
|
||||||
begin
|
begin
|
||||||
u := s[p];
|
lines[i] := leadingSpacesToTabs(lines[i], TabWidth);
|
||||||
if u = ' ' then
|
fModified:=true;
|
||||||
c.numS += 1
|
|
||||||
else if u = #9 then
|
|
||||||
c.numT += 1
|
|
||||||
else break;
|
|
||||||
p += 1;
|
|
||||||
end;
|
end;
|
||||||
if p <> 1 then
|
imSpaces:
|
||||||
case m of
|
begin
|
||||||
imTabs:
|
lines[i] := leadingTabsToSpaces(lines[i], TabWidth);
|
||||||
begin
|
fModified:=true;
|
||||||
setLength(b, (c.numS div w) + c.numT);
|
|
||||||
if b <> '' then
|
|
||||||
begin
|
|
||||||
FillChar(b[1], b.length, #9);
|
|
||||||
s := b + s[p .. s.length];
|
|
||||||
lines[i] := s;
|
|
||||||
fModified:=true;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
imSpaces:
|
|
||||||
begin
|
|
||||||
setLength(b, c.numT * w + c.numS);
|
|
||||||
if b <> '' then
|
|
||||||
begin
|
|
||||||
FillChar(b[1], b.length, ' ');
|
|
||||||
s := b + s[p .. s.length];
|
|
||||||
lines[i] := s;
|
|
||||||
fModified:=true;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -3252,7 +3213,6 @@ end;
|
||||||
procedure TCESynMemo.patchClipboardIndentation;
|
procedure TCESynMemo.patchClipboardIndentation;
|
||||||
var
|
var
|
||||||
lst: TStringList;
|
lst: TStringList;
|
||||||
lne: string;
|
|
||||||
i: integer;
|
i: integer;
|
||||||
begin
|
begin
|
||||||
//TODO: Check for changes made to option eoSpacesToTabs
|
//TODO: Check for changes made to option eoSpacesToTabs
|
||||||
|
@ -3264,17 +3224,7 @@ begin
|
||||||
try
|
try
|
||||||
for i := 0 to lst.count-1 do
|
for i := 0 to lst.count-1 do
|
||||||
begin
|
begin
|
||||||
lne := lst[i];
|
lst[i] := leadingTabsToSpaces(lst[i], TabWidth);
|
||||||
//if eoTabsToSpaces in Options then
|
|
||||||
//begin
|
|
||||||
leadingTabsToSpaces(lne, TabWidth);
|
|
||||||
lst[i] := lne;
|
|
||||||
//end
|
|
||||||
{else if eoSpacesToTabs in Options then
|
|
||||||
begin
|
|
||||||
//leadingSpacesToTabs(lne, TabWidth);
|
|
||||||
//lst[i] := lne;
|
|
||||||
end}
|
|
||||||
end;
|
end;
|
||||||
clipboard.asText := lst.strictText;
|
clipboard.asText := lst.strictText;
|
||||||
finally
|
finally
|
||||||
|
|
Loading…
Reference in New Issue