마크다운을 이용한 블로깅

Sublime 에디터를 사용하다 보니 이 블로깅도 에디터로 할 수 있으면 좋겠다는 생각이 듭니다. Markdown Extended와 같은 패키지를 사용하면 마크다운에 맞춰서 색을 표시해 주는 등, 웹에 접속하지 않고 간편하고 빠르게 사용하기 좋을 것 같습니다. 찾아보니 대부분 마크다운을 이용해서 마크업을 하며 다음과 같은 몇가지 방법들이 있습니다.
  1. 워드프레스용 패키지 어떻게 사용하는지 모르겠지만 현재 사용하는 Blogger에는 쓰기 어려울것 같습니다. Blogger용으로 포스팅 목록도 볼 수 있고 마크다운도 쓰고 하는 패키지를 만들어보고 싶은 마음도 들었습니다만, 파이썬은 1.X 버전때 사용해서 이제는 거의 새로 배워야 할것 같고 sublime 패키지 작성법에다 Blogger API까지 공부해야 하니 그냥 넘어가기로 합니다.
  2. 드랍박스를 사용하는 방법. 마크다운으로 작성한 파일을 드랍박스에다 저장하면 원격 서버에서 읽어서 포스팅을 해 줍니다. 포스팅을 올린 다음 홈페이지에 접속해서 Publish 명령을 내려줘야 하거나 소스 코드의 하이라이트닝을 지원해 주지 않아서 탈락.
  3. 간이 블로그 서버를 하나 만들어 볼까 고민하다 떠오른 생각이 사용자 컴퓨터에서 마크다운 파일을 읽어 HTML로 변환한 다음 Blogger에 올려주는 방법입니다.

이용한 자바 라이브러리들

다음과 같은 라이브러리들을 참조했습니다
  • Markdown4j 자바용 마크다운 변환 라이브러리입니다. 시험삼아 몇가지 돌려보니 이상하게 동작하는 경우도 있지만 PegDown도 마찬가지였고 PegDown에 비해 간단하게 플러그인을 지원해 주기 때문에 소스 코드 하이라이트를 사용할 수 있었습니다.
  • java-prettify 자바용 소스 코드 하이라이트 라이브러리입니다. 구글 Prettify를 자바용으로 포팅한 것인데 스윙용 에디터까지 만들어져 있습니다. 같은 제작자가 SyntaxHighlighter를 포팅한 java-syntax-hilighter도 있습니다.
위 두가지 라이브러리를 사용해서 마크다운 파일을 HTML로 변환하며 소스코드 하이라이트도 함께 적용해 주는 프로그램을 만들었습니다. 현재는 실행디렉토리에 인자로 받은 파일과 같은 이름의 HTML 파일을 생성하고 마치는 정도입니다.
TODO
도대체 언제?
  1. Blogger API를 사용해서 직접 Blogger에 파일을 관리한다
  2. GUI를 작성한다
소스코드는 git에서 볼 수 있습니다. 이 글이 프로그램을 사용해서 올리는 첫번째 포스팅이 되겠네요.
import org.markdown4j.{Markdown4jProcessor, Plugin}
import io.Source._
import java.nio.file.{Files, Paths}
import prettify.PrettifyParser
import syntaxhighlight.ParseResult

object Md2Blogger {
  private val mdcode =
    new util.matching.Regex("""(?ms)^```\s*(\w{2,})\s*$(.+?)^```""", "lang", "code")
  def markdown2html(md:String):String = {
    val converted = mdcode.replaceAllIn(md,
      { m => """%%%code lang=$1$2%%%""" }
    )
    println(converted)
    new Markdown4jProcessor().registerPlugins(new CodeHighlight()).
  }

  def splitFileName(name:String):(String, String) = {
    val dot = name.lastIndexOf('.')
    if (dot < 0) (name, "")
    else (name.take(dot-1), name.drop(dot))
  }

  def writeToFile(fn:String, content:String):Unit = {
    val pw = new java.io.PrintWriter(new java.io.File(fn))
    try pw.write(content) finally pw.close
  }

  def main(args:Array[String]) {
    if (args.isEmpty) throw new Exception("Missing file name")
    val (name, ext) = splitFileName(args(0))
    val fname = if (ext.size == 0) s"$name.md" else "$name.$ext"
    val file = java.nio.file.FileSystems.getDefault.getPath(fname)
    if (!Files.exists(file)) throw new Exception(s"Cannot find ${file.toString}")
    val htmlContent = markdown2html(io.Source.fromFile(file.toFile).mkString)
    writeToFile(s"$name.html", htmlContent)
  }
}

PS. Prettify의 출력을 보니 눈이 어질하네요. 그림 업로드는 Blogger API에서 지원해주지 않기 때문에 HTML 파일업로드 후 웹 인터페이스를 사용해서 에디터의 스크린샷을 올려봅니다. Sublime의 MarkDown Extended와 Monokai Extended를 사용해서 하이라이트를 적용한 상태입니다.

댓글

이 블로그의 인기 게시물

터미널에서 스칼라 파일 직접 컴파일, 실행

로잉 머신 운동 2달째

curses 라이브러리 간단한 정리