Render quote links properly
This commit is contained in:
parent
03066403fb
commit
57776a1110
|
@ -23,13 +23,17 @@ import qualified GHCJS.DOM.JSFFI.Generated.NodeList as NodeList
|
||||||
import GHCJS.DOM.JSFFI.Generated.DOMTokenList (contains)
|
import GHCJS.DOM.JSFFI.Generated.DOMTokenList (contains)
|
||||||
import Data.Text (Text)
|
import Data.Text (Text)
|
||||||
import Miso (consoleLog)
|
import Miso (consoleLog)
|
||||||
|
import Miso.String (fromMisoString)
|
||||||
|
import Text.Parsec (ParseError)
|
||||||
|
|
||||||
|
import QuoteLinkParser
|
||||||
|
|
||||||
|
|
||||||
data PostPart
|
data PostPart
|
||||||
= SimpleText JSString
|
= SimpleText JSString
|
||||||
| PostedUrl JSString
|
| PostedUrl JSString
|
||||||
| Skip
|
| Skip
|
||||||
| Quote JSString
|
| Quote (Either ParseError ParsedURL)
|
||||||
-- Quotes don't seem to be able to be spoilered
|
-- Quotes don't seem to be able to be spoilered
|
||||||
-- board links (which appear as quotes but start with >>>) break the tag
|
-- board links (which appear as quotes but start with >>>) break the tag
|
||||||
| GreenText [ PostPart ]
|
| GreenText [ PostPart ]
|
||||||
|
@ -109,7 +113,7 @@ parseAnchor element = do
|
||||||
|
|
||||||
case target of
|
case target of
|
||||||
Just ("_blank" :: JSString) -> return $ PostedUrl href
|
Just ("_blank" :: JSString) -> return $ PostedUrl href
|
||||||
_ -> return $ Quote href
|
_ -> return $ Quote $ parseURL $ fromMisoString href
|
||||||
|
|
||||||
|
|
||||||
parseSpan :: Element -> IO PostPart
|
parseSpan :: Element -> IO PostPart
|
||||||
|
|
|
@ -16,16 +16,19 @@ import Miso
|
||||||
, u_
|
, u_
|
||||||
, em_
|
, em_
|
||||||
, s_
|
, s_
|
||||||
, title_
|
|
||||||
)
|
)
|
||||||
|
|
||||||
import Miso.String (toMisoString, fromMisoString)
|
import Miso.String (toMisoString)
|
||||||
|
import System.FilePath ((</>))
|
||||||
import Text.Parsec (ParseError)
|
import Text.Parsec (ParseError)
|
||||||
|
import GHCJS.DOM.Types (JSString)
|
||||||
|
import Data.Maybe (fromJust)
|
||||||
|
|
||||||
import BodyParser (PostPart (..))
|
import BodyParser (PostPart (..))
|
||||||
import QuoteLinkParser
|
import QuoteLinkParser
|
||||||
import qualified Component.Thread.Model as Model
|
import qualified Component.Thread.Model as Model
|
||||||
import qualified Network.SiteType as Site
|
import qualified Network.SiteType as Site
|
||||||
import qualified Network.ThreadType as Thread
|
import qualified Network.BoardType as Board
|
||||||
|
|
||||||
{-
|
{-
|
||||||
- This is the inverse of parsePostBody from BodyParser except
|
- This is the inverse of parsePostBody from BodyParser except
|
||||||
|
@ -51,21 +54,60 @@ renderPostPart _ (PostedUrl u) =
|
||||||
|
|
||||||
renderPostPart _ Skip = br_ []
|
renderPostPart _ Skip = br_ []
|
||||||
|
|
||||||
renderPostPart m (Quote url) = elems parse_result
|
renderPostPart m (Quote parse_result) = elems parse_result
|
||||||
where
|
where
|
||||||
parse_result = parseURL $ fromMisoString url
|
|
||||||
|
|
||||||
elems :: Either ParseError ParsedURL -> View a
|
elems :: Either ParseError ParsedURL -> View a
|
||||||
elems (Left err) =
|
elems (Left err) =
|
||||||
a_
|
a_
|
||||||
[ href_ url
|
[]
|
||||||
, title_ $ toMisoString $ show err
|
[ text $ toMisoString $ show err ]
|
||||||
]
|
elems (Right p) =
|
||||||
[ text url ]
|
case full_url p of
|
||||||
elems (Right ParsedURL {..}) =
|
Nothing ->
|
||||||
a_
|
a_
|
||||||
[ href_ url ]
|
[ href_ $ "/" <> site_name <> "/" <> linked_board <> "/" ]
|
||||||
[ text url ]
|
[ text $ ">>>/" <> linked_board <> "/" ]
|
||||||
|
|
||||||
|
Just u ->
|
||||||
|
if current_board /= linked_board
|
||||||
|
then
|
||||||
|
a_
|
||||||
|
[ href_ u ]
|
||||||
|
[ text $ ">>>/" <> linked_board <> "/" <> post_id ]
|
||||||
|
else
|
||||||
|
a_
|
||||||
|
[ href_ u ]
|
||||||
|
[ text $ ">>" <> post_id ]
|
||||||
|
|
||||||
|
where
|
||||||
|
linked_board = toMisoString $ boardName p
|
||||||
|
|
||||||
|
post_id = toMisoString $ show $ fromJust $ postId p
|
||||||
|
|
||||||
|
current_board = toMisoString $ Board.pathpart $ head $ Site.boards (Model.site m)
|
||||||
|
|
||||||
|
|
||||||
|
full_url :: ParsedURL -> Maybe JSString
|
||||||
|
full_url ParsedURL {..} = do
|
||||||
|
tid <- threadId
|
||||||
|
pid <- postId
|
||||||
|
|
||||||
|
return $ "/" <> site_name <> "/" <> (toMisoString $ boardName </> show tid ++ "#" ++ show pid)
|
||||||
|
|
||||||
|
site_name = toMisoString $ Site.name $ Model.site m
|
||||||
|
|
||||||
|
-- cases of urls:
|
||||||
|
-- url:
|
||||||
|
-- /b/res/1.html#2
|
||||||
|
-- if on different board:
|
||||||
|
-- >>/b/2
|
||||||
|
-- if on same board or same thread:
|
||||||
|
-- >>2
|
||||||
|
--
|
||||||
|
-- url:
|
||||||
|
-- /b/index.html
|
||||||
|
-- if only board:
|
||||||
|
-- >>>/b/
|
||||||
|
|
||||||
renderPostPart m (GreenText parts) =
|
renderPostPart m (GreenText parts) =
|
||||||
span_ [ class_ "quote" ] (render m parts)
|
span_ [ class_ "quote" ] (render m parts)
|
||||||
|
|
|
@ -18,7 +18,6 @@ import Miso
|
||||||
, noEff
|
, noEff
|
||||||
, class_
|
, class_
|
||||||
, id_
|
, id_
|
||||||
, textProp
|
|
||||||
, h2_
|
, h2_
|
||||||
, Attribute
|
, Attribute
|
||||||
, (<#)
|
, (<#)
|
||||||
|
@ -107,7 +106,7 @@ op m op_post =
|
||||||
, div_
|
, div_
|
||||||
(
|
(
|
||||||
[ class_ "post op"
|
[ class_ "post op"
|
||||||
, id_ "op_477700"
|
, id_ $ toMisoString $ show $ Post.board_post_id op_post
|
||||||
] ++ multi op_post
|
] ++ multi op_post
|
||||||
)
|
)
|
||||||
[ intro op_post
|
[ intro op_post
|
||||||
|
@ -132,8 +131,7 @@ multi post
|
||||||
reply :: Model -> PostWithBody -> View a
|
reply :: Model -> PostWithBody -> View a
|
||||||
reply m (post, parts) = div_
|
reply m (post, parts) = div_
|
||||||
[ class_ "postcontainer"
|
[ class_ "postcontainer"
|
||||||
, id_ "pc477702"
|
, id_ $ toMisoString $ show $ Post.board_post_id post
|
||||||
, textProp "data-board" "leftypol"
|
|
||||||
]
|
]
|
||||||
[ div_
|
[ div_
|
||||||
[ class_ "sidearrows" ]
|
[ class_ "sidearrows" ]
|
||||||
|
|
|
@ -7,14 +7,12 @@ module QuoteLinkParser
|
||||||
import Text.Parsec
|
import Text.Parsec
|
||||||
import Text.Parsec.String (Parser)
|
import Text.Parsec.String (Parser)
|
||||||
|
|
||||||
|
-- Define a data type to hold the extracted components
|
||||||
data ParsedURL = ParsedURL
|
data ParsedURL = ParsedURL
|
||||||
{ siteName :: Maybe String
|
{ boardName :: String
|
||||||
, boardName :: String
|
|
||||||
, threadId :: Maybe Integer
|
, threadId :: Maybe Integer
|
||||||
, postId :: Maybe Integer
|
, postId :: Maybe Integer
|
||||||
} deriving (Show)
|
} deriving (Show, Eq)
|
||||||
|
|
||||||
|
|
||||||
-- Parser for a segment of the path
|
-- Parser for a segment of the path
|
||||||
segment :: Parser String
|
segment :: Parser String
|
||||||
|
@ -24,32 +22,42 @@ segment = many (noneOf "/#")
|
||||||
integer :: Parser Integer
|
integer :: Parser Integer
|
||||||
integer = read <$> many1 digit
|
integer = read <$> many1 digit
|
||||||
|
|
||||||
-- Parser for the site name
|
|
||||||
siteNameParser :: Parser (Maybe String)
|
|
||||||
siteNameParser = optionMaybe $ char '/' >> segment
|
|
||||||
|
|
||||||
-- Parser for the board name
|
-- Parser for the board name
|
||||||
boardNameParser :: Parser String
|
boardNameParser :: Parser String
|
||||||
boardNameParser = char '/' >> segment
|
boardNameParser = char '/' >> segment
|
||||||
|
|
||||||
-- Optional parser for the thread number
|
-- Optional parser for the thread number
|
||||||
threadNumberParser :: Parser (Maybe Integer)
|
threadNumberParser :: Parser (Maybe Integer)
|
||||||
threadNumberParser = optionMaybe $ try (char '/' >> string "res/" >> integer)
|
threadNumberParser = optionMaybe $ try $ do
|
||||||
|
_ <- char '/' >> string "res/"
|
||||||
|
tId <- integer
|
||||||
|
_ <- string ".html"
|
||||||
|
return tId
|
||||||
|
|
||||||
|
-- Parser for index.html, returning Nothing for threadId and postId
|
||||||
|
indexParser :: Parser (Maybe Integer, Maybe Integer)
|
||||||
|
indexParser = try $ do
|
||||||
|
_ <- string "/index.html"
|
||||||
|
return (Nothing, Nothing)
|
||||||
|
|
||||||
|
-- Combined URL parser
|
||||||
|
urlParser :: Parser ParsedURL
|
||||||
|
urlParser = do
|
||||||
|
bName <- boardNameParser
|
||||||
|
|
||||||
|
(tId, pId) <- try threadNumberParser >>= \mTid ->
|
||||||
|
case mTid of
|
||||||
|
Just tId -> do
|
||||||
|
pId <- postIdParser
|
||||||
|
return (Just tId, pId)
|
||||||
|
Nothing -> indexParser
|
||||||
|
eof -- Expect the end of input
|
||||||
|
return $ ParsedURL bName tId pId
|
||||||
|
|
||||||
-- Optional parser for the post ID
|
-- Optional parser for the post ID
|
||||||
postIdParser :: Parser (Maybe Integer)
|
postIdParser :: Parser (Maybe Integer)
|
||||||
postIdParser = optionMaybe $ char '#' >> integer
|
postIdParser = optionMaybe $ char '#' >> integer
|
||||||
|
|
||||||
-- Combined URL parser
|
|
||||||
urlParser :: Parser ParsedURL
|
|
||||||
urlParser = do
|
|
||||||
sName <- siteNameParser
|
|
||||||
bName <- boardNameParser
|
|
||||||
tId <- threadNumberParser
|
|
||||||
pId <- postIdParser
|
|
||||||
eof -- Expect the end of input
|
|
||||||
return $ ParsedURL sName bName tId pId
|
|
||||||
|
|
||||||
-- Function to run the parser
|
-- Function to run the parser
|
||||||
parseURL :: String -> Either ParseError ParsedURL
|
parseURL :: String -> Either ParseError ParsedURL
|
||||||
parseURL = parse urlParser "chan"
|
parseURL = parse urlParser ""
|
||||||
|
|
Loading…
Reference in New Issue