IPB
ЛогинПароль:

> Форматтер кода, Подскажите где найти
sheka
сообщение 26.08.2009 20:32
Сообщение #1


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


подскажите, пожалуйста, где можна найти такую программку, которая оформляла бы текст программы, или как такую самому сделать.
например, так:
из:
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.



Сообщение отредактировано: sheka - 27.08.2009 19:28
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 18)
volvo
сообщение 26.08.2009 21:36
Сообщение #2


Гость






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

Полезные программы и утилиты
 К началу страницы 
+ Ответить 
sheka
сообщение 26.08.2009 22:45
Сообщение #3


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Да, спасибо, о ней.
Только как этим "форматтером" пользоваться?
у меня при запуске ехе она сразу вылетает.

Сообщение отредактировано: sheka - 26.08.2009 22:45
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.08.2009 22:51
Сообщение #4


Гость






Ей надо передавать параметры через командную строку. Вот тут есть список настроек: http://www.freepascal.org/tools/ptop.var
Разберешься?
 К началу страницы 
+ Ответить 
sheka
сообщение 26.08.2009 23:10
Сообщение #5


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Цитата(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.

все остальные мне ничего не говорят.

Сообщение отредактировано: sheka - 26.08.2009 23:14
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.08.2009 23:27
Сообщение #6


Гость






Взял неформатированный файл (без отступов вообще), PTOP у меня находится в папке с исходниками, запустил cmd.exe, перешел в папку, где лежат исходники и PTOP, и задал команду:
F:\Programs\Pascal>ptop -i 3 __fmt.pp __fmt.pas
- добавлять по 3 отступа, исходный файл __fmt.pp, результат форматирования - в файл __fmt.pas. Получил PAS-файл, с отступами, как положено, блок While тоже выделен "лесенкой". В принципе, этой команды достаточно, чтобы можно было читать код...
 К началу страницы 
+ Ответить 
sheka
сообщение 27.08.2009 0:18
Сообщение #7


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Класс, супер, то что хотел!
Только один вопрос: как сделать "перешел в папку, где лежат исходники и PTOP"?
я такого не умею. там ведь пишется с:\ ...
а у меня все находится на е:\ ...
ну я воспользовался bat файлом, а как это надо было?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.08.2009 0:35
Сообщение #8


Гость






Я вот так делаю:
Прикрепленное изображение
 К началу страницы 
+ Ответить 
sheka
сообщение 27.08.2009 0:39
Сообщение #9


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Понял, спасибо. т.е. надо поставить сначала перенаправление на диск, а потом только писать путь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
maksimla
сообщение 26.10.2009 16:25
Сообщение #10


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


а может есть такае же программа сделана на Дельфи или другом языке чтобы запустил программу указал папку как в винтовсе и выбрал файл и он отредоктировалсябы


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.10.2009 16:58
Сообщение #11


Гость






Ну, напиши оболочку на Дельфи, которая будет давать пользователю возможность выбрать имя файла, а потом вызывать ShellExecute-ом эту самую утилиту, в чем проблема-то?
 К началу страницы 
+ Ответить 
maksimla
сообщение 27.10.2009 9:38
Сообщение #12


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


Не знаю я Дельфи языка еще вот в этом вся проблема а в cmd.exe как то боязнено лезть могу неправильно наделать там чтото натворить нехочется терять ОС Vista я ведь совсем в досе и в cmd не разу не работал


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.10.2009 1:39
Сообщение #13


Гость






Ну, вот тебе оболочка:

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

<файл удален...>

Сообщение отредактировано: volvo - 1.08.2010 22:28
 К началу страницы 
+ Ответить 
Jabbson
сообщение 27.05.2010 23:57
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Арсений

Репутация: -  0  +


Было бы здорово добавить функцию "убрать форматирование" открытого файла, которая читала бы строку и удаляла пробелы до тех пор, пока не начался текст, а как только начался - идти на след строку и так до конца файла. Таким образом можно было бы автоматизировать чистку "самоформата", а не вручную деформатировать код.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.05.2010 1:52
Сообщение #15


Гость






Цитата
Было бы здорово добавить функцию "убрать форматирование" открытого файла

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

<файл удален...>

Сообщение отредактировано: volvo - 1.08.2010 22:28
 К началу страницы 
+ Ответить 
Jabbson
сообщение 18.07.2010 11:07
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Арсений

Репутация: -  0  +


Цитата(volvo @ 28.05.2010 1:52) *

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


Да, класс!!!

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

Спасибо.

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

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

Но с кодировкой прошлая версия работала стабильнее.

Сообщение отредактировано: Jabbson - 18.07.2010 11:42
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.08.2010 22:26
Сообщение #17


Гость






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

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

Тема с графической оболочкой закрыта.

Сообщение отредактировано: volvo - 7.09.2010 14:59
 К началу страницы 
+ Ответить 
volvo
сообщение 7.09.2010 15:26
Сообщение #18


Гость






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

Особо не вычищал ее, могут быть кое-где глючки, вот, собственно, для того, чтоб их убрать и была создана тема.
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 20.01.2013 17:54
Сообщение #19


Бывалый
***

Группа: Пользователи
Сообщений: 298
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  8  +


Недавно, отвечая на вопрос, попытался отформатировать код топикстартера к удобоваримому виду при помощи 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 6.11.2024 12:05
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"