diohsc 0.1.8 → 0.1.9
raw patch · 17 files changed
+556/−67 lines, 17 filesdep +rset
Dependencies added: rset
Files
- ANSIColour.hs +31/−1
- BStack.hs +3/−0
- CHANGELOG.md +6/−0
- ClientCert.hs +3/−6
- Command.hs +2/−1
- GeminiProtocol.hs +4/−4
- Identity.hs +1/−1
- Makefile +1/−1
- Pager.hs +20/−23
- Request.hs +4/−6
- RunExternal.hs +10/−2
- TextGemini.hs +19/−9
- Version.hs +1/−1
- WCWidth.hs +431/−0
- diohsc.cabal +6/−4
- diohsc.hs +10/−8
- diohscrc.sample +4/−0
ANSIColour.hs view
@@ -8,6 +8,7 @@ -- You should have received a copy of the GNU General Public License -- along with this program. If not, see http://www.gnu.org/licenses/. +{-# LANGUAGE BangPatterns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE Safe #-} @@ -25,6 +26,7 @@ , withUnderlineStr , stripCSI , visibleLength+ , splitAtVisible , escapePromptCSI , sanitiseNonCSI , Colour(..)@@ -36,6 +38,7 @@ import qualified Data.Text.Lazy.IO as T import MetaString+import WCWidth data Colour = Black | Red | Green | Yellow | Blue | Magenta | Cyan | White@@ -113,7 +116,34 @@ T.dropWhile (not . endCSI) $ T.drop 2 post visibleLength :: (Integral i) => T.Text -> i-visibleLength = fromIntegral . T.length . stripCSI+visibleLength = fromIntegral . wcLength . stripCSI++wcLength :: T.Text -> Int+wcLength = sum . (max 0 . wcwidth <$>) . T.unpack++splitAtWC :: Int -> T.Text -> (T.Text,T.Text)+splitAtWC m = go m T.empty where+ go !n !acc t+ | Just (c,r) <- T.uncons t = let w = max 0 $ wcwidth c in+ if w > max 0 n then (T.reverse acc,t)+ else go (n - w) (T.cons c acc) r+ | otherwise = (T.reverse acc, T.empty)+++splitAtVisible :: (Integral i) => i -> T.Text -> (T.Text,T.Text)+splitAtVisible n t =+ let (pre,post) = T.breakOn "\ESC[" t+ n' = fromIntegral n+ (a,b) = splitAtWC n' pre+ catFst s (s',s'') = (s<>s',s'')+ in a `catFst`+ if not (T.null b) || T.null post then ("",b<>post)+ else+ let (s,r) = T.splitAt 2 post+ (s',r') = T.break endCSI r+ (s'',rest) = T.splitAt 1 r'+ csi = s <> s' <> s''+ in csi `catFst` splitAtVisible (n' - wcLength a) rest -- |sanitise non-CSI escape sequences by turning \ESC into \\ESC -- (buggy terminals make these sequences a potential security hole;
BStack.hs view
@@ -9,6 +9,9 @@ -- along with this program. If not, see http://www.gnu.org/licenses/. -- |Simple dirty bounded stack based on Data.Sequence++{-# LANGUAGE Safe #-}+ module BStack where import qualified Data.Foldable as F
CHANGELOG.md view
@@ -2,6 +2,12 @@ This file covers only non-trivial user-visible changes; see the git log for full gory details. +# 0.1.9+* Improve wrapping and paging with long words, wide chars, or thin terminals+* Shell-quote arguments to 'browse' and '!'+* Save uri with null last path segment under penultimate segment / hostname+* Sort file:// directory listings+ # 0.1.8 * Use standard PEM/DER format for identities, allowing import/export * Optionally generate Ed25519 client certificates ("TARGET id NAME ed")
ClientCert.hs view
@@ -13,8 +13,7 @@ module ClientCert where -import Control.Applicative (liftA2)-import Control.Monad (join, (<=<))+import Control.Monad ((<=<)) import Control.Monad.Trans (lift) import Control.Monad.Trans.Maybe (MaybeT (..), runMaybeT) import Crypto.Hash.Algorithms (SHA256 (..))@@ -29,10 +28,8 @@ import Data.Hourglass import Data.PEM import Data.X509-import Network.TLS (PrivKey (PrivKeyRSA)) import Safe import System.FilePath-import Time.System import qualified Crypto.PubKey.Ed25519 as Ed25519 import qualified Crypto.PubKey.RSA.PKCS15 as PKCS15@@ -125,14 +122,14 @@ KeyEd25519 -> SignatureALG_IntrinsicHash PubKeyALG_Ed25519 to = timeConvert notAfterMax from = timeConvert notBeforeMin- cert certPubKey = Certificate+ cert pubKey = Certificate { certVersion = 2 , certSerial = 0 , certSignatureAlg = sigAlg , certIssuerDN = dn , certSubjectDN = dn , certValidity = (from, to)- , certPubKey = certPubKey+ , certPubKey = pubKey , certExtensions = Extensions Nothing } in case tp of
Command.hs view
@@ -398,7 +398,8 @@ , "Note: any request this causes will be closed after receiving the header." ] "save" -> [ "TARGET {save} [PATH]: save body." , "If path is omitted or relative, it is based on {~/saves/} ."- , "The last segment of the uri path is used as a default filename." ]+ , "The default filename is the last non-empty segment of the uri path,"+ , "or the hostname if the path is empty." ] "view" -> [ "TARGET {view}: run \"run-mailcap --view\" on body." , "The action is determined by the mime-type; see the run-mailcap manpage." ] "browse" -> [ "TARGET {browse}: run command given by environment variable $BROWSER on uri."
GeminiProtocol.hs view
@@ -210,7 +210,7 @@ , clientWantSessionResume = session } (sock,context) <- do- let retryNoResume e@(HandshakeFailed (Error_Protocol (_,_,HandshakeFailure)))+ let retryNoResume (HandshakeFailed (Error_Protocol (_,_,HandshakeFailure))) | isJust session = do -- Work around a mysterious problem seen with dezhemini+libssl: displayWarning [ "Handshake failure when resuming TLS session; retrying with full handshake." ]@@ -325,10 +325,10 @@ return True else do displayInfo $ showChain signedCerts- let promptTrust def pprompt tprompt = do- p <- promptYN def pprompt+ let promptTrust df pprompt tprompt = do+ p <- promptYN df pprompt if p then return (True,True) else- (False,) <$> promptYN def tprompt+ (False,) <$> promptYN df tprompt (saveCert,trust) <- case known of Nothing -> do displayInfo [ "No certificate previously seen for " ++ serviceString ++ "." ]
Identity.hs view
@@ -12,7 +12,7 @@ module Identity where -import Control.Monad (guard, msum, when)+import Control.Monad (msum, when) import Control.Monad.IO.Class (liftIO) import Control.Monad.Trans (lift) import Control.Monad.Trans.Maybe
Makefile view
@@ -1,4 +1,4 @@-VERSION=0.1.8+VERSION=0.1.9 GHCOPTS=-threaded -DICONV -DMAGIC -ignore-package regex-compat-tdfa
Pager.hs view
@@ -34,28 +34,25 @@ printLinesPaged' :: Int -> Maybe Int -> [T.Text] -> WriterT [String] IO () printLinesPaged' _ mcol [] = when (isJust mcol) . liftIO $ putStrLn ""- printLinesPaged' n mcol (l:ls) =+ printLinesPaged' n mcol (l:ls) | n > 0 = do let physLines = (+ 1) . max 0 $ (visibleLength l - 1) `div` termWidth endCol = visibleLength l `mod` termWidth- in if n >= physLines- then do- when (isJust mcol) . liftIO $ putStrLn ""- liftIO $ T.putStr l >> hFlush stdout- printLinesPaged' (n - physLines) (Just endCol) ls- else do- let col = fromMaybe 0 mcol- liftIO . T.putStr $ T.replicate (fromIntegral $ wrapCol - col) " "- c <- liftIO . promptChar . withBoldStr $ drop (col + 4 - termWidth) " --"- liftIO $ putStrLn ""- let rest = l:ls- case toLower <$> c of- Nothing -> return ()- Just 'q' -> return ()- Just c' | c' == '\n' || c' == '\r' -> return ()- Just c' | Just m <- readMay (c':""), m > 0 -> printLinesPaged' m Nothing rest- Just 'c' -> printLinesPaged' 9999 Nothing rest- Just 'h' -> printLinesPaged' (perpage `div` 2) Nothing rest- Just c' | c' == ':' || c' == '>' ->- liftIO (promptLine "Queue command: ") >>= tell . maybeToList . join >>- printLinesPaged' 0 Nothing rest- _ -> printLinesPaged' perpage Nothing rest+ when (isJust mcol) . liftIO $ putStrLn ""+ liftIO $ T.putStr l >> hFlush stdout+ printLinesPaged' (n - physLines) (Just endCol) ls+ printLinesPaged' _ mcol ls = do+ let col = fromMaybe 0 mcol+ liftIO . T.putStr $ T.replicate (fromIntegral $ wrapCol - col) " "+ c <- liftIO . promptChar $ drop (col + 4 - termWidth) " --"+ liftIO $ putStrLn ""+ case toLower <$> c of+ Nothing -> return ()+ Just 'q' -> return ()+ Just c' | c' == '\n' || c' == '\r' -> return ()+ Just c' | Just m <- readMay (c':""), m > 0 -> printLinesPaged' m Nothing ls+ Just 'c' -> printLinesPaged' 9999 Nothing ls+ Just 'h' -> printLinesPaged' (perpage `div` 2) Nothing ls+ Just c' | c' == ':' || c' == '>' ->+ liftIO (promptLine "Queue command: ") >>= tell . maybeToList . join >>+ printLinesPaged' 0 Nothing ls+ _ -> printLinesPaged' perpage Nothing ls
Request.hs view
@@ -12,13 +12,11 @@ module Request where -import Data.List (elemIndices)-import Data.Maybe (fromMaybe)-import Safe (lastMay, readMay)-import System.FilePath (FilePath)+import Data.List (elemIndices)+import Data.Maybe (fromMaybe)+import Safe (lastMay, readMay) -import URI (URI, escapePathString, nullUri,- parseAbsoluteUri)+import URI (URI, escapePathString, nullUri, parseAbsoluteUri) data Host = Host {hostName :: String, hostPort :: Int} deriving (Eq,Ord,Show)
RunExternal.hs view
@@ -16,6 +16,7 @@ import Control.Monad (void) import Control.Monad.Catch (bracket_, finally) import Control.Monad.State (State, put, runState)+import Data.Char (isAlphaNum) import System.Environment (setEnv, unsetEnv) import System.Exit (ExitCode) import System.IO@@ -41,15 +42,22 @@ subPercentOrAppend :: String -> String -> String subPercentOrAppend sub str = let (s',subbed) = subPercent str `runState` False- in if subbed then s' else s' ++ (' ':sub)+ in if subbed then s' else s' ++ (' ':shellQuote sub) where -- |based on specification for $BROWSER in 'man 1 man' subPercent :: String -> State Bool String subPercent "" = return [] subPercent ('%':'%':s) = ('%':) <$> subPercent s subPercent ('%':'c':s) = (':':) <$> subPercent s- subPercent ('%':'s':s) = put True >> (sub ++) <$> subPercent s+ subPercent ('%':'s':s) = put True >> (shellQuote sub ++) <$> subPercent s subPercent (c:s) = (c:) <$> subPercent s+ shellQuote s+ | all shellSafe s && not (null s) = s+ | otherwise = '\'' : substAll '\'' "'\\''" s <> "'"+ shellSafe c = isAlphaNum c || c `elem` ".,_-+="+ substAll c r s+ | (s',_:t) <- break (== c) s = s' <> r <> substAll c r t+ | otherwise = s confirmShell :: String -> String -> IO Bool confirmShell desc cmd = promptYN True False $
TextGemini.hs view
@@ -66,9 +66,9 @@ printGemDoc :: GemRenderOpts -> (URIRef -> T.Text) -> GeminiDocument -> [T.Text] printGemDoc (GemRenderOpts ansi preOpt width linkDescFirst)- showUri (GeminiDocument ls) = concatMap printLine ls+ showUri (GeminiDocument doc) = concatMap printLine doc where- printLine (TextLine line) = wrap width line+ printLine (TextLine line) = wrapWith "" False line printLine (AltTextLine line) | preOpt == PreOptPre || T.null line = [] | otherwise = (:[]) $ applyIf ansi withBoldStr "`` " <> line@@ -96,23 +96,33 @@ (showUri uri) wrapWith :: T.Text -> Bool -> T.Text -> [T.Text]- wrapWith pre all line =- zipWith (<>) lineHeaders $ wrap (width - n) line+ wrapWith pre onAll line =+ concat . zipWith prependHeader lineHeaders $ wrap (width - n) line where n = visibleLength pre lineHeaders = (pre:) . repeat $- if all then pre else T.replicate (fromIntegral n) " "+ if onAll then pre else T.replicate (fromIntegral n) " "+ splitWordHeader = if n > 0 then "|" <> T.replicate (fromIntegral n - 1) " " else ""+ prependHeader header (l:ls) = header <> l : ((splitWordHeader <>) <$> ls)+ prependHeader _ [] = [] - wrap :: Int -> T.Text -> [T.Text]+ wrap :: Int -> T.Text -> [[T.Text]] wrap wrapWidth line = wrap' "" 0 $ T.words line where- wrap' l _ [] = [l]+ maxWCWidth = 2+ ww = max maxWCWidth wrapWidth+ wrap' l n ws | n > ww =+ chunkVisible l : wrap' "" 0 ws+ where+ chunkVisible s | T.null s = []+ chunkVisible s = let (a,b) = splitAtVisible ww s in a : chunkVisible b+ wrap' l _ [] = [[l]] wrap' l n (w:ws) = let l' = if T.null l then w else l <> " " <> w nw = visibleLength w n' = n + nw + (if T.null l then 0 else 1)- in if n' > wrapWidth- then (if T.null l then id else (l:)) $ wrap' w nw ws+ in if n' > ww+ then (if T.null l then id else ([l]:)) $ wrap' w nw ws else wrap' l' n' ws
Version.hs view
@@ -16,4 +16,4 @@ programName = "diohsc" version :: String-version = "0.1.8"+version = "0.1.9"
+ WCWidth.hs view
@@ -0,0 +1,431 @@+-- Adapted from a pure haskell port of wcwidth by agentm, released under the+-- "Unlicense" licence, taken from:+-- https://raw.githubusercontent.com/agentm/project-m36/master/src/lib/ProjectM36/WCWidth.hs++{-# LANGUAGE Safe #-}++module WCWidth (wcwidth) where+import Data.Char+import Data.Set.Range++wIDEEASTASIAN :: RangeSet Int+wIDEEASTASIAN = foldr insertRange empty [+ (0x1100, 0x115f), -- Hangul Choseong Kiyeok ..Hangul Choseong Filler+ (0x231a, 0x231b), -- Watch ..Hourglass+ (0x2329, 0x232a), -- Left-pointing Angle Brac..Right-pointing Angle Bra+ (0x23e9, 0x23ec), -- Black Right-pointing Dou..Black Down-pointing Doub+ (0x23f0, 0x23f0), -- Alarm Clock ..Alarm Clock+ (0x23f3, 0x23f3), -- Hourglass With Flowing S..Hourglass With Flowing S+ (0x25fd, 0x25fe), -- White Medium Small Squar..Black Medium Small Squar+ (0x2614, 0x2615), -- Umbrella With Rain Drops..Hot Beverage+ (0x2648, 0x2653), -- Aries ..Pisces+ (0x267f, 0x267f), -- Wheelchair Symbol ..Wheelchair Symbol+ (0x2693, 0x2693), -- Anchor ..Anchor+ (0x26a1, 0x26a1), -- High Voltage Sign ..High Voltage Sign+ (0x26aa, 0x26ab), -- Medium White Circle ..Medium Black Circle+ (0x26bd, 0x26be), -- Soccer Ball ..Baseball+ (0x26c4, 0x26c5), -- Snowman Without Snow ..Sun Behind Cloud+ (0x26ce, 0x26ce), -- Ophiuchus ..Ophiuchus+ (0x26d4, 0x26d4), -- No Entry ..No Entry+ (0x26ea, 0x26ea), -- Church ..Church+ (0x26f2, 0x26f3), -- Fountain ..Flag In Hole+ (0x26f5, 0x26f5), -- Sailboat ..Sailboat+ (0x26fa, 0x26fa), -- Tent ..Tent+ (0x26fd, 0x26fd), -- Fuel Pump ..Fuel Pump+ (0x2705, 0x2705), -- White Heavy Check Mark ..White Heavy Check Mark+ (0x270a, 0x270b), -- Raised Fist ..Raised Hand+ (0x2728, 0x2728), -- Sparkles ..Sparkles+ (0x274c, 0x274c), -- Cross Mark ..Cross Mark+ (0x274e, 0x274e), -- Negative Squared Cross M..Negative Squared Cross M+ (0x2753, 0x2755), -- Black Question Mark Orna..White Exclamation Mark O+ (0x2757, 0x2757), -- Heavy Exclamation Mark S..Heavy Exclamation Mark S+ (0x2795, 0x2797), -- Heavy Plus Sign ..Heavy Division Sign+ (0x27b0, 0x27b0), -- Curly Loop ..Curly Loop+ (0x27bf, 0x27bf), -- Double Curly Loop ..Double Curly Loop+ (0x2b1b, 0x2b1c), -- Black Large Square ..White Large Square+ (0x2b50, 0x2b50), -- White Medium Star ..White Medium Star+ (0x2b55, 0x2b55), -- Heavy Large Circle ..Heavy Large Circle+ (0x2e80, 0x2e99), -- Cjk Radical Repeat ..Cjk Radical Rap+ (0x2e9b, 0x2ef3), -- Cjk Radical Choke ..Cjk Radical C-simplified+ (0x2f00, 0x2fd5), -- Kangxi Radical One ..Kangxi Radical Flute+ (0x2ff0, 0x2ffb), -- Ideographic Description ..Ideographic Description+ (0x3000, 0x303e), -- Ideographic Space ..Ideographic Variation In+ (0x3041, 0x3096), -- Hiragana Letter Small A ..Hiragana Letter Small Ke+ (0x3099, 0x30ff), -- Combining Katakana-hirag..Katakana Digraph Koto+ (0x3105, 0x312d), -- Bopomofo Letter B ..Bopomofo Letter Ih+ (0x3131, 0x318e), -- Hangul Letter Kiyeok ..Hangul Letter Araeae+ (0x3190, 0x31ba), -- Ideographic Annotation L..Bopomofo Letter Zy+ (0x31c0, 0x31e3), -- Cjk Stroke T ..Cjk Stroke Q+ (0x31f0, 0x321e), -- Katakana Letter Small Ku..Parenthesized Korean Cha+ (0x3220, 0x3247), -- Parenthesized Ideograph ..Circled Ideograph Koto+ (0x3250, 0x32fe), -- Partnership Sign ..Circled Katakana Wo+ (0x3300, 0x4dbf), -- Square Apaato ..+ (0x4e00, 0xa48c), -- Cjk Unified Ideograph-4e..Yi Syllable Yyr+ (0xa490, 0xa4c6), -- Yi Radical Qot ..Yi Radical Ke+ (0xa960, 0xa97c), -- Hangul Choseong Tikeut-m..Hangul Choseong Ssangyeo+ (0xac00, 0xd7a3), -- Hangul Syllable Ga ..Hangul Syllable Hih+ (0xf900, 0xfaff), -- Cjk Compatibility Ideogr..+ (0xfe10, 0xfe19), -- Presentation Form For Ve..Presentation Form For Ve+ (0xfe30, 0xfe52), -- Presentation Form For Ve..Small Full Stop+ (0xfe54, 0xfe66), -- Small Semicolon ..Small Equals Sign+ (0xfe68, 0xfe6b), -- Small Reverse Solidus ..Small Commercial At+ (0xff01, 0xff60), -- Fullwidth Exclamation Ma..Fullwidth Right White Pa+ (0xffe0, 0xffe6), -- Fullwidth Cent Sign ..Fullwidth Won Sign+ (0x16fe0, 0x16fe0), -- (nil) ..+ (0x17000, 0x187ec), -- (nil) ..+ (0x18800, 0x18af2), -- (nil) ..+ (0x1b000, 0x1b001), -- Katakana Letter Archaic ..Hiragana Letter Archaic+ (0x1f004, 0x1f004), -- Mahjong Tile Red Dragon ..Mahjong Tile Red Dragon+ (0x1f0cf, 0x1f0cf), -- Playing Card Black Joker..Playing Card Black Joker+ (0x1f18e, 0x1f18e), -- Negative Squared Ab ..Negative Squared Ab+ (0x1f191, 0x1f19a), -- Squared Cl ..Squared Vs+ (0x1f200, 0x1f202), -- Square Hiragana Hoka ..Squared Katakana Sa+ (0x1f210, 0x1f23b), -- Squared Cjk Unified Ideo..+ (0x1f240, 0x1f248), -- Tortoise Shell Bracketed..Tortoise Shell Bracketed+ (0x1f250, 0x1f251), -- Circled Ideograph Advant..Circled Ideograph Accept+ (0x1f300, 0x1f320), -- Cyclone ..Shooting Star+ (0x1f32d, 0x1f335), -- Hot Dog ..Cactus+ (0x1f337, 0x1f37c), -- Tulip ..Baby Bottle+ (0x1f37e, 0x1f393), -- Bottle With Popping Cork..Graduation Cap+ (0x1f3a0, 0x1f3ca), -- Carousel Horse ..Swimmer+ (0x1f3cf, 0x1f3d3), -- Cricket Bat And Ball ..Table Tennis Paddle And+ (0x1f3e0, 0x1f3f0), -- House Building ..European Castle+ (0x1f3f4, 0x1f3f4), -- Waving Black Flag ..Waving Black Flag+ (0x1f3f8, 0x1f43e), -- Badminton Racquet And Sh..Paw Prints+ (0x1f440, 0x1f440), -- Eyes ..Eyes+ (0x1f442, 0x1f4fc), -- Ear ..Videocassette+ (0x1f4ff, 0x1f53d), -- Prayer Beads ..Down-pointing Small Red+ (0x1f54b, 0x1f54e), -- Kaaba ..Menorah With Nine Branch+ (0x1f550, 0x1f567), -- Clock Face One Oclock ..Clock Face Twelve-thirty+ (0x1f57a, 0x1f57a), -- (nil) ..+ (0x1f595, 0x1f596), -- Reversed Hand With Middl..Raised Hand With Part Be+ (0x1f5a4, 0x1f5a4), -- (nil) ..+ (0x1f5fb, 0x1f64f), -- Mount Fuji ..Person With Folded Hands+ (0x1f680, 0x1f6c5), -- Rocket ..Left Luggage+ (0x1f6cc, 0x1f6cc), -- Sleeping Accommodation ..Sleeping Accommodation+ (0x1f6d0, 0x1f6d2), -- Place Of Worship ..+ (0x1f6eb, 0x1f6ec), -- Airplane Departure ..Airplane Arriving+ (0x1f6f4, 0x1f6f6), -- (nil) ..+ (0x1f910, 0x1f91e), -- Zipper-mouth Face ..+ (0x1f920, 0x1f927), -- (nil) ..+ (0x1f930, 0x1f930), -- (nil) ..+ (0x1f933, 0x1f93e), -- (nil) ..+ (0x1f940, 0x1f94b), -- (nil) ..+ (0x1f950, 0x1f95e), -- (nil) ..+ (0x1f980, 0x1f991), -- Crab ..+ (0x1f9c0, 0x1f9c0), -- Cheese Wedge ..Cheese Wedge+ (0x20000, 0x2fffd), -- Cjk Unified Ideograph-20..+ (0x30000, 0x3fffd) -- (nil) ..+ ]++zEROWIDTH :: RangeSet Int+zEROWIDTH = foldr insertRange empty [+ (0x0300, 0x036f), -- Combining Grave Accent ..Combining Latin Small Le+ (0x0483, 0x0489), -- Combining Cyrillic Titlo..Combining Cyrillic Milli+ (0x0591, 0x05bd), -- Hebrew Accent Etnahta ..Hebrew Point Meteg+ (0x05bf, 0x05bf), -- Hebrew Point Rafe ..Hebrew Point Rafe+ (0x05c1, 0x05c2), -- Hebrew Point Shin Dot ..Hebrew Point Sin Dot+ (0x05c4, 0x05c5), -- Hebrew Mark Upper Dot ..Hebrew Mark Lower Dot+ (0x05c7, 0x05c7), -- Hebrew Point Qamats Qata..Hebrew Point Qamats Qata+ (0x0610, 0x061a), -- Arabic Sign Sallallahou ..Arabic Small Kasra+ (0x064b, 0x065f), -- Arabic Fathatan ..Arabic Wavy Hamza Below+ (0x0670, 0x0670), -- Arabic Letter Superscrip..Arabic Letter Superscrip+ (0x06d6, 0x06dc), -- Arabic Small High Ligatu..Arabic Small High Seen+ (0x06df, 0x06e4), -- Arabic Small High Rounde..Arabic Small High Madda+ (0x06e7, 0x06e8), -- Arabic Small High Yeh ..Arabic Small High Noon+ (0x06ea, 0x06ed), -- Arabic Empty Centre Low ..Arabic Small Low Meem+ (0x0711, 0x0711), -- Syriac Letter Superscrip..Syriac Letter Superscrip+ (0x0730, 0x074a), -- Syriac Pthaha Above ..Syriac Barrekh+ (0x07a6, 0x07b0), -- Thaana Abafili ..Thaana Sukun+ (0x07eb, 0x07f3), -- Nko Combining Short High..Nko Combining Double Dot+ (0x0816, 0x0819), -- Samaritan Mark In ..Samaritan Mark Dagesh+ (0x081b, 0x0823), -- Samaritan Mark Epentheti..Samaritan Vowel Sign A+ (0x0825, 0x0827), -- Samaritan Vowel Sign Sho..Samaritan Vowel Sign U+ (0x0829, 0x082d), -- Samaritan Vowel Sign Lon..Samaritan Mark Nequdaa+ (0x0859, 0x085b), -- Mandaic Affrication Mark..Mandaic Gemination Mark+ (0x08d4, 0x08e1), -- (nil) ..+ (0x08e3, 0x0902), -- Arabic Turned Damma Belo..Devanagari Sign Anusvara+ (0x093a, 0x093a), -- Devanagari Vowel Sign Oe..Devanagari Vowel Sign Oe+ (0x093c, 0x093c), -- Devanagari Sign Nukta ..Devanagari Sign Nukta+ (0x0941, 0x0948), -- Devanagari Vowel Sign U ..Devanagari Vowel Sign Ai+ (0x094d, 0x094d), -- Devanagari Sign Virama ..Devanagari Sign Virama+ (0x0951, 0x0957), -- Devanagari Stress Sign U..Devanagari Vowel Sign Uu+ (0x0962, 0x0963), -- Devanagari Vowel Sign Vo..Devanagari Vowel Sign Vo+ (0x0981, 0x0981), -- Bengali Sign Candrabindu..Bengali Sign Candrabindu+ (0x09bc, 0x09bc), -- Bengali Sign Nukta ..Bengali Sign Nukta+ (0x09c1, 0x09c4), -- Bengali Vowel Sign U ..Bengali Vowel Sign Vocal+ (0x09cd, 0x09cd), -- Bengali Sign Virama ..Bengali Sign Virama+ (0x09e2, 0x09e3), -- Bengali Vowel Sign Vocal..Bengali Vowel Sign Vocal+ (0x0a01, 0x0a02), -- Gurmukhi Sign Adak Bindi..Gurmukhi Sign Bindi+ (0x0a3c, 0x0a3c), -- Gurmukhi Sign Nukta ..Gurmukhi Sign Nukta+ (0x0a41, 0x0a42), -- Gurmukhi Vowel Sign U ..Gurmukhi Vowel Sign Uu+ (0x0a47, 0x0a48), -- Gurmukhi Vowel Sign Ee ..Gurmukhi Vowel Sign Ai+ (0x0a4b, 0x0a4d), -- Gurmukhi Vowel Sign Oo ..Gurmukhi Sign Virama+ (0x0a51, 0x0a51), -- Gurmukhi Sign Udaat ..Gurmukhi Sign Udaat+ (0x0a70, 0x0a71), -- Gurmukhi Tippi ..Gurmukhi Addak+ (0x0a75, 0x0a75), -- Gurmukhi Sign Yakash ..Gurmukhi Sign Yakash+ (0x0a81, 0x0a82), -- Gujarati Sign Candrabind..Gujarati Sign Anusvara+ (0x0abc, 0x0abc), -- Gujarati Sign Nukta ..Gujarati Sign Nukta+ (0x0ac1, 0x0ac5), -- Gujarati Vowel Sign U ..Gujarati Vowel Sign Cand+ (0x0ac7, 0x0ac8), -- Gujarati Vowel Sign E ..Gujarati Vowel Sign Ai+ (0x0acd, 0x0acd), -- Gujarati Sign Virama ..Gujarati Sign Virama+ (0x0ae2, 0x0ae3), -- Gujarati Vowel Sign Voca..Gujarati Vowel Sign Voca+ (0x0b01, 0x0b01), -- Oriya Sign Candrabindu ..Oriya Sign Candrabindu+ (0x0b3c, 0x0b3c), -- Oriya Sign Nukta ..Oriya Sign Nukta+ (0x0b3f, 0x0b3f), -- Oriya Vowel Sign I ..Oriya Vowel Sign I+ (0x0b41, 0x0b44), -- Oriya Vowel Sign U ..Oriya Vowel Sign Vocalic+ (0x0b4d, 0x0b4d), -- Oriya Sign Virama ..Oriya Sign Virama+ (0x0b56, 0x0b56), -- Oriya Ai Length Mark ..Oriya Ai Length Mark+ (0x0b62, 0x0b63), -- Oriya Vowel Sign Vocalic..Oriya Vowel Sign Vocalic+ (0x0b82, 0x0b82), -- Tamil Sign Anusvara ..Tamil Sign Anusvara+ (0x0bc0, 0x0bc0), -- Tamil Vowel Sign Ii ..Tamil Vowel Sign Ii+ (0x0bcd, 0x0bcd), -- Tamil Sign Virama ..Tamil Sign Virama+ (0x0c00, 0x0c00), -- Telugu Sign Combining Ca..Telugu Sign Combining Ca+ (0x0c3e, 0x0c40), -- Telugu Vowel Sign Aa ..Telugu Vowel Sign Ii+ (0x0c46, 0x0c48), -- Telugu Vowel Sign E ..Telugu Vowel Sign Ai+ (0x0c4a, 0x0c4d), -- Telugu Vowel Sign O ..Telugu Sign Virama+ (0x0c55, 0x0c56), -- Telugu Length Mark ..Telugu Ai Length Mark+ (0x0c62, 0x0c63), -- Telugu Vowel Sign Vocali..Telugu Vowel Sign Vocali+ (0x0c81, 0x0c81), -- Kannada Sign Candrabindu..Kannada Sign Candrabindu+ (0x0cbc, 0x0cbc), -- Kannada Sign Nukta ..Kannada Sign Nukta+ (0x0cbf, 0x0cbf), -- Kannada Vowel Sign I ..Kannada Vowel Sign I+ (0x0cc6, 0x0cc6), -- Kannada Vowel Sign E ..Kannada Vowel Sign E+ (0x0ccc, 0x0ccd), -- Kannada Vowel Sign Au ..Kannada Sign Virama+ (0x0ce2, 0x0ce3), -- Kannada Vowel Sign Vocal..Kannada Vowel Sign Vocal+ (0x0d01, 0x0d01), -- Malayalam Sign Candrabin..Malayalam Sign Candrabin+ (0x0d41, 0x0d44), -- Malayalam Vowel Sign U ..Malayalam Vowel Sign Voc+ (0x0d4d, 0x0d4d), -- Malayalam Sign Virama ..Malayalam Sign Virama+ (0x0d62, 0x0d63), -- Malayalam Vowel Sign Voc..Malayalam Vowel Sign Voc+ (0x0dca, 0x0dca), -- Sinhala Sign Al-lakuna ..Sinhala Sign Al-lakuna+ (0x0dd2, 0x0dd4), -- Sinhala Vowel Sign Ketti..Sinhala Vowel Sign Ketti+ (0x0dd6, 0x0dd6), -- Sinhala Vowel Sign Diga ..Sinhala Vowel Sign Diga+ (0x0e31, 0x0e31), -- Thai Character Mai Han-a..Thai Character Mai Han-a+ (0x0e34, 0x0e3a), -- Thai Character Sara I ..Thai Character Phinthu+ (0x0e47, 0x0e4e), -- Thai Character Maitaikhu..Thai Character Yamakkan+ (0x0eb1, 0x0eb1), -- Lao Vowel Sign Mai Kan ..Lao Vowel Sign Mai Kan+ (0x0eb4, 0x0eb9), -- Lao Vowel Sign I ..Lao Vowel Sign Uu+ (0x0ebb, 0x0ebc), -- Lao Vowel Sign Mai Kon ..Lao Semivowel Sign Lo+ (0x0ec8, 0x0ecd), -- Lao Tone Mai Ek ..Lao Niggahita+ (0x0f18, 0x0f19), -- Tibetan Astrological Sig..Tibetan Astrological Sig+ (0x0f35, 0x0f35), -- Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung+ (0x0f37, 0x0f37), -- Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung+ (0x0f39, 0x0f39), -- Tibetan Mark Tsa -phru ..Tibetan Mark Tsa -phru+ (0x0f71, 0x0f7e), -- Tibetan Vowel Sign Aa ..Tibetan Sign Rjes Su Nga+ (0x0f80, 0x0f84), -- Tibetan Vowel Sign Rever..Tibetan Mark Halanta+ (0x0f86, 0x0f87), -- Tibetan Sign Lci Rtags ..Tibetan Sign Yang Rtags+ (0x0f8d, 0x0f97), -- Tibetan Subjoined Sign L..Tibetan Subjoined Letter+ (0x0f99, 0x0fbc), -- Tibetan Subjoined Letter..Tibetan Subjoined Letter+ (0x0fc6, 0x0fc6), -- Tibetan Symbol Padma Gda..Tibetan Symbol Padma Gda+ (0x102d, 0x1030), -- Myanmar Vowel Sign I ..Myanmar Vowel Sign Uu+ (0x1032, 0x1037), -- Myanmar Vowel Sign Ai ..Myanmar Sign Dot Below+ (0x1039, 0x103a), -- Myanmar Sign Virama ..Myanmar Sign Asat+ (0x103d, 0x103e), -- Myanmar Consonant Sign M..Myanmar Consonant Sign M+ (0x1058, 0x1059), -- Myanmar Vowel Sign Vocal..Myanmar Vowel Sign Vocal+ (0x105e, 0x1060), -- Myanmar Consonant Sign M..Myanmar Consonant Sign M+ (0x1071, 0x1074), -- Myanmar Vowel Sign Geba ..Myanmar Vowel Sign Kayah+ (0x1082, 0x1082), -- Myanmar Consonant Sign S..Myanmar Consonant Sign S+ (0x1085, 0x1086), -- Myanmar Vowel Sign Shan ..Myanmar Vowel Sign Shan+ (0x108d, 0x108d), -- Myanmar Sign Shan Counci..Myanmar Sign Shan Counci+ (0x109d, 0x109d), -- Myanmar Vowel Sign Aiton..Myanmar Vowel Sign Aiton+ (0x135d, 0x135f), -- Ethiopic Combining Gemin..Ethiopic Combining Gemin+ (0x1712, 0x1714), -- Tagalog Vowel Sign I ..Tagalog Sign Virama+ (0x1732, 0x1734), -- Hanunoo Vowel Sign I ..Hanunoo Sign Pamudpod+ (0x1752, 0x1753), -- Buhid Vowel Sign I ..Buhid Vowel Sign U+ (0x1772, 0x1773), -- Tagbanwa Vowel Sign I ..Tagbanwa Vowel Sign U+ (0x17b4, 0x17b5), -- Khmer Vowel Inherent Aq ..Khmer Vowel Inherent Aa+ (0x17b7, 0x17bd), -- Khmer Vowel Sign I ..Khmer Vowel Sign Ua+ (0x17c6, 0x17c6), -- Khmer Sign Nikahit ..Khmer Sign Nikahit+ (0x17c9, 0x17d3), -- Khmer Sign Muusikatoan ..Khmer Sign Bathamasat+ (0x17dd, 0x17dd), -- Khmer Sign Atthacan ..Khmer Sign Atthacan+ (0x180b, 0x180d), -- Mongolian Free Variation..Mongolian Free Variation+ (0x1885, 0x1886), -- Mongolian Letter Ali Gal..Mongolian Letter Ali Gal+ (0x18a9, 0x18a9), -- Mongolian Letter Ali Gal..Mongolian Letter Ali Gal+ (0x1920, 0x1922), -- Limbu Vowel Sign A ..Limbu Vowel Sign U+ (0x1927, 0x1928), -- Limbu Vowel Sign E ..Limbu Vowel Sign O+ (0x1932, 0x1932), -- Limbu Small Letter Anusv..Limbu Small Letter Anusv+ (0x1939, 0x193b), -- Limbu Sign Mukphreng ..Limbu Sign Sa-i+ (0x1a17, 0x1a18), -- Buginese Vowel Sign I ..Buginese Vowel Sign U+ (0x1a1b, 0x1a1b), -- Buginese Vowel Sign Ae ..Buginese Vowel Sign Ae+ (0x1a56, 0x1a56), -- Tai Tham Consonant Sign ..Tai Tham Consonant Sign+ (0x1a58, 0x1a5e), -- Tai Tham Sign Mai Kang L..Tai Tham Consonant Sign+ (0x1a60, 0x1a60), -- Tai Tham Sign Sakot ..Tai Tham Sign Sakot+ (0x1a62, 0x1a62), -- Tai Tham Vowel Sign Mai ..Tai Tham Vowel Sign Mai+ (0x1a65, 0x1a6c), -- Tai Tham Vowel Sign I ..Tai Tham Vowel Sign Oa B+ (0x1a73, 0x1a7c), -- Tai Tham Vowel Sign Oa A..Tai Tham Sign Khuen-lue+ (0x1a7f, 0x1a7f), -- Tai Tham Combining Crypt..Tai Tham Combining Crypt+ (0x1ab0, 0x1abe), -- Combining Doubled Circum..Combining Parentheses Ov+ (0x1b00, 0x1b03), -- Balinese Sign Ulu Ricem ..Balinese Sign Surang+ (0x1b34, 0x1b34), -- Balinese Sign Rerekan ..Balinese Sign Rerekan+ (0x1b36, 0x1b3a), -- Balinese Vowel Sign Ulu ..Balinese Vowel Sign Ra R+ (0x1b3c, 0x1b3c), -- Balinese Vowel Sign La L..Balinese Vowel Sign La L+ (0x1b42, 0x1b42), -- Balinese Vowel Sign Pepe..Balinese Vowel Sign Pepe+ (0x1b6b, 0x1b73), -- Balinese Musical Symbol ..Balinese Musical Symbol+ (0x1b80, 0x1b81), -- Sundanese Sign Panyecek ..Sundanese Sign Panglayar+ (0x1ba2, 0x1ba5), -- Sundanese Consonant Sign..Sundanese Vowel Sign Pan+ (0x1ba8, 0x1ba9), -- Sundanese Vowel Sign Pam..Sundanese Vowel Sign Pan+ (0x1bab, 0x1bad), -- Sundanese Sign Virama ..Sundanese Consonant Sign+ (0x1be6, 0x1be6), -- Batak Sign Tompi ..Batak Sign Tompi+ (0x1be8, 0x1be9), -- Batak Vowel Sign Pakpak ..Batak Vowel Sign Ee+ (0x1bed, 0x1bed), -- Batak Vowel Sign Karo O ..Batak Vowel Sign Karo O+ (0x1bef, 0x1bf1), -- Batak Vowel Sign U For S..Batak Consonant Sign H+ (0x1c2c, 0x1c33), -- Lepcha Vowel Sign E ..Lepcha Consonant Sign T+ (0x1c36, 0x1c37), -- Lepcha Sign Ran ..Lepcha Sign Nukta+ (0x1cd0, 0x1cd2), -- Vedic Tone Karshana ..Vedic Tone Prenkha+ (0x1cd4, 0x1ce0), -- Vedic Sign Yajurvedic Mi..Vedic Tone Rigvedic Kash+ (0x1ce2, 0x1ce8), -- Vedic Sign Visarga Svari..Vedic Sign Visarga Anuda+ (0x1ced, 0x1ced), -- Vedic Sign Tiryak ..Vedic Sign Tiryak+ (0x1cf4, 0x1cf4), -- Vedic Tone Candra Above ..Vedic Tone Candra Above+ (0x1cf8, 0x1cf9), -- Vedic Tone Ring Above ..Vedic Tone Double Ring A+ (0x1dc0, 0x1df5), -- Combining Dotted Grave A..Combining Up Tack Above+ (0x1dfb, 0x1dff), -- (nil) ..Combining Right Arrowhea+ (0x20d0, 0x20f0), -- Combining Left Harpoon A..Combining Asterisk Above+ (0x2cef, 0x2cf1), -- Coptic Combining Ni Abov..Coptic Combining Spiritu+ (0x2d7f, 0x2d7f), -- Tifinagh Consonant Joine..Tifinagh Consonant Joine+ (0x2de0, 0x2dff), -- Combining Cyrillic Lette..Combining Cyrillic Lette+ (0x302a, 0x302d), -- Ideographic Level Tone M..Ideographic Entering Ton+ (0x3099, 0x309a), -- Combining Katakana-hirag..Combining Katakana-hirag+ (0xa66f, 0xa672), -- Combining Cyrillic Vzmet..Combining Cyrillic Thous+ (0xa674, 0xa67d), -- Combining Cyrillic Lette..Combining Cyrillic Payer+ (0xa69e, 0xa69f), -- Combining Cyrillic Lette..Combining Cyrillic Lette+ (0xa6f0, 0xa6f1), -- Bamum Combining Mark Koq..Bamum Combining Mark Tuk+ (0xa802, 0xa802), -- Syloti Nagri Sign Dvisva..Syloti Nagri Sign Dvisva+ (0xa806, 0xa806), -- Syloti Nagri Sign Hasant..Syloti Nagri Sign Hasant+ (0xa80b, 0xa80b), -- Syloti Nagri Sign Anusva..Syloti Nagri Sign Anusva+ (0xa825, 0xa826), -- Syloti Nagri Vowel Sign ..Syloti Nagri Vowel Sign+ (0xa8c4, 0xa8c5), -- Saurashtra Sign Virama ..+ (0xa8e0, 0xa8f1), -- Combining Devanagari Dig..Combining Devanagari Sig+ (0xa926, 0xa92d), -- Kayah Li Vowel Ue ..Kayah Li Tone Calya Plop+ (0xa947, 0xa951), -- Rejang Vowel Sign I ..Rejang Consonant Sign R+ (0xa980, 0xa982), -- Javanese Sign Panyangga ..Javanese Sign Layar+ (0xa9b3, 0xa9b3), -- Javanese Sign Cecak Telu..Javanese Sign Cecak Telu+ (0xa9b6, 0xa9b9), -- Javanese Vowel Sign Wulu..Javanese Vowel Sign Suku+ (0xa9bc, 0xa9bc), -- Javanese Vowel Sign Pepe..Javanese Vowel Sign Pepe+ (0xa9e5, 0xa9e5), -- Myanmar Sign Shan Saw ..Myanmar Sign Shan Saw+ (0xaa29, 0xaa2e), -- Cham Vowel Sign Aa ..Cham Vowel Sign Oe+ (0xaa31, 0xaa32), -- Cham Vowel Sign Au ..Cham Vowel Sign Ue+ (0xaa35, 0xaa36), -- Cham Consonant Sign La ..Cham Consonant Sign Wa+ (0xaa43, 0xaa43), -- Cham Consonant Sign Fina..Cham Consonant Sign Fina+ (0xaa4c, 0xaa4c), -- Cham Consonant Sign Fina..Cham Consonant Sign Fina+ (0xaa7c, 0xaa7c), -- Myanmar Sign Tai Laing T..Myanmar Sign Tai Laing T+ (0xaab0, 0xaab0), -- Tai Viet Mai Kang ..Tai Viet Mai Kang+ (0xaab2, 0xaab4), -- Tai Viet Vowel I ..Tai Viet Vowel U+ (0xaab7, 0xaab8), -- Tai Viet Mai Khit ..Tai Viet Vowel Ia+ (0xaabe, 0xaabf), -- Tai Viet Vowel Am ..Tai Viet Tone Mai Ek+ (0xaac1, 0xaac1), -- Tai Viet Tone Mai Tho ..Tai Viet Tone Mai Tho+ (0xaaec, 0xaaed), -- Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign+ (0xaaf6, 0xaaf6), -- Meetei Mayek Virama ..Meetei Mayek Virama+ (0xabe5, 0xabe5), -- Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign+ (0xabe8, 0xabe8), -- Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign+ (0xabed, 0xabed), -- Meetei Mayek Apun Iyek ..Meetei Mayek Apun Iyek+ (0xfb1e, 0xfb1e), -- Hebrew Point Judeo-spani..Hebrew Point Judeo-spani+ (0xfe00, 0xfe0f), -- Variation Selector-1 ..Variation Selector-16+ (0xfe20, 0xfe2f), -- Combining Ligature Left ..Combining Cyrillic Titlo+ (0x101fd, 0x101fd), -- Phaistos Disc Sign Combi..Phaistos Disc Sign Combi+ (0x102e0, 0x102e0), -- Coptic Epact Thousands M..Coptic Epact Thousands M+ (0x10376, 0x1037a), -- Combining Old Permic Let..Combining Old Permic Let+ (0x10a01, 0x10a03), -- Kharoshthi Vowel Sign I ..Kharoshthi Vowel Sign Vo+ (0x10a05, 0x10a06), -- Kharoshthi Vowel Sign E ..Kharoshthi Vowel Sign O+ (0x10a0c, 0x10a0f), -- Kharoshthi Vowel Length ..Kharoshthi Sign Visarga+ (0x10a38, 0x10a3a), -- Kharoshthi Sign Bar Abov..Kharoshthi Sign Dot Belo+ (0x10a3f, 0x10a3f), -- Kharoshthi Virama ..Kharoshthi Virama+ (0x10ae5, 0x10ae6), -- Manichaean Abbreviation ..Manichaean Abbreviation+ (0x11001, 0x11001), -- Brahmi Sign Anusvara ..Brahmi Sign Anusvara+ (0x11038, 0x11046), -- Brahmi Vowel Sign Aa ..Brahmi Virama+ (0x1107f, 0x11081), -- Brahmi Number Joiner ..Kaithi Sign Anusvara+ (0x110b3, 0x110b6), -- Kaithi Vowel Sign U ..Kaithi Vowel Sign Ai+ (0x110b9, 0x110ba), -- Kaithi Sign Virama ..Kaithi Sign Nukta+ (0x11100, 0x11102), -- Chakma Sign Candrabindu ..Chakma Sign Visarga+ (0x11127, 0x1112b), -- Chakma Vowel Sign A ..Chakma Vowel Sign Uu+ (0x1112d, 0x11134), -- Chakma Vowel Sign Ai ..Chakma Maayyaa+ (0x11173, 0x11173), -- Mahajani Sign Nukta ..Mahajani Sign Nukta+ (0x11180, 0x11181), -- Sharada Sign Candrabindu..Sharada Sign Anusvara+ (0x111b6, 0x111be), -- Sharada Vowel Sign U ..Sharada Vowel Sign O+ (0x111ca, 0x111cc), -- Sharada Sign Nukta ..Sharada Extra Short Vowe+ (0x1122f, 0x11231), -- Khojki Vowel Sign U ..Khojki Vowel Sign Ai+ (0x11234, 0x11234), -- Khojki Sign Anusvara ..Khojki Sign Anusvara+ (0x11236, 0x11237), -- Khojki Sign Nukta ..Khojki Sign Shadda+ (0x1123e, 0x1123e), -- (nil) ..+ (0x112df, 0x112df), -- Khudawadi Sign Anusvara ..Khudawadi Sign Anusvara+ (0x112e3, 0x112ea), -- Khudawadi Vowel Sign U ..Khudawadi Sign Virama+ (0x11300, 0x11301), -- Grantha Sign Combining A..Grantha Sign Candrabindu+ (0x1133c, 0x1133c), -- Grantha Sign Nukta ..Grantha Sign Nukta+ (0x11340, 0x11340), -- Grantha Vowel Sign Ii ..Grantha Vowel Sign Ii+ (0x11366, 0x1136c), -- Combining Grantha Digit ..Combining Grantha Digit+ (0x11370, 0x11374), -- Combining Grantha Letter..Combining Grantha Letter+ (0x11438, 0x1143f), -- (nil) ..+ (0x11442, 0x11444), -- (nil) ..+ (0x11446, 0x11446), -- (nil) ..+ (0x114b3, 0x114b8), -- Tirhuta Vowel Sign U ..Tirhuta Vowel Sign Vocal+ (0x114ba, 0x114ba), -- Tirhuta Vowel Sign Short..Tirhuta Vowel Sign Short+ (0x114bf, 0x114c0), -- Tirhuta Sign Candrabindu..Tirhuta Sign Anusvara+ (0x114c2, 0x114c3), -- Tirhuta Sign Virama ..Tirhuta Sign Nukta+ (0x115b2, 0x115b5), -- Siddham Vowel Sign U ..Siddham Vowel Sign Vocal+ (0x115bc, 0x115bd), -- Siddham Sign Candrabindu..Siddham Sign Anusvara+ (0x115bf, 0x115c0), -- Siddham Sign Virama ..Siddham Sign Nukta+ (0x115dc, 0x115dd), -- Siddham Vowel Sign Alter..Siddham Vowel Sign Alter+ (0x11633, 0x1163a), -- Modi Vowel Sign U ..Modi Vowel Sign Ai+ (0x1163d, 0x1163d), -- Modi Sign Anusvara ..Modi Sign Anusvara+ (0x1163f, 0x11640), -- Modi Sign Virama ..Modi Sign Ardhacandra+ (0x116ab, 0x116ab), -- Takri Sign Anusvara ..Takri Sign Anusvara+ (0x116ad, 0x116ad), -- Takri Vowel Sign Aa ..Takri Vowel Sign Aa+ (0x116b0, 0x116b5), -- Takri Vowel Sign U ..Takri Vowel Sign Au+ (0x116b7, 0x116b7), -- Takri Sign Nukta ..Takri Sign Nukta+ (0x1171d, 0x1171f), -- Ahom Consonant Sign Medi..Ahom Consonant Sign Medi+ (0x11722, 0x11725), -- Ahom Vowel Sign I ..Ahom Vowel Sign Uu+ (0x11727, 0x1172b), -- Ahom Vowel Sign Aw ..Ahom Sign Killer+ (0x11c30, 0x11c36), -- (nil) ..+ (0x11c38, 0x11c3d), -- (nil) ..+ (0x11c3f, 0x11c3f), -- (nil) ..+ (0x11c92, 0x11ca7), -- (nil) ..+ (0x11caa, 0x11cb0), -- (nil) ..+ (0x11cb2, 0x11cb3), -- (nil) ..+ (0x11cb5, 0x11cb6), -- (nil) ..+ (0x16af0, 0x16af4), -- Bassa Vah Combining High..Bassa Vah Combining High+ (0x16b30, 0x16b36), -- Pahawh Hmong Mark Cim Tu..Pahawh Hmong Mark Cim Ta+ (0x16f8f, 0x16f92), -- Miao Tone Right ..Miao Tone Below+ (0x1bc9d, 0x1bc9e), -- Duployan Thick Letter Se..Duployan Double Mark+ (0x1d167, 0x1d169), -- Musical Symbol Combining..Musical Symbol Combining+ (0x1d17b, 0x1d182), -- Musical Symbol Combining..Musical Symbol Combining+ (0x1d185, 0x1d18b), -- Musical Symbol Combining..Musical Symbol Combining+ (0x1d1aa, 0x1d1ad), -- Musical Symbol Combining..Musical Symbol Combining+ (0x1d242, 0x1d244), -- Combining Greek Musical ..Combining Greek Musical+ (0x1da00, 0x1da36), -- Signwriting Head Rim ..Signwriting Air Sucking+ (0x1da3b, 0x1da6c), -- Signwriting Mouth Closed..Signwriting Excitement+ (0x1da75, 0x1da75), -- Signwriting Upper Body T..Signwriting Upper Body T+ (0x1da84, 0x1da84), -- Signwriting Location Hea..Signwriting Location Hea+ (0x1da9b, 0x1da9f), -- Signwriting Fill Modifie..Signwriting Fill Modifie+ (0x1daa1, 0x1daaf), -- Signwriting Rotation Mod..Signwriting Rotation Mod+ (0x1e000, 0x1e006), -- (nil) ..+ (0x1e008, 0x1e018), -- (nil) ..+ (0x1e01b, 0x1e021), -- (nil) ..+ (0x1e023, 0x1e024), -- (nil) ..+ (0x1e026, 0x1e02a), -- (nil) ..+ (0x1e8d0, 0x1e8d6), -- Mende Kikakui Combining ..Mende Kikakui Combining+ (0x1e944, 0x1e94a), -- (nil) ..+ (0xe0100, 0xe01ef) -- Variation Selector-17 ..Variation Selector-256+ ]+++basicZero :: RangeSet Int+basicZero = foldr insertRange empty [+ (0, 0),+ (0x034f, 0x034f),+ (0x200b, 0x200f),+ (0x2028, 0x2029),+ (0x202a, 0x202e),+ (0x2060, 0x2063)+ ]++ctrlChars :: RangeSet Int+ctrlChars = foldr insertRange empty [+ (1, 31),+ (0x07f, 0x09F)+ ]++wcwidth :: Char -> Int+wcwidth c | queryPoint v basicZero = 0+ | queryPoint v ctrlChars = -1+ | queryPoint v wIDEEASTASIAN = 2+ | queryPoint v zEROWIDTH = 0+ | otherwise = 1+ where v = ord c
diohsc.cabal view
@@ -1,6 +1,6 @@-cabal-version: >=1.10+cabal-version: 1.18 name: diohsc-version: 0.1.8+version: 0.1.9 license: GPL-3 license-file: COPYING maintainer: mbays@sdf.org@@ -12,7 +12,7 @@ category: Browser build-type: Simple-extra-source-files:+extra-doc-files: README.md THANKS diohscrc.sample@@ -73,10 +73,11 @@ TextGemini URI Util+ WCWidth Version default-language: Haskell2010- ghc-options: -threaded+ ghc-options: -threaded -Wall build-depends: base >=4.3 && <5, asn1-encoding <0.10,@@ -102,6 +103,7 @@ pem >=0.2.4 && <0.3, process >=1.2.0.0 && <1.7, regex-compat >=0.95.1 && <0.96,+ rset < 1.1, safe >=0.3.19 && <0.4, temporary ==1.3.*, terminal-size >=0.3.2.1 && <0.4,
diohsc.hs view
@@ -17,7 +17,6 @@ module Main where import Control.Applicative (Alternative, empty)-import Control.Monad ((<=<)) import Control.Monad.Catch import Control.Monad.State import Control.Monad.Trans.Maybe (MaybeT (..), runMaybeT)@@ -25,7 +24,7 @@ import Data.Char (isUpper, toLower) import Data.Hash (Hash, hash) import Data.List (find, intercalate, isPrefixOf,- isSuffixOf, stripPrefix)+ isSuffixOf, sort, stripPrefix) import Data.Maybe import Safe import System.Directory@@ -296,7 +295,7 @@ getTermSize :: IO (Int,Int) getTermSize = do- Size.Window height width <- fromMaybe (Size.Window (2^31) 80) <$> Size.size+ Size.Window height width <- fromMaybe (Size.Window (2^(30::Int)) 80) <$> Size.size return (height,width) lineClient :: ClientOptions -> [String] -> Bool -> HL.InputT ClientM ()@@ -719,9 +718,9 @@ handleCommand [] ("inventory",_) = do ais <- gets clientActiveIdentities let showNumberedUri :: Bool -> T.Text -> (Int,URI) -> T.Text- showNumberedUri iterate s (n,uri) = s <>- (if iterate && n == 1 then " "- else if iterate && n == 2 then s+ showNumberedUri iter s (n,uri) = s <>+ (if iter && n == 1 then " "+ else if iter && n == 2 then s else T.pack (show n)) <> " " <> showUriFull ansi ais Nothing uri showIteratedItem s (n,item) = showNumberedUri True s (n, historyUri item)@@ -942,7 +941,9 @@ | take 1 path == "/" || take 2 path == "./" || take 3 path == "../" = path | otherwise = savesDir </> path body = mimedBody $ historyMimedData item- name = fromMaybe "" . lastMay . pathSegments $ historyUri item+ uri = historyUri item+ name = fromMaybe (fromMaybe "" $ uriRegName uri) . lastMay .+ filter (not . null) $ pathSegments uri handle printIOErr . void . runMaybeT $ do lift $ mkdirhierto path' isDir <- lift $ doesDirectoryExist path'@@ -1112,7 +1113,8 @@ case MIME.parseMIMEType $ TS.pack s of Nothing -> printErr ("Failed to parse mimetype string: " <> s) >> return Nothing _ | s == "inode/directory" -> Just . (slashedPath,) . MimedData gemTextMimeType .- T.encodeUtf8 . T.unlines . ((("=> " <>) . T.pack . escapePathString) <$>) <$>+ T.encodeUtf8 . T.unlines .+ ((("=> " <>) . T.pack . escapePathString) <$>) . sort <$> getDirectoryContents path where slashedPath | "/" `isSuffixOf` path = path | otherwise = path <> "/"
diohscrc.sample view
@@ -55,6 +55,10 @@ #alias Read ||- espeak -s 300 --stdin --stdout | aplay #alias BGRead ||- espeak -s 300 --stdin --stdout | aplay & +# For use with https://alexschroeder.ch/cgit/gemini-titan/+# Invoke as "TARGET Ti TOKEN [FILE]"+#alias Titan br titan %s+ ## Identification # You may want to configure certain cryptographic identities to always be used # for certain sites. e.g. if you've created an identity "astrobotany" for use