Помощь - Поиск - Пользователи - Календарь
Полная версия: Форматтер кода
Форум «Всё о Паскале» > Для всех > Ссылки
sheka
подскажите, пожалуйста, где можна найти такую программку, которая оформляла бы текст программы, или как такую самому сделать.
например, так:
из:
begin
a:=1;
end;

в:
begin
a:=1;
end;

Даже как называется не знаю:)
пробовал что-то сам такое сделать за минут 10, но там столько разных вариантов...

Что-то типа такого вышло:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure into_dop_from_trimmed;
var
fin,fout:textfile;
str:string;
begin
assignfile(fin,Form1.edit1.Text+'(Trimmed).PAS');
reset(fin);
assignfile(fout,'dop.txt');
rewrite(fout);
while not Eof(fin) do
begin
readln(fin,str);
writeln(fout,str);
end;
Closefile(fout);
Closefile(fin);
end;

function min(a,b:byte):byte;
begin
if a<=b then min:=a
else min:=b;
end;

(*После каждой точки с запятой перенос на новую строку*)
procedure into_new_line;
var
fin,fout:textfile;
str:string;
position:byte;
begin
assignfile(fin,Form1.edit1.Text+'.PAS');
reset(fin);
assignfile(fout,Form1.Edit1.Text+'(Trimmed).PAS');
rewrite(fout);
while not Eof(fin) do
begin
readln(fin,str);
repeat
if pos(';',str)=0 then Position:=Length(str)
else Position:=pos(';',str);
writeln(fout,Copy(str,1,Position));
Delete(str,1,Position);
while (0<Length(str))and(str[1]=' ') do Delete(str,1,1);
until str='';
end;
Closefile(fout);
Closefile(fin);
end;

(*Отступы перед каждой строкой*)
procedure otstup;
const Dlina_otstup=2;
var
fin,fout:textfile;
str:string;
i,kol_otstup:byte; (*Количество отступов*)
begin
into_dop_from_trimmed;
kol_otstup:=0;
assignfile(fin,'dop.txt');
reset(fin);
assignfile(fout,Form1.Edit1.Text+'(Trimmed).PAS');
rewrite(fout);
while not Eof(fin) do
begin
readln(fin,str);
if (pos('end',str)<>0)then if kol_otstup>0 then dec(kol_otstup);
for i:=1 to kol_otstup*Dlina_otstup do str:=' '+str;
writeln(fout,str);
if (pos('begin',str)<>0)or (pos('case',str)<>0)then inc(kol_otstup);
end;
Closefile(fout);
Closefile(fin);
Erase(fin);
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
into_new_line;
otstup;
halt;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
{edit1.SetFocus;}
end;

end.

volvo
Ты о форматтере кода?

Полезные программы и утилиты
sheka
Да, спасибо, о ней.
Только как этим "форматтером" пользоваться?
у меня при запуске ехе она сразу вылетает.
volvo
Ей надо передавать параметры через командную строку. Вот тут есть список настроек: http://www.freepascal.org/tools/ptop.var
Разберешься?
sheka
Цитата(volvo @ 26.08.2009 22:51) *

Разберешься?

Врядли.

На сколько я понял надо запустить командную строку, оттуда загрузить ptop.exe
и каким то образом передать вот эти настройки( создать чтоли какой-то ptop.cfg?) .
Цитата
Options
-h Writes a short description of these switches.

-c read options from configuration file. A configura-
tion file is not needed, ptop will revert to inter-
nal defaults then. See also -g

-i ident
Sets the number of indent spaces used for BEGIN
END; and other blocks.

-b bufsize
Sets the buffersize to bufsize. Default 255, 0 is
considered non-valid and ignored.

-v be verbose. Currently only outputs the number of
lines read/written and some error messages.

-g ptop.cfg
Writes a default configuration file to be edited to
the file ptop.cfg


В английском не сильно силен sad.gif

Добавлено через 3 мин.
Если не тяжело, объясните пожалуйста что к чему.
потому что из всех настроек я понял только зачем нужна эта:
Цитата
-i ident
Sets the number of indent spaces used for BEGIN
END; and other blocks.

все остальные мне ничего не говорят.
volvo
Взял неформатированный файл (без отступов вообще), PTOP у меня находится в папке с исходниками, запустил cmd.exe, перешел в папку, где лежат исходники и PTOP, и задал команду:
F:\Programs\Pascal>ptop -i 3 __fmt.pp __fmt.pas
- добавлять по 3 отступа, исходный файл __fmt.pp, результат форматирования - в файл __fmt.pas. Получил PAS-файл, с отступами, как положено, блок While тоже выделен "лесенкой". В принципе, этой команды достаточно, чтобы можно было читать код...
sheka
Класс, супер, то что хотел!
Только один вопрос: как сделать "перешел в папку, где лежат исходники и PTOP"?
я такого не умею. там ведь пишется с:\ ...
а у меня все находится на е:\ ...
ну я воспользовался bat файлом, а как это надо было?
sheka
Понял, спасибо. т.е. надо поставить сначала перенаправление на диск, а потом только писать путь.
maksimla
а может есть такае же программа сделана на Дельфи или другом языке чтобы запустил программу указал папку как в винтовсе и выбрал файл и он отредоктировалсябы
volvo
Ну, напиши оболочку на Дельфи, которая будет давать пользователю возможность выбрать имя файла, а потом вызывать ShellExecute-ом эту самую утилиту, в чем проблема-то?
maksimla
Не знаю я Дельфи языка еще вот в этом вся проблема а в cmd.exe как то боязнено лезть могу неправильно наделать там чтото натворить нехочется терять ОС Vista я ведь совсем в досе и в cmd не разу не работал
volvo
Ну, вот тебе оболочка:

Кладешь оба EXE-шника в одну папку, и запускаешь beauty2.exe. Дальше - разберешься smile.gif Потестируй, если что не так работает, или какие еще функции добавить - говори, поправлю...

<файл удален...>
Jabbson
Было бы здорово добавить функцию "убрать форматирование" открытого файла, которая читала бы строку и удаляла пробелы до тех пор, пока не начался текст, а как только начался - идти на след строку и так до конца файла. Таким образом можно было бы автоматизировать чистку "самоформата", а не вручную деформатировать код.
volvo
Цитата
Было бы здорово добавить функцию "убрать форматирование" открытого файла

Вот так что-ли?

<файл удален...>
Jabbson
Цитата(volvo @ 28.05.2010 1:52) *

Вот так что-ли?


Да, класс!!!

Теперь это вообще конфетка. Еще бы 866 понимала, но это легко обходится.

Спасибо.

P.S.> а не, не легко, русский язык не воспринимает, а при попытке форматирования выдает ошибку "Невозможно открыть файл С, err =2"
после этого создает в той же папке файл c именем "and" без расширения. sad.gif

Хотя проблема, наверное, на моей стороне - прошлая версия теперь тоже с эксепшеном вылетает. Хотя сам ptop работает на ура...

Но с кодировкой прошлая версия работала стабильнее.
volvo
Цитата
а не, не легко, русский язык не воспринимает, а при попытке форматирования выдает ошибку "Невозможно открыть файл С, err =2"
Долго думал, почему такое происходит. Потом сообразил, что имеется в виду файл с кириллическим именем. Да, в этом случае будут сбои, естественно. Ибо утилита ptop - консольная, следовательно, OEM-кодировка, а моя программа - Юникодная... Конвертировать кодировки из одной в другую, да еще и UTF <-> OEM, да еще и не имея возможности это проверить (у меня, понимаешь ли, не русскоязычная Windows, если что. На русскоязычном софте свет клином не сошелся, есть и другие страны в мире) я не буду, муторно это, да и не надо никому. Посему программа из обращения изымается. Пользуйтесь консольной версией дальше, если лень просто напросто перевести имя файла в латиницу.

Цитата
с кодировкой прошлая версия работала стабильнее.
Неправда. Не могла она работать стабильнее по определению. Это был UNICODE-проект "от рождения", с кодировками в имени файла он работал всегда одинаково. Только латиница.

Тема с графической оболочкой закрыта.
volvo
Продолжаем.
Итак, просьба потестировать программку: Графическая оболочка для PtoP

Особо не вычищал ее, могут быть кое-где глючки, вот, собственно, для того, чтоб их убрать и была создана тема.
Федосеев Павел
Недавно, отвечая на вопрос, попытался отформатировать код топикстартера к удобоваримому виду при помощи ptop из FPC 2.6.0 с настройками по-умолчанию. Результат немного огорчил.
Что было
...................
If a=0 then
Begin
If b=0 then
If c=0 then
Writeln('-1')
else
Writeln('0')
Else
Begin
x:=c/b;
...................

Что стало
...................
If a=0 Then
Begin
If b=0 Then
If c=0 Then
Writeln('-1')
Else <---------- что это?
Writeln('0')
Else
Begin
x := c/b;
...................

Тогда я вспомнил о другом форматтере - JCF (JEDI Code Format).
"Из коробки" он поступает с ненастроенным форматированием - нужно настроить самостоятельно. Но если поискать в интернете, то можно узнать, что архив с исходниками JCF в папке "Jcf_243_source.zip\Test\TestCases\" содержит три файла с "готовыми" настройками. Один из них "JCFTestSettings.cfg" - настроен согласно рекомендациям от Borland. Его нужно скопировать в папку с распакованным JCF и переименовать в "JCFSettings.cfg".
Работать с JCF достаточно удобно - есть GUI, есть консольный вариант, а также имеется GUI утилита "JCFNotepad.exe", в закладках которой можно просматривать как изменяется форматирование при изменении настроек.
Вот результат
...................
if a = 0 then
begin
if b = 0 then
if c = 0 then
Writeln('-1')
else
Writeln('0')
else
begin
x := c / b;
...................


Ссылка на официальный сайт JEDI Code Format.
На этой страничке есть ссылка к рекомендациям по оформлению кода от Borland.
buy cialis online with prescript
cialis walmart
generic zithromax over the count
Zythromax Vs Cephalexin
nishaknapp
The quality and quantity of work produced here are absolutely informative. Thanks for sharing. 토토사이트 1 위
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.