|
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
|