ВОТ тут кое-что есть ...
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88.
function GetToken(aString, SepChar: String; TokenNum: Byte):String;
{
параметры: aString : полная строка
SepChar : единственный символ, служащий
разделителем между словами (подстроками)
TokenNum: номер требуемого слова (подстроки))
result : искомое слово или пустая строка, если количество слов
меньше значения 'TokenNum'
}
var
Token : String;
StrLen : Byte;
TNum : Byte;
TEnd : Byte;
begin
StrLen := Length(aString);
TNum := 1 ;
TEnd := StrLen;
while ((TNum <= TokenNum) and (TEnd <> 0 )) do
begin
TEnd := Pos(SepChar,aString);
if TEnd <> 0 then
begin
Token := Copy(aString, 1 ,TEnd- 1 );
Delete(aString, 1 ,TEnd);
Inc(TNum);
end
else
begin
Token := aString;
end;
end;
if TNum >= TokenNum then
begin
GetToken1 := Token;
end
else
begin
GetToken1 := '';
end;
end;
function NumToken(aString, SepChar: String):Byte;
{
parameters: aString : полная строка
SepChar : единственный символ, служащий
разделителем между словами (подстроками)
result : количество найденных слов (подстрок)
}
var
RChar : Char;
StrLen : Byte;
TNum : Byte;
TEnd : Byte;
begin
if SepChar = '#' then
begin
RChar := '*'
end
else
begin
RChar := '#'
end;
StrLen := Length(aString);
TNum := 0 ;
TEnd := StrLen;
while TEnd <> 0 do
begin
Inc(TNum);
TEnd := Pos(SepChar,aString);
if TEnd <> 0 then
begin
aString[TEnd] := RChar;
end;
end;
Result := TNum;
end;
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249.
{***********************************************************
* *
* Hypernation for QuarkQPress *
* written by Gorbunov A. A. *
* acdc@media-press.donetsk.ua *
* *
************************************************************}
unit Hyper;
interface
uses
Windows,Classes,SysUtils;
Function SetHyph(pc:PChar;MaxSize:Integer):PChar;
Function SetHyphString(s : String):String;
Function MayBeHyph(p:PChar;pos:Integer):Boolean;
implementation
Type
TSymbol=(st_Empty,st_NoDefined,st_Glas,st_Sogl,st_Spec);
TSymbAR=array [ 0 .. 1000 ] of TSymbol;
PSymbAr=^TSymbAr;
Const
HypSymb=#$1F;
Spaces=[' ', ',',';', ':','.','?','!','/', # 10 , # 13 ];
GlasCHAR=['Й', 'й', 'У', 'у', 'Е', 'е','Ю', 'ю', 'А', 'а', 'О', 'о',
'Э', 'э', 'Я', 'я', 'И', 'и',
{ english }
'e', 'E', 'u', 'U','i', 'I', 'o', 'O', 'a', 'A', 'j', 'J' ];
SoglChar=['Г', 'г' , 'Ц', 'ц' ,'К', 'к' , 'Н', 'н' , 'Ш', 'ш' , 'щ', 'Щ' ,
'З', 'з' , 'Х', 'х' ,'Ф', 'ф' , 'В', 'в' , 'П', 'п' , 'Р', 'р' ,
'Л', 'л' , 'Д', 'д' ,'Ж', 'ж' , 'Ч', 'ч' , 'С', 'с' , 'М', 'м' ,
'т', 'T' , 'б', 'Б' ,
{ english }
'q', 'Q','w', 'W', 'r', 'R','t', 'T','y', 'Y','p', 'P','s','S',
'd', 'D','f', 'F', 'g', 'G','h', 'H','k', 'K','l', 'L','z','Z',
'x', 'X','c', 'C', 'v', 'V', 'b', 'B', 'n', 'N','m', 'M' ];
SpecSign= [ 'Ы', 'ы','Ь', 'ь', 'Ъ', 'ъ'];
Function isSogl(c:Char):Boolean;
begin
Result:=c in SoglChar;
end;
Function isGlas(c:Char):Boolean;
begin
Result:=c in GlasChar;
end;
Function isSpecSign(c:Char):Boolean;
begin
Result:=c in SpecSign;
end;
Function GetSymbType(c:Char):TSymbol;
begin
if isSogl(c) then begin Result:=st_Sogl;exit;end;
if isGlas(c) then begin Result:=st_Glas;exit;end;
if isSpecSign(c) then begin Result:=st_Spec;exit;end;
Result:=st_NoDefined;
end;
Function isSlogMore(c:pSymbAr;start,len:Integer):Boolean;
var i:Integer;
glFlag:Boolean;
begin
glFlag:=false;
for i:=Start to Len- 1 do
begin
if c^[i]=st_NoDefined then begin Result:=false;exit;end;
if (c^[i]=st_Glas)and((c^[i+ 1 ]<>st_Nodefined)or(i<>Start))
then
begin
Result:=True;
exit;
end;
end;
Result:=false;
end;
{ расставлялка переносов }
Function SetHyph(pc:PChar;MaxSize:Integer):PChar;
var
HypBuff : Pointer;
h : PSymbAr;
i : Integer;
len : Integer;
Cur : Integer; { Tекущая позиция в разультирующем массиве}
cw : Integer; { Номер буквы в слове}
Lock: Integer; { счетчик блокировок}
begin
Cur:= 0 ;
len := StrLen(pc);
if (MaxSize= 0 )OR(Len= 0 ) then
begin
Result:=nil;
Exit;
end;
GetMem(HypBuff,MaxSize);
GetMem(h,Len+ 1 );
{ заполнение массива типов символов}
for i:= 0 to len- 1 do h^[i]:=GetSymbType(pc[i]);
{ собственно расстановка переносов}
cw:= 0 ;
Lock:= 0 ;
for i:= 0 to Len- 1 do
begin
PChar(HypBuff)[cur]:=PChar(pc)[i];Inc(Cur);
if i>=Len- 2 then Continue;
if h^[i]=st_NoDefined then begin cw:= 0 ;Continue;end else Inc(cw);
if Lock<> 0 then begin Dec(Lock);Continue;end;
if cw<= 1 then Continue;
if not(isSlogMore(h,i+ 1 ,len)) then Continue;
if
(h^[i]=st_Sogl)and(h^[i- 1 ]=st_Glas)and(h^[i+ 1 ]=st_Sogl)and(h^[i+ 2 ]<>st_Spec)
then begin PChar(HypBuff)[cur]:=HypSymb;Inc(Cur);Lock:= 1 ;end;
if
(h^[i]=st_Glas)and(h^[i- 1 ]=st_Sogl)and(h^[i+ 1 ]=st_Sogl)and(h^[i+ 2 ]=st_Glas)
then begin PChar(HypBuff)[cur]:=HypSymb;Inc(Cur);Lock:= 1 ;end;
if
(h^[i]=st_Glas)and(h^[i- 1 ]=st_Sogl)and(h^[i+ 1 ]=st_Glas)and(h^[i+ 2 ]=st_Sogl)
then begin PChar(HypBuff)[cur]:=HypSymb;Inc(Cur);Lock:= 1 ;end;
if (h^[i]=st_Spec) then begin
PChar(HypBuff)[cur]:=HypSymb;Inc(Cur);Lock:= 1 ; end;
end;
{}
FreeMem(h,Len+ 1 );
PChar(HypBuff)[cur]:=# 0 ;
Result:=HypBuff;
end;
Function Red_GlasMore(p:Pchar;pos:Integer):Boolean;
begin
While p[pos]<># 0 do
begin
if p[pos] in Spaces then begin Result:=False; Exit; end;
if isGlas(p[pos]) then begin Result:=True; Exit; end;
Inc(pos);
end;
Result:=False;
end;
Function Red_SlogMore(p:Pchar;pos:Integer):Boolean;
Var BeSogl,BeGlas:Boolean;
begin
BeSogl:=False;
BeGlas:=False;
While p[pos]<># 0 do
begin
if p[pos] in Spaces then Break;
if Not BeGlas then BeGlas:=isGlas(p[pos]);
if Not BeSogl then BeSogl:=isSogl(p[pos]);
Inc(pos);
end;
Result:=BeGlas and BeSogl;
end;
Function MayBeHyph(p:PChar;pos:Integer):Boolean;
var i:Integer;
len:Integer;
begin
i:=pos;
Len:=StrLen(p);
Result:=
(Len> 3 )
AND
(i> 2 )
AND
(i<Len- 2 )
AND
(not (p[i] in Spaces))
AND
(not (p[i+ 1 ] in Spaces))
AND
(not (p[i- 1 ] in Spaces))
AND
(
(isSogl(p[i])and isGlas(p[i- 1 ])and isSogl(p[i+ 1 ])and
Red_SlogMore(p,i+ 1 ))
OR
((isGlas(p[i]))and(isSogl(p[i- 1 ]))and(isSogl(p[i+ 1 ]))and(isGlas(p[i+ 2 ])))
OR
((isGlas(p[i]))and(isSogl(p[i- 1 ]))and(isGlas(p[i+ 1 ])) and
Red_SlogMore(p,i+ 1 ) )
OR
((isSpecSign(p[i])))
);
end;
Function SetHyphString(s : String):String;
Var Res:PChar;
begin
Res:=SetHyph(PChar(S),Length(S)* 2 )
Result:=Res;
FreeMem(Res,Length(S)* 2 );
end;
end.
|