Syntax highlighting

คิดๆ อยากจะเขียน code snippet (ที่ไม่เกี่ยวกับ mac development) ลงในนี้บ้างเหมือนกัน แต่ว่ามันไม่มี highlighting เจ๋งๆ เลย ไอ้ตัวที่ใช้อยู่นานนมกาเลอย่าง code2html ก็ดันไม่ highlight Haskell อีก จะเขียนเพิ่มเข้าไปเองก็ขี้เกียจ (ทั้งๆ ที่จริงๆ ก็ทำได้อ่ะนะ แต่ว่า code มันเขียนแบบ Perl-ish มากกกกก แถมไม่ factored ไม่แยก module เท่าไหร่) … อืมมม มันต้องมีคนคิดเหมือนเราสิ ว่าแล้วก็เริ่มหา

สักพักก็ไปเจอหน้า Plugins/Syntax Highlighting ที่ Wordpress เอง แต่ว่าเท่าที่อ่านๆ ดูไม่ค่อยจะมีตัวไหนเข้าท่าเลยแฮะ (มันไม่ highlight Haskell ซักกะตัว เท่าที่อ่านแบบผ่านๆ) นอกจาก Vim Color แต่ว่าไอ้ตัวนี้ก็ดันไป dependent กับ Text::VimColor ที่เป็น Perl module ต้องลงผ่าน CPAN อีก เออ ไม่เป็นไร ลงก็ได้ แต่ว่าก็ดัน build ไม่ผ่านซะงั้น (test ผ่านน้อยไปหน่อย) จะ force install ลงเลย ก็ดันไม่ work อีก เฮ้อ เบื่อจริง ก็เลยต้องหาต่อไป

และแล้วเราก็ไปเจอ GeSHi: Generic Syntax Highlighter ที่เขียนในภาษา PHP เราก็เลยเอามาเขียนทำเป็น command line application ง่ายๆ ที่อ่านไฟล์ตาม argument แล้วก็เดาภาษาจาก extension ของไฟล์ แล้วก็พ่น highlighted code ที่เป็น HTML ออกมาให้เรา code-paste ใส่ blog ได้ผลดังนี้ (Haskell)

import List
 
permute [] = [[]]
permute xs = [x:ys | x <- xs, ys <- permute (delete x xs)]
 

หรือว่าภาษา Ruby แบบนี้

class Array
  def permute
    return [self] if size < 2
    perm = []
    each {|e| (self - [e]).permute.each {|p| perm << ([e] + p)}}
    perm
  end
end
 
[0,1,2,3].permute.each {|e| p e }

ก็ใช้ได้อ่ะนะ แต่ว่ามันอาจจะรก HTML code ไปหน่อยนึง

[update 1]: พอมี line number แล้วมันเละใน blog แฮะ เลยเอาออก ไว้จะแก้ CSS ทีหลัง ตอนนี้ขี้เกียจ (อีกล่ะ)

[update 2]: เพิ่งจะสังเกตจากหน้า web ว่า \\ ใน code haskell มันหายแฮะ เหลือแค่ตัวเดียว .. ไม่รู้เหมือนกันว่าทำไม code ฝั่งนี้ก็ยังอยู่นะ เลยไม่รู้จะว่าไงดี :-(

[update 3]: สุดท้ายก็เลยลงเอยด้วยการเขียน code ใหม่ไม่ให้มันมี \\ อืมมม อ่านเป็นภาษาคนกว่าเก่าแฮะ แต่ว่ามัน geek-ish น้อยลง :-P

[update 4]: อ๊ากกก GeSHi มันไม่มี Erlang highlighting! ว้า กำลังจะหัดเล่นอยู่เลย ว่าแต่ Erlang นี่ทำไมมันลูกเมียน้อยตอนนี้จังเลย emacs ก็ไม่มี (ผมใช้ Carbon Emacs distribution) TextMate ก็ไม่มี มีแต่ vim … สุดท้ายก็ตายรังสินะ แต่ว่า Emacs mode ของ Erlang ก็ไม่น่าหายากเท่าไหร่ [note -- ณ ปัจจุบัน เจอแล้ว] ไม่เป็นไร มีเวลาและชินๆ กับ Erlang มากกว่านี้เมื่อไหร่ (พอจะชินกับ module/keywords) แล้วเดี๋ยวค่อยทำเพิ่มเข้าไปใน GeSHi เองก็ได้วะ

6 Responses to “Syntax highlighting”

  1. Ford AntiTrust Says:

    ใน Wordpress นี่ใช้ iG:Syntax Hiliter อยู่ครับ ก็ ok แต่มันไป conflict กับ fckeditor เซงเลย แถม tinymce ก็ไม่ work สำหรับผม ตอนนี้เลยไม่ใช้ทั้งสองตัว ใช้ hardcode เขียน blog แทนมาได้สักแล้ว T_T

    แต่พอดีว่าเมื่อไม่กี่วัน Windows Live Writer ออกตัวเต็มมาได้ลองใช้แล้วค่อยยังชั่ว ok เลย

  2. rawitat Says:

    เมื่อกี้เข้าไปดูรายละเอียดของ iG นะ เห็นบอกว่าใช้ GeSHi เป็น engine เหมือนกัน แต่ว่าทำไมมันเขียนว่า support แค่ Actionscript, ASP, C, C++, CSS, HTML, JAVA, JAVASCRIPT, PERL, PHP, PYTHON, SQL, VISUAL BASIC & XML. ก็ไม่รู้นะ เพราะว่า GeSHi มัน support Haskell และอีกหลายๆ ภาษา เช่น Objective-C, OCaML, Scheme ฯลฯ ด้วย (พี่อยากได้ Haskell highlight ด้วยน่ะ)

    ยังไงก็ลองเอา GeSHi ไปลงที่เครื่องแล้วเขียนเรียกใช้แบบ command line ให้มันพ่น code ออกมา (ลง text file ก็ได้) แล้วก็ code paste เอาสิ อาจจะ work นะ (ตอนนี้ก็ทำแบบนี้อยู่)

  3. Ford AntiTrust Says:

    พอดีว่าหาๆ ดูไปเจอของดีเข้า อยู่ที่ http://dev.splitbrain.org/reference/dokuwiki/inc/geshi/haskell.php.source.txt ครับ

    หน้าแรกของ source ก็ http://dev.splitbrain.org/reference/dokuwiki/nav.html?_constants/index.html นะครับ

    ที่ Explorer ด้านซ้ายให้เข้าไปที่ /inc/geshi/ ครับผม

    จะมี source ของตัวนี้หลายอันมาก

    ยังไม่ได้ทดสอบว่าใช้งานแล้ว work หรือเปล่า เดี่ยวคงต้อง hack ในตัว plugins iG:Syntax Hiliter อีกรอบครับผม

  4. rawitat Says:

    ลอง load GeSHi เต็มๆ ตัวไปลงสิ มันมี .php ไว้ให้ใช้เต็มเลย haskell.php ก็มีด้วย

  5. Ford AntiTrust Says:

    ผมลองแล้วหล่ะครับ พี่ลองอ่านที่ http://www.thaicyberpoint.com/ford/blog/id/347/ นะครับ

  6. rawitat Says:

    เออ ใช้ได้แฮะ ท่าทางจะต้องลองมั่ง

Leave a Reply

You must be logged in to post a comment.

September 2007
M T W T F S S
« Aug   Oct »
 12
3456789
10111213141516
17181920212223
24252627282930