Convert code bằng Turbo Pascal

Convent code là thay thế một số kí tự đặc biệt thành một số kí tự được quy định trước. ' thành &#39; " thành &quot; < thành &lt; > thành &gt; & thành &amp; . Trên internet có rất nhiều các loại công cụ convent code, hầu hết chúng đều sử dụng Javascript, còn mình thì sẽ làm riêng một cái bằng ngôn ngữ Turbo Pascal, lí do là nó rất gần gũi với học sinh và bạn hãy xem đây như là một bài tập Pascal kiểu tệp.

#Ý tưởng

Ban đầu mình có ý sử dụng mảng kiểu xâu để xử lí, nhưng sau đó mình nhận ra nó có nhiều hạn chế - đặc biệt là phần đọc dữ liệu. Cuối cùng mình quyết định sử dụng kiểu tệp, ta sẽ nhập code vào một file và kết quả sẽ được lưu ở một file khác - ưu điểm là chúng ta có thể nhập vào bao nhiêu tùy ý không bị giới hạn . Như vậy, khi sử lí xong thì chúng ta dùng NOTEPAD để mở file lưu kết quả ra để lấy code đã được convent.

Tuy nhiên, mình sẽ đọc được kí tự nào thì xử lí rồi viết luôn, cho nên cách mở tệp và đóng tệp cũng hơi khác. Chúng ta sẽ mở cả hai tệp (vào - ra) cùng một lúc - điều này cho phép chúng ta vừa đọc vừa ghi.

assign(f,fi);
assign(f2,fo);
reset(f);
rewrite(f2);
{
.................
}
close(f);
close(f2);

#Thuật toán

Thuật toán của bài này chẳng có gì là cao siêu, ta có thể nói hết qua vài dòng:
Bước 1: Nhập code
Bước 2: Nếu ở cuối file thì kết thúc chương trình
Bước 3: Nếu ở cuối một dòng thì xuống dòng tiêp theo
Bước 4: Đọc vào một kí tự
Bước 5: Nếu nó là kí tự đặc biệt thì viết kí tự thay thế vào file ra , ngược lại ta viết kí tự đó vào file ra
Bước 6: Quay lại bước 2

#Một vài lưu ý về chương trình con trong bài

Dấu nháy đơn(') trong Pascal là một kí tự đặc biệt, để viết được nó thì bạn hãy viết hai lí tự nháy đơn liên tiếp(''). Cho nên để có được một xâu dấu nháy đơn bạn sẽ viết bốn kí tự nháy đơn liên tiếp('''') - đừng nhấm đây là hai dấu nháy kép nha. 
Hàm exit trong Pascal giúp bạn thoát vô điều kiện khỏi một chương trình con.
Câu lệnh Case of giúp bạn rẽ nhánh thuận tiện hơn, bạn có thể tham khảo ở trang 132 SGK Tin Học 11.
Vì bài này có nhiều trường hợp nên mình sẽ dùng case of để rẽ nhánh cho thuận tiện, nhưng cũng đã có rắc rối. Vì chúng ta chỉ thay thế các kí tự đặc biệt còn các kí tự khác thì vẫn phải xuất ra bình thường. Chúng ta sử dụng case of để rẽ nhánh các trường hợp đặc biệt nhưng với trường hợp kí tự thường thì sao? Mình nghĩ ra một giải pháp là ngay sau khi thự hiện một nhánh trong case of ta sẽ viết kí tự đó ra rồi exit ngay nếu không rẽ nhánh trong case of  thì ta viết kí tự đó ra.

#Chương trình

Program convent_code_html;
const fi='vao.inp';
         fo='ra.out';
var f,f2: text ;
a: char;

   procedure check (b:char);
   begin
      case b of
    '''' :  begin write(f2,'&#39;');  exit; end;
    '"'  :  begin write(f2,'&quot;'); exit; end;
    '<'  :  begin write(f2,'&lt;');   exit; end;
    '>'  :  begin write(f2,'&gt;');   exit; end;
    '&'  :  begin write(f2,'&amp;');  exit; end;
 end;
 write(f2,b);
   end;

begin
assign(f,fi);
assign(f2,fo);
reset(f);
rewrite(f2);
while not(eof(f)) do
   begin
   while not(eoln(f)) do
      begin
    read(f,a);
check(a);
 end;
   readln(f);
   writeln(f2);
   end;
close(f2);
close(f);
end.

Comments