Blame src/Text/Pandoc/Readers/Org/Shared.hs

Packit Service d2f85f
{-# LANGUAGE OverloadedStrings #-}
Packit Service d2f85f
{-
Packit Service d2f85f
Copyright (C) 2014-2017 Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
Packit Service d2f85f
Packit Service d2f85f
This program is free software; you can redistribute it and/or modify
Packit Service d2f85f
it under the terms of the GNU General Public License as published by
Packit Service d2f85f
the Free Software Foundation; either version 2 of the License, or
Packit Service d2f85f
(at your option) any later version.
Packit Service d2f85f
Packit Service d2f85f
This program is distributed in the hope that it will be useful,
Packit Service d2f85f
but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service d2f85f
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service d2f85f
GNU General Public License for more details.
Packit Service d2f85f
Packit Service d2f85f
You should have received a copy of the GNU General Public License
Packit Service d2f85f
along with this program; if not, write to the Free Software
Packit Service d2f85f
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit Service d2f85f
-}
Packit Service d2f85f
Packit Service d2f85f
{- |
Packit Service d2f85f
   Module      : Text.Pandoc.Readers.Org.Shared
Packit Service d2f85f
   Copyright   : Copyright (C) 2014-2017 Albert Krewinkel
Packit Service d2f85f
   License     : GNU GPL, version 2 or above
Packit Service d2f85f
Packit Service d2f85f
   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
Packit Service d2f85f
Packit Service d2f85f
Utility functions used in other Pandoc Org modules.
Packit Service d2f85f
-}
Packit Service d2f85f
module Text.Pandoc.Readers.Org.Shared
Packit Service d2f85f
  ( cleanLinkString
Packit Service d2f85f
  , isImageFilename
Packit Service d2f85f
  , originalLang
Packit Service d2f85f
  , translateLang
Packit Service d2f85f
  ) where
Packit Service d2f85f
Packit Service d2f85f
import Data.Char (isAlphaNum)
Packit Service d2f85f
import Data.List (isPrefixOf, isSuffixOf)
Packit Service d2f85f
Packit Service d2f85f
Packit Service d2f85f
-- | Check whether the given string looks like the path to of URL of an image.
Packit Service d2f85f
isImageFilename :: String -> Bool
Packit Service d2f85f
isImageFilename filename =
Packit Service d2f85f
  any (\x -> ('.':x)  `isSuffixOf` filename) imageExtensions &&
Packit Service d2f85f
  (any (\x -> (x ++ "://") `isPrefixOf` filename) protocols ||
Packit Service d2f85f
   ':' `notElem` filename)
Packit Service d2f85f
 where
Packit Service d2f85f
   imageExtensions = [ "jpeg" , "jpg" , "png" , "gif" , "svg" ]
Packit Service d2f85f
   protocols = [ "file", "http", "https" ]
Packit Service d2f85f
Packit Service d2f85f
-- | Cleanup and canonicalize a string describing a link.  Return @Nothing@ if
Packit Service d2f85f
-- the string does not appear to be a link.
Packit Service d2f85f
cleanLinkString :: String -> Maybe String
Packit Service d2f85f
cleanLinkString s =
Packit Service d2f85f
  case s of
Packit Service d2f85f
    '/':_                  -> Just $ "file://" ++ s  -- absolute path
Packit Service d2f85f
    '.':'/':_              -> Just s                 -- relative path
Packit Service d2f85f
    '.':'.':'/':_          -> Just s                 -- relative path
Packit Service d2f85f
    -- Relative path or URL (file schema)
Packit Service d2f85f
    'f':'i':'l':'e':':':s' -> Just $ if "//" `isPrefixOf` s' then s else s'
Packit Service d2f85f
    _                      | isUrl s            -> Just s                 -- URL
Packit Service d2f85f
    _                      -> Nothing
Packit Service d2f85f
 where
Packit Service d2f85f
   isUrl :: String -> Bool
Packit Service d2f85f
   isUrl cs =
Packit Service d2f85f
     let (scheme, path) = break (== ':') cs
Packit Service d2f85f
     in all (\c -> isAlphaNum c || c `elem` (".-"::String)) scheme
Packit Service d2f85f
          && not (null path)
Packit Service d2f85f
Packit Service d2f85f
-- | Creates an key-value pair marking the original language name specified for
Packit Service d2f85f
-- a piece of source code.
Packit Service d2f85f
Packit Service d2f85f
-- | Creates an key-value attributes marking the original language name
Packit Service d2f85f
-- specified for a piece of source code.
Packit Service d2f85f
originalLang :: String -> [(String, String)]
Packit Service d2f85f
originalLang lang =
Packit Service d2f85f
  let transLang = translateLang lang
Packit Service d2f85f
  in if transLang == lang
Packit Service d2f85f
     then []
Packit Service d2f85f
     else [("org-language", lang)]
Packit Service d2f85f
Packit Service d2f85f
-- | Translate from Org-mode's programming language identifiers to those used
Packit Service d2f85f
-- by Pandoc.  This is useful to allow for proper syntax highlighting in
Packit Service d2f85f
-- Pandoc output.
Packit Service d2f85f
translateLang :: String -> String
Packit Service d2f85f
translateLang cs =
Packit Service d2f85f
  case cs of
Packit Service d2f85f
    "C"          -> "c"
Packit Service d2f85f
    "C++"        -> "cpp"
Packit Service d2f85f
    "emacs-lisp" -> "commonlisp" -- emacs lisp is not supported
Packit Service d2f85f
    "js"         -> "javascript"
Packit Service d2f85f
    "lisp"       -> "commonlisp"
Packit Service d2f85f
    "R"          -> "r"
Packit Service d2f85f
    "sh"         -> "bash"
Packit Service d2f85f
    "sqlite"     -> "sql"
Packit Service d2f85f
    _            -> cs