or1ko's diary

日々を書きます

23

言語処理100本ノック 2015

23. セクション構造
記事中に含まれるセクション名とそのレベル(例えば"== セクション名 =="なら1)を表示せよ

23.hs

{-# LANGUAGE OverloadedStrings, DeriveGeneric #-}

import Data.Aeson as A
import Control.Applicative
import System.IO.UTF8 as I8
import System.Environment
import Data.Maybe
import Data.ByteString.Lazy.UTF8 as B
import GHC.Generics
import Text.Regex.Posix
import Prelude as P

data Article = Article {
  text :: String,
  title :: String
} deriving (Eq, Show, Generic)
instance FromJSON Article

main = do
  filename <- head <$> getArgs
  body <- fromString <$> I8.readFile filename
  I8.writeFile "23.txt" $ unlines $ map f $ filter isHeadline $ concatMap P.lines $ map (text . fromJust . A.decode) $ B.lines $ body 
    where
      f x = headline x ++ "," ++ depth x 
      isHeadline = ((=~ ("^={2,6}.*={2,6}" :: String)) :: String -> Bool)
      headline = filter (\x -> (x /= ' ') && (x /= '='))
      depth = show . P.length . ((=~ ("=+" :: String)) :: String -> String)