lib: Remove unused String utility functions.
This commit is contained in:
parent
0b419adba2
commit
e80bb37b1c
@ -7,7 +7,6 @@ module Hledger.Utils.String (
|
|||||||
uppercase,
|
uppercase,
|
||||||
underline,
|
underline,
|
||||||
stripbrackets,
|
stripbrackets,
|
||||||
unbracket,
|
|
||||||
-- quoting
|
-- quoting
|
||||||
quoteIfNeeded,
|
quoteIfNeeded,
|
||||||
singleQuoteIfNeeded,
|
singleQuoteIfNeeded,
|
||||||
@ -26,43 +25,23 @@ module Hledger.Utils.String (
|
|||||||
elideLeft,
|
elideLeft,
|
||||||
elideRight,
|
elideRight,
|
||||||
formatString,
|
formatString,
|
||||||
-- * multi-line layout
|
|
||||||
concatTopPadded,
|
|
||||||
concatBottomPadded,
|
|
||||||
concatOneLine,
|
|
||||||
vConcatLeftAligned,
|
|
||||||
vConcatRightAligned,
|
|
||||||
padtop,
|
|
||||||
padbottom,
|
|
||||||
padleft,
|
|
||||||
padright,
|
|
||||||
cliptopleft,
|
|
||||||
fitto,
|
|
||||||
-- * wide-character-aware layout
|
-- * wide-character-aware layout
|
||||||
charWidth,
|
charWidth,
|
||||||
strWidth,
|
strWidth,
|
||||||
strWidthAnsi,
|
strWidthAnsi,
|
||||||
takeWidth,
|
takeWidth,
|
||||||
fitString,
|
|
||||||
fitStringMulti,
|
|
||||||
padLeftWide,
|
|
||||||
padRightWide
|
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
|
||||||
import Data.Char (isSpace, toLower, toUpper)
|
import Data.Char (isSpace, toLower, toUpper)
|
||||||
import Data.Default (def)
|
|
||||||
import Data.List (intercalate)
|
import Data.List (intercalate)
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Data.Text.Lazy as TL
|
|
||||||
import Text.Megaparsec ((<|>), between, many, noneOf, sepBy)
|
import Text.Megaparsec ((<|>), between, many, noneOf, sepBy)
|
||||||
import Text.Megaparsec.Char (char)
|
import Text.Megaparsec.Char (char)
|
||||||
import Text.Printf (printf)
|
import Text.Printf (printf)
|
||||||
|
|
||||||
import Hledger.Utils.Parse
|
import Hledger.Utils.Parse
|
||||||
import Hledger.Utils.Regex (toRegex', regexReplace)
|
import Hledger.Utils.Regex (toRegex', regexReplace)
|
||||||
import Text.Tabular.AsciiWide
|
|
||||||
(Align(..), Header(..), Properties(..), TableOpts(..), textCell, renderRow)
|
|
||||||
import Text.WideString (charWidth, strWidth)
|
import Text.WideString (charWidth, strWidth)
|
||||||
|
|
||||||
|
|
||||||
@ -176,150 +155,8 @@ isSingleQuoted _ = False
|
|||||||
isDoubleQuoted s@(_:_:_) = head s == '"' && last s == '"'
|
isDoubleQuoted s@(_:_:_) = head s == '"' && last s == '"'
|
||||||
isDoubleQuoted _ = False
|
isDoubleQuoted _ = False
|
||||||
|
|
||||||
unbracket :: String -> String
|
|
||||||
unbracket s
|
|
||||||
| (head s == '[' && last s == ']') || (head s == '(' && last s == ')') = init $ tail s
|
|
||||||
| otherwise = s
|
|
||||||
|
|
||||||
-- | Join several multi-line strings as side-by-side rectangular strings of the same height, top-padded.
|
|
||||||
-- Treats wide characters as double width.
|
|
||||||
concatTopPadded :: [String] -> String
|
|
||||||
concatTopPadded = TL.unpack . renderRow def{tableBorders=False, borderSpaces=False}
|
|
||||||
. Group NoLine . map (Header . textCell BottomLeft . T.pack)
|
|
||||||
|
|
||||||
-- | Join several multi-line strings as side-by-side rectangular strings of the same height, bottom-padded.
|
|
||||||
-- Treats wide characters as double width.
|
|
||||||
concatBottomPadded :: [String] -> String
|
|
||||||
concatBottomPadded = TL.unpack . renderRow def{tableBorders=False, borderSpaces=False}
|
|
||||||
. Group NoLine . map (Header . textCell TopLeft . T.pack)
|
|
||||||
|
|
||||||
-- | Join multi-line strings horizontally, after compressing each of
|
|
||||||
-- them to a single line with a comma and space between each original line.
|
|
||||||
concatOneLine :: [String] -> String
|
|
||||||
concatOneLine strs = concat $ map ((intercalate ", ").lines) strs
|
|
||||||
|
|
||||||
-- | Join strings vertically, left-aligned and right-padded.
|
|
||||||
vConcatLeftAligned :: [String] -> String
|
|
||||||
vConcatLeftAligned ss = intercalate "\n" $ map showfixedwidth ss
|
|
||||||
where
|
|
||||||
showfixedwidth = printf (printf "%%-%ds" width)
|
|
||||||
width = maximum $ map length ss
|
|
||||||
|
|
||||||
-- | Join strings vertically, right-aligned and left-padded.
|
|
||||||
vConcatRightAligned :: [String] -> String
|
|
||||||
vConcatRightAligned ss = intercalate "\n" $ map showfixedwidth ss
|
|
||||||
where
|
|
||||||
showfixedwidth = printf (printf "%%%ds" width)
|
|
||||||
width = maximum $ map length ss
|
|
||||||
|
|
||||||
-- | Convert a multi-line string to a rectangular string top-padded to the specified height.
|
|
||||||
padtop :: Int -> String -> String
|
|
||||||
padtop h s = intercalate "\n" xpadded
|
|
||||||
where
|
|
||||||
ls = lines s
|
|
||||||
sh = length ls
|
|
||||||
sw | null ls = 0
|
|
||||||
| otherwise = maximum $ map length ls
|
|
||||||
ypadded = replicate (difforzero h sh) "" ++ ls
|
|
||||||
xpadded = map (padleft sw) ypadded
|
|
||||||
|
|
||||||
-- | Convert a multi-line string to a rectangular string bottom-padded to the specified height.
|
|
||||||
padbottom :: Int -> String -> String
|
|
||||||
padbottom h s = intercalate "\n" xpadded
|
|
||||||
where
|
|
||||||
ls = lines s
|
|
||||||
sh = length ls
|
|
||||||
sw | null ls = 0
|
|
||||||
| otherwise = maximum $ map length ls
|
|
||||||
ypadded = ls ++ replicate (difforzero h sh) ""
|
|
||||||
xpadded = map (padleft sw) ypadded
|
|
||||||
|
|
||||||
difforzero :: (Num a, Ord a) => a -> a -> a
|
|
||||||
difforzero a b = maximum [(a - b), 0]
|
|
||||||
|
|
||||||
-- | Convert a multi-line string to a rectangular string left-padded to the specified width.
|
|
||||||
-- Treats wide characters as double width.
|
|
||||||
padleft :: Int -> String -> String
|
|
||||||
padleft w "" = concat $ replicate w " "
|
|
||||||
padleft w s = intercalate "\n" $ map (printf (printf "%%%ds" w)) $ lines s
|
|
||||||
|
|
||||||
-- | Convert a multi-line string to a rectangular string right-padded to the specified width.
|
|
||||||
-- Treats wide characters as double width.
|
|
||||||
padright :: Int -> String -> String
|
|
||||||
padright w "" = concat $ replicate w " "
|
|
||||||
padright w s = intercalate "\n" $ map (printf (printf "%%-%ds" w)) $ lines s
|
|
||||||
|
|
||||||
-- | Clip a multi-line string to the specified width and height from the top left.
|
|
||||||
cliptopleft :: Int -> Int -> String -> String
|
|
||||||
cliptopleft w h = intercalate "\n" . take h . map (take w) . lines
|
|
||||||
|
|
||||||
-- | Clip and pad a multi-line string to fill the specified width and height.
|
|
||||||
fitto :: Int -> Int -> String -> String
|
|
||||||
fitto w h s = intercalate "\n" $ take h $ rows ++ repeat blankline
|
|
||||||
where
|
|
||||||
rows = map (fit w) $ lines s
|
|
||||||
fit w = take w . (++ repeat ' ')
|
|
||||||
blankline = replicate w ' '
|
|
||||||
|
|
||||||
-- Functions below treat wide (eg CJK) characters as double-width.
|
-- Functions below treat wide (eg CJK) characters as double-width.
|
||||||
|
|
||||||
-- | General-purpose wide-char-aware single-line string layout function.
|
|
||||||
-- It can left- or right-pad a short string to a minimum width.
|
|
||||||
-- It can left- or right-clip a long string to a maximum width, optionally inserting an ellipsis (the third argument).
|
|
||||||
-- It clips and pads on the right when the fourth argument is true, otherwise on the left.
|
|
||||||
-- It treats wide characters as double width.
|
|
||||||
fitString :: Maybe Int -> Maybe Int -> Bool -> Bool -> String -> String
|
|
||||||
fitString mminwidth mmaxwidth ellipsify rightside s = (clip . pad) s
|
|
||||||
where
|
|
||||||
clip :: String -> String
|
|
||||||
clip s =
|
|
||||||
case mmaxwidth of
|
|
||||||
Just w
|
|
||||||
| strWidth s > w ->
|
|
||||||
case rightside of
|
|
||||||
True -> takeWidth (w - length ellipsis) s ++ ellipsis
|
|
||||||
False -> ellipsis ++ reverse (takeWidth (w - length ellipsis) $ reverse s)
|
|
||||||
| otherwise -> s
|
|
||||||
where
|
|
||||||
ellipsis = if ellipsify then ".." else ""
|
|
||||||
Nothing -> s
|
|
||||||
pad :: String -> String
|
|
||||||
pad s =
|
|
||||||
case mminwidth of
|
|
||||||
Just w
|
|
||||||
| sw < w ->
|
|
||||||
case rightside of
|
|
||||||
True -> s ++ replicate (w - sw) ' '
|
|
||||||
False -> replicate (w - sw) ' ' ++ s
|
|
||||||
| otherwise -> s
|
|
||||||
Nothing -> s
|
|
||||||
where sw = strWidth s
|
|
||||||
|
|
||||||
-- | A version of fitString that works on multi-line strings,
|
|
||||||
-- separate for now to avoid breakage.
|
|
||||||
-- This will rewrite any line endings to unix newlines.
|
|
||||||
fitStringMulti :: Maybe Int -> Maybe Int -> Bool -> Bool -> String -> String
|
|
||||||
fitStringMulti mminwidth mmaxwidth ellipsify rightside s =
|
|
||||||
(intercalate "\n" . map (fitString mminwidth mmaxwidth ellipsify rightside) . lines) s
|
|
||||||
|
|
||||||
-- | Left-pad a string to the specified width.
|
|
||||||
-- Treats wide characters as double width.
|
|
||||||
-- Works on multi-line strings too (but will rewrite non-unix line endings).
|
|
||||||
padLeftWide :: Int -> String -> String
|
|
||||||
padLeftWide w "" = replicate w ' '
|
|
||||||
padLeftWide w s = intercalate "\n" $ map (fitString (Just w) Nothing False False) $ lines s
|
|
||||||
-- XXX not yet replaceable by
|
|
||||||
-- padLeftWide w = fitStringMulti (Just w) Nothing False False
|
|
||||||
|
|
||||||
-- | Right-pad a string to the specified width.
|
|
||||||
-- Treats wide characters as double width.
|
|
||||||
-- Works on multi-line strings too (but will rewrite non-unix line endings).
|
|
||||||
padRightWide :: Int -> String -> String
|
|
||||||
padRightWide w "" = replicate w ' '
|
|
||||||
padRightWide w s = intercalate "\n" $ map (fitString (Just w) Nothing False True) $ lines s
|
|
||||||
-- XXX not yet replaceable by
|
|
||||||
-- padRightWide w = fitStringMulti (Just w) Nothing False True
|
|
||||||
|
|
||||||
-- | Double-width-character-aware string truncation. Take as many
|
-- | Double-width-character-aware string truncation. Take as many
|
||||||
-- characters as possible from a string without exceeding the
|
-- characters as possible from a string without exceeding the
|
||||||
-- specified width. Eg takeWidth 3 "りんご" = "り".
|
-- specified width. Eg takeWidth 3 "りんご" = "り".
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user