diff options
| author | Daniel Bergey <bergey@alum.mit.edu> | 2014-12-11 18:50:24 +0000 | 
|---|---|---|
| committer | Daniel Bergey <bergey@alum.mit.edu> | 2014-12-12 14:45:45 +0000 | 
| commit | 689fb112bf925ce5394f88b48066be8abdc7fc34 (patch) | |
| tree | dc8a04e12269d7057e8ad7a940a7ceb5bc9551bb /src/Text/Pandoc | |
| parent | 4e040160e0fce94a07e7ab5b4c5aebcf627ff1f6 (diff) | |
| download | pandoc-689fb112bf925ce5394f88b48066be8abdc7fc34.tar.gz | |
RST Reader: compute Attrs when role is defined
Move recursive role lookup from renderRole to addNewRole.  The Attr value
will be the same for every occurance of this role, so there's no reason
to compute it every time.  This allows simplifying the
stateRstCustomRoles map considerably.
We could go even further, and remove the fmt and attr arguments to
renderRole, which are null except for custom roles.
Diffstat (limited to 'src/Text/Pandoc')
| -rw-r--r-- | src/Text/Pandoc/Parsing.hs | 5 | ||||
| -rw-r--r-- | src/Text/Pandoc/Readers/RST.hs | 30 | 
2 files changed, 17 insertions, 18 deletions
| diff --git a/src/Text/Pandoc/Parsing.hs b/src/Text/Pandoc/Parsing.hs index 430cfca89..4503e31fd 100644 --- a/src/Text/Pandoc/Parsing.hs +++ b/src/Text/Pandoc/Parsing.hs @@ -921,10 +921,9 @@ data ParserState = ParserState        stateHasChapters     :: Bool,          -- ^ True if \chapter encountered        stateMacros          :: [Macro],       -- ^ List of macros defined so far        stateRstDefaultRole  :: String,        -- ^ Current rST default interpreted text role -      stateRstCustomRoles  :: M.Map String (String, Maybe String, Attr -> (String, Attr)), -- ^ Current rST custom text roles +      stateRstCustomRoles  :: M.Map String (String, Maybe String, Attr), -- ^ Current rST custom text roles        -- Triple represents: 1) Base role, 2) Optional format (only for :raw: -      -- roles), 3) Source language annotation for code (could be used to -      -- annotate role classes too). +      -- roles), 3) Additional classes (rest of Attr is unused)).        stateCaption         :: Maybe Inlines, -- ^ Caption in current environment        stateInHtmlBlock     :: Maybe String,  -- ^ Tag type of HTML block being parsed        stateMarkdownAttribute :: Bool,        -- ^ True if in markdown=1 context diff --git a/src/Text/Pandoc/Readers/RST.hs b/src/Text/Pandoc/Readers/RST.hs index 5d550f7b7..0a5c3bcb4 100644 --- a/src/Text/Pandoc/Readers/RST.hs +++ b/src/Text/Pandoc/Readers/RST.hs @@ -625,25 +625,27 @@ addNewRole :: String -> [(String, String)] -> RSTParser Blocks  addNewRole roleString fields = do      (role, parentRole) <- parseFromString inheritedRole roleString      customRoles <- stateRstCustomRoles <$> getState -    baseRole <- case M.lookup parentRole customRoles of -        Just (base, _, _) -> return base -        Nothing -> return parentRole - -    let fmt = if baseRole == "raw" then lookup "format" fields else Nothing -        annotate = maybe (addClass role) (addLanguage role) $ +    let (baseRole, baseFmt, baseAttr) = +            maybe (parentRole, Nothing, nullAttr) id $ +              M.lookup parentRole customRoles + +    let fmt = if parentRole == "raw" then lookup "format" fields else baseFmt +        -- nub in case role name & language class are the same +        annotate :: [String] -> [String] +        annotate = maybe id (:) $              if baseRole == "code"                 then lookup "language" fields                 else Nothing +        attr = let (ident, classes, keyValues) = baseAttr +               in (ident, nub . (role :) . annotate $ classes, keyValues)      updateState $ \s -> s {          stateRstCustomRoles = -          M.insert role (baseRole, fmt, (,) parentRole . annotate) customRoles +          M.insert role (baseRole, fmt, attr) customRoles      }      return $ B.singleton Null    where -    addLanguage role lang (ident, classes, keyValues) = -        (ident, nub ("sourceCode" : lang : role : classes), keyValues)      inheritedRole =          (,) <$> roleName <*> ((char '(' *> roleName <* char ')') <|> pure "span") @@ -1014,12 +1016,10 @@ renderRole contents fmt role attr = case role of      "span" -> return $ B.spanWith attr $ B.str contents      "raw" -> return $ B.rawInline (fromMaybe "" fmt) contents      custom -> do -        customRole <- stateRstCustomRoles <$> getState -        case M.lookup custom customRole of -            Just (_, newFmt, inherit) -> let -                fmtStr = fmt `mplus` newFmt -                (newRole, newAttr) = inherit attr -                in renderRole contents fmtStr newRole newAttr +        customRoles <- stateRstCustomRoles <$> getState +        case M.lookup custom customRoles of +            Just (newRole, newFmt, newAttr) -> +                renderRole contents newFmt newRole newAttr              Nothing -> do                  pos <- getPosition                  addWarning (Just pos) $ "ignoring unknown role :" ++ custom ++ ": in " | 
