1
1
mirror of https://github.com/github/semantic.git synced 2024-12-20 05:11:44 +03:00

Merge pull request #1278 from github/cmark-gfm

Use cmark-gfm package
This commit is contained in:
Rob Rix 2017-08-03 09:51:51 -04:00 committed by GitHub
commit d1d4e35192
4 changed files with 30 additions and 14 deletions

View File

@ -87,7 +87,7 @@ library
, async , async
, bifunctors , bifunctors
, bytestring , bytestring
, cmark , cmark-gfm
, comonad , comonad
, containers , containers
, directory , directory

View File

@ -5,7 +5,7 @@ module Language.Markdown
, toGrammar , toGrammar
) where ) where
import CMark import CMarkGFM
import Data.Source import Data.Source
import qualified Data.Syntax.Assignment as A (AST, Node(..)) import qualified Data.Syntax.Assignment as A (AST, Node(..))
import Info import Info
@ -33,10 +33,22 @@ data Grammar
| Strong | Strong
| Link | Link
| Image | Image
| Strikethrough
| Table
| TableRow
| TableCell
deriving (Bounded, Enum, Eq, Ord, Show) deriving (Bounded, Enum, Eq, Ord, Show)
exts :: [CMarkExtension]
exts = [
extStrikethrough
, extTable
, extAutolink
, extTagfilter
]
cmarkParser :: Source -> A.AST NodeType cmarkParser :: Source -> A.AST NodeType
cmarkParser source = toTerm (totalRange source) (totalSpan source) $ commonmarkToNode [ optSourcePos, optSafe ] (toText source) cmarkParser source = toTerm (totalRange source) (totalSpan source) $ commonmarkToNode [ optSourcePos, optSafe ] exts (toText source)
where toTerm :: Range -> Span -> Node -> A.AST NodeType where toTerm :: Range -> Span -> Node -> A.AST NodeType
toTerm within withinSpan (Node position t children) = toTerm within withinSpan (Node position t children) =
let range = maybe within (spanToRangeInLineRanges lineRanges . toSpan) position let range = maybe within (spanToRangeInLineRanges lineRanges . toSpan) position
@ -68,6 +80,10 @@ toGrammar EMPH{} = Emphasis
toGrammar STRONG{} = Strong toGrammar STRONG{} = Strong
toGrammar LINK{} = Link toGrammar LINK{} = Link
toGrammar IMAGE{} = Image toGrammar IMAGE{} = Image
toGrammar STRIKETHROUGH{} = Strikethrough
toGrammar TABLE{} = Table
toGrammar TABLE_ROW{} = TableRow
toGrammar TABLE_CELL{} = TableCell
instance Symbol Grammar where instance Symbol Grammar where

View File

@ -6,7 +6,7 @@ module Language.Markdown.Syntax
, Term , Term
) where ) where
import qualified CMark import qualified CMarkGFM
import Data.Record import Data.Record
import Data.Syntax.Assignment hiding (Assignment, Error) import Data.Syntax.Assignment hiding (Assignment, Error)
import qualified Data.Syntax.Assignment as Assignment import qualified Data.Syntax.Assignment as Assignment
@ -44,7 +44,7 @@ type Syntax =
] ]
type Term = Term.Term (Union Syntax) (Record Location) type Term = Term.Term (Union Syntax) (Record Location)
type Assignment = HasCallStack => Assignment.Assignment (AST CMark.NodeType) Grammar Term type Assignment = HasCallStack => Assignment.Assignment (AST CMarkGFM.NodeType) Grammar Term
assignment :: Assignment assignment :: Assignment
@ -60,16 +60,16 @@ paragraph :: Assignment
paragraph = makeTerm <$> symbol Paragraph <*> children (Markup.Paragraph <$> many inlineElement) paragraph = makeTerm <$> symbol Paragraph <*> children (Markup.Paragraph <$> many inlineElement)
list :: Assignment list :: Assignment
list = (cofree .) . (:<) <$> symbol List <*> (project (\ (Node (CMark.LIST CMark.ListAttributes{..}) _ _ :< _) -> case listType of list = (cofree .) . (:<) <$> symbol List <*> (project (\ (Node (CMarkGFM.LIST CMarkGFM.ListAttributes{..}) _ _ :< _) -> case listType of
CMark.BULLET_LIST -> inj . Markup.UnorderedList CMarkGFM.BULLET_LIST -> inj . Markup.UnorderedList
CMark.ORDERED_LIST -> inj . Markup.OrderedList) <*> children (many item)) CMarkGFM.ORDERED_LIST -> inj . Markup.OrderedList) <*> children (many item))
item :: Assignment item :: Assignment
item = makeTerm <$> symbol Item <*> children (many blockElement) item = makeTerm <$> symbol Item <*> children (many blockElement)
section :: Assignment section :: Assignment
section = makeTerm <$> symbol Heading <*> (heading >>= \ headingTerm -> Markup.Section (level headingTerm) headingTerm <$> while (((<) `on` level) headingTerm) blockElement) section = makeTerm <$> symbol Heading <*> (heading >>= \ headingTerm -> Markup.Section (level headingTerm) headingTerm <$> while (((<) `on` level) headingTerm) blockElement)
where heading = makeTerm <$> symbol Heading <*> (project (\ (Node (CMark.HEADING level) _ _ :< _) -> Markup.Heading level) <*> children (many inlineElement)) where heading = makeTerm <$> symbol Heading <*> (project (\ (Node (CMarkGFM.HEADING level) _ _ :< _) -> Markup.Heading level) <*> children (many inlineElement))
level term = case term of level term = case term of
_ | Just section <- prj (unwrap term) -> level (Markup.sectionHeading section) _ | Just section <- prj (unwrap term) -> level (Markup.sectionHeading section)
_ | Just heading <- prj (unwrap term) -> Markup.headingLevel heading _ | Just heading <- prj (unwrap term) -> Markup.headingLevel heading
@ -79,7 +79,7 @@ blockQuote :: Assignment
blockQuote = makeTerm <$> symbol BlockQuote <*> children (Markup.BlockQuote <$> many blockElement) blockQuote = makeTerm <$> symbol BlockQuote <*> children (Markup.BlockQuote <$> many blockElement)
codeBlock :: Assignment codeBlock :: Assignment
codeBlock = makeTerm <$> symbol CodeBlock <*> (project (\ (Node (CMark.CODE_BLOCK language _) _ _ :< _) -> Markup.Code (nullText language)) <*> source) codeBlock = makeTerm <$> symbol CodeBlock <*> (project (\ (Node (CMarkGFM.CODE_BLOCK language _) _ _ :< _) -> Markup.Code (nullText language)) <*> source)
thematicBreak :: Assignment thematicBreak :: Assignment
thematicBreak = makeTerm <$> symbol ThematicBreak <*> pure Markup.ThematicBreak <* source thematicBreak = makeTerm <$> symbol ThematicBreak <*> pure Markup.ThematicBreak <* source
@ -106,10 +106,10 @@ htmlInline :: Assignment
htmlInline = makeTerm <$> symbol HTMLInline <*> (Markup.HTMLBlock <$> source) htmlInline = makeTerm <$> symbol HTMLInline <*> (Markup.HTMLBlock <$> source)
link :: Assignment link :: Assignment
link = makeTerm <$> symbol Link <*> project (\ (Node (CMark.LINK url title) _ _ :< _) -> Markup.Link (toS url) (nullText title)) <* source link = makeTerm <$> symbol Link <*> project (\ (Node (CMarkGFM.LINK url title) _ _ :< _) -> Markup.Link (toS url) (nullText title)) <* source
image :: Assignment image :: Assignment
image = makeTerm <$> symbol Image <*> project (\ (Node (CMark.IMAGE url title) _ _ :< _) -> Markup.Image (toS url) (nullText title)) <* source image = makeTerm <$> symbol Image <*> project (\ (Node (CMarkGFM.IMAGE url title) _ _ :< _) -> Markup.Image (toS url) (nullText title)) <* source
code :: Assignment code :: Assignment
code = makeTerm <$> symbol Code <*> (Markup.Code Nothing <$> source) code = makeTerm <$> symbol Code <*> (Markup.Code Nothing <$> source)

View File

@ -11,7 +11,7 @@ module Parser
, rubyParser , rubyParser
) where ) where
import qualified CMark import qualified CMarkGFM
import Data.Functor.Foldable hiding (fold, Nil) import Data.Functor.Foldable hiding (fold, Nil)
import Data.Record import Data.Record
import Data.Source as Source import Data.Source as Source
@ -49,7 +49,7 @@ data Parser term where
-- | A tree-sitter parser. -- | A tree-sitter parser.
TreeSitterParser :: Ptr TS.Language -> Parser (SyntaxTerm DefaultFields) TreeSitterParser :: Ptr TS.Language -> Parser (SyntaxTerm DefaultFields)
-- | A parser for 'Markdown' using cmark. -- | A parser for 'Markdown' using cmark.
MarkdownParser :: Parser (AST CMark.NodeType) MarkdownParser :: Parser (AST CMarkGFM.NodeType)
-- | A parser which will parse any input 'Source' into a top-level 'Term' whose children are leaves consisting of the 'Source's lines. -- | A parser which will parse any input 'Source' into a top-level 'Term' whose children are leaves consisting of the 'Source's lines.
LineByLineParser :: Parser (SyntaxTerm DefaultFields) LineByLineParser :: Parser (SyntaxTerm DefaultFields)