Feeds:
댓글

Archive for the ‘programming’ Category

첫 Haskell 프로그램

프로그램 언어를 배우는데 젤 좋은 방법은 어떤 프로그램을 짜보는 거라는 평소의 생각에 따라 haskell로 smi 화일의 싱크를 조절하는 프로그램을 짜 보았다.

module Main where

import System.Environment
import Text.Regex.Posix

split :: String -> [String]
split line =
  let (_, _, _, result) = line =~ "(.*<SYNC (START|Start)=)([0-9]+)(>.*)" :: (String, String, String, [String]) in
  result

shiftTimeLine :: Int -> String -> String
shiftTimeLine time line =
  case split line of
    [] -> line
    [a,_,x,b] -> a ++ show ((read x) + time) ++ b

shiftTime :: [String] -> Int -> [String]
shiftTime ls time =
  map (shiftTimeLine time) ls

minuteFrom :: String -> Int
minuteFrom "" = 0
minuteFrom str = read $ take (length str - 1) str

signFrom "+" = 1
signFrom "" = 1
signFrom "-" = -1

fracFrom "" = 0
fracFrom str = read $ take 3 $ drop 1 str

parseTime :: String -> Int
parseTime time =
  let (_, _, _, result) = time =~ "([-+]?)([0-9]+:)?([0-9]+)(\\.[0-9]+)?" :: (String, String, String, [String])
      [signStr, minuteStr, secStr, fracStr] = result
      sign = signFrom signStr
      minute = minuteFrom minuteStr
      sec = read secStr :: Int
      frac = fracFrom fracStr in
  sign * ((minute * 60 + sec) * 1000 + frac)

main = do
  args <- getArgs
  case args of
    [path, time] -> do
      file <- readFile path
      writeFile (path ++ ".smi") $ unlines $ shiftTime (lines file) (parseTime time)
      return ()
    _ -> putStrLn "usage: sami filename [+|-]time"
컴파일하려면
$ ghc --make sami.hs
실행은
$ ./sami some.smi 3:00
(자막을 현재 싱크에서 3분후에 보여준다)
$ ./sami someother.smi -20.5
(자막을 현재 싱크에서 20.5초 빠르게 보여준다)
새로운 싱크의 자막은 현재 자막 이름에 .smi 붙어서 생긴다. 위의 예에서라면 some.smi.smi 이런식.

Read Full Post »