HaTeX-3.17.0.0: Text/LaTeX/Packages/QRCode.hs
{-# LANGUAGE OverloadedStrings #-}
module Text.LaTeX.Packages.QRCode
( -- * qrcode package
qrcode
-- * qrcode commands
, ErrorLevel(..)
, CodeOptions(..)
, defaultOptions
, qr
-- * Package Options
, draft
, final
) where
import Text.LaTeX.Base (raw)
import Text.LaTeX.Base.Syntax
import Text.LaTeX.Base.Class
import Text.LaTeX.Base.Render
import Text.LaTeX.Base.Types
import Text.LaTeX.Base.Texy
import qualified Data.Text as T
import Data.Char (toLower)
-- | qrcode package. Use it to import it like this:
--
-- > usepackage [] qrcode
qrcode :: PackageName
qrcode = "qrcode"
-- | The degree of error-correction redundancy to
-- include in the generated code.
data ErrorLevel = Low -- ^ Error recovery up to 7%.
| Medium -- ^ Error recovery up to 15%.
| Quality -- ^ Error recovery up to 25%.
| High -- ^ Error recovery up to 30%.
deriving (Eq, Ord, Read, Show)
-- | Options to use when generating a QR code.
data CodeOptions = CodeOptions {
includePadding :: Bool -- ^ Whether to include 4 modules of whitespace around the code. False is the default.
, link :: Bool -- ^ Whether, if the code encodes a link, it should be hyperlinked in the PDF document. The default is true. Links will only be generated when the document uses the hyperref package.
, errorLevel :: ErrorLevel -- ^ The desired degree of error-correction redundancy to include in the code. The default is 'Medium'.
}
deriving (Eq, Show)
-- | The default QR code generation options.
defaultOptions :: CodeOptions
defaultOptions = CodeOptions { includePadding = False, link = True, errorLevel = Medium }
-- | This package option sets the qrcode package to generate draft-quality placeholders for QR codes.
draft :: LaTeXC l => l
draft = "draft"
-- | This package option (which is the default) sets the qrcode package to generate print-quality QR codes.
final :: LaTeXC l => l
final = "draft"
-- | Generates a QR code with specified options and content.
--
-- This uses the \qrcode command from the package, but the identifier
-- 'qrcode' is already in use as the 'PackageName'.
qr :: LaTeXC l => CodeOptions -> Text -> l
qr opt payload = fromLaTeX $ TeXComm "qrcode" [opts, FixArg . raw . escape $ payload]
where
opts = MOptArg [ if includePadding opt then "padding" else "tight"
, if link opt then "link" else "nolink"
, texy . ("level=" <>) . T.singleton . toLower . head . show . errorLevel $ opt
]
-- Helper functions for escaping code contents.
escape :: Text -> Text
escape = T.concatMap handleChar
where handleChar c | isSpecial c = T.pack ['\\', c]
| otherwise = T.singleton c
isSpecial :: Char -> Bool
isSpecial c = elem c ("#$&^_~% \\{}" :: String)