@@ -42,9 +42,13 @@ module Text.Pandoc.Readers.Org.ParserState
4242 , returnF
4343 , ExportSettingSetter
4444 , ExportSettings (..)
45− , setExportSubSuperscripts
4645 , setExportDrawers
46+ , setExportEmphasizedText
47+ , setExportSmartQuotes
48+ , setExportSpecialStrings
49+ , setExportSubSuperscripts
4750 , modifyExportSettings
51+ , optionsToParserState
4852 ) where
4953
5054import Control.Monad (liftM, liftM2)
@@ -54,8 +58,7 @@ import Data.Default (Default(..))
5458import qualified Data.Map as M
5559import qualified Data.Set as Set
5660
57−import Text.Pandoc.Builder ( Inlines, Blocks, HasMeta(..),
58− trimInlines )
61+import Text.Pandoc.Builder ( Inlines, Blocks, trimInlines )
5962import Text.Pandoc.Definition ( Meta(..), nullMeta )
6063import Text.Pandoc.Options ( ReaderOptions(..) )
6164import Text.Pandoc.Parsing ( HasHeaderMap(..)
@@ -78,30 +81,32 @@ type OrgLinkFormatters = M.Map String (String -> String)
7881-- | Export settings <http://orgmode.org/manual/Export-settings.html>
7982-- These settings can be changed via OPTIONS statements.
8083data ExportSettings = ExportSettings
81− { exportSubSuperscripts :: Bool -- ^ TeX-like syntax for sub- and superscripts
82− , exportDrawers :: Either [String] [String]
84+ { exportDrawers :: Either [String] [String]
8385 -- ^ Specify drawer names which should be exported. @Left@ names are
8486 -- explicitly excluded from the resulting output while @Right@ means that
8587 -- only the listed drawer names should be included.
88+ , exportEmphasizedText :: Bool -- ^ Parse emphasized text
89+ , exportSmartQuotes :: Bool -- ^ Parse quotes smartly
90+ , exportSpecialStrings :: Bool -- ^ Parse ellipses and dashes smartly
91+ , exportSubSuperscripts :: Bool -- ^ TeX-like syntax for sub- and superscripts
8692 }
8793
8894-- | Org-mode parser state
8995data OrgParserState = OrgParserState
90− { orgStateOptions :: ReaderOptions
91− , orgStateAnchorIds :: [String]
96+ { orgStateAnchorIds :: [String]
9297 , orgStateEmphasisCharStack :: [Char]
9398 , orgStateEmphasisNewlines :: Maybe Int
9499 , orgStateExportSettings :: ExportSettings
100+ , orgStateHeaderMap :: M.Map Inlines String
101+ , orgStateIdentifiers :: Set.Set String
95102 , orgStateLastForbiddenCharPos :: Maybe SourcePos
96103 , orgStateLastPreCharPos :: Maybe SourcePos
97104 , orgStateLastStrPos :: Maybe SourcePos
98105 , orgStateLinkFormatters :: OrgLinkFormatters
99− , orgStateMeta :: Meta
100− , orgStateMeta' :: F Meta
106+ , orgStateMeta :: F Meta
101107 , orgStateNotes' :: OrgNoteTable
108+ , orgStateOptions :: ReaderOptions
102109 , orgStateParserContext :: ParserContext
103− , orgStateIdentifiers :: Set.Set String
104− , orgStateHeaderMap :: M.Map Inlines String
105110 }
106111
107112data OrgParserLocal = OrgParserLocal { orgLocalQuoteContext :: QuoteContext }
@@ -112,12 +117,6 @@ instance Default OrgParserLocal where
112117instance HasReaderOptions OrgParserState where
113118 extractReaderOptions = orgStateOptions
114119
115−instance HasMeta OrgParserState where
116− setMeta field val st =
117− st{ orgStateMeta = setMeta field val $ orgStateMeta st }
118− deleteMeta field st =
119− st{ orgStateMeta = deleteMeta field $ orgStateMeta st }
120−
121120instance HasLastStrPosition OrgParserState where
122121 getLastStrPos = orgStateLastStrPos
123122 setLastStrPos pos st = st{ orgStateLastStrPos = Just pos }
@@ -142,45 +141,64 @@ instance Default OrgParserState where
142141
143142defaultOrgParserState :: OrgParserState
144143defaultOrgParserState = OrgParserState
145− { orgStateOptions = def
146− , orgStateAnchorIds = []
144+ { orgStateAnchorIds = []
147145 , orgStateEmphasisCharStack = []
148146 , orgStateEmphasisNewlines = Nothing
149147 , orgStateExportSettings = def
148+ , orgStateHeaderMap = M.empty
149+ , orgStateIdentifiers = Set.empty
150150 , orgStateLastForbiddenCharPos = Nothing
151151 , orgStateLastPreCharPos = Nothing
152152 , orgStateLastStrPos = Nothing
153153 , orgStateLinkFormatters = M.empty
154− , orgStateMeta = nullMeta
155− , orgStateMeta' = return nullMeta
154+ , orgStateMeta = return nullMeta
156155 , orgStateNotes' = []
156+ , orgStateOptions = def
157157 , orgStateParserContext = NullState
158− , orgStateIdentifiers = Set.empty
159− , orgStateHeaderMap = M.empty
160158 }
161159
162160defaultExportSettings :: ExportSettings
163161defaultExportSettings = ExportSettings
164− { exportSubSuperscripts = True
165− , exportDrawers = Left ["LOGBOOK"]
162+ { exportDrawers = Left ["LOGBOOK"]
163+ , exportEmphasizedText = True
164+ , exportSmartQuotes = True
165+ , exportSpecialStrings = True
166+ , exportSubSuperscripts = True
166167 }
167168
169+optionsToParserState :: ReaderOptions -> OrgParserState
170+optionsToParserState opts =
171+ def { orgStateOptions = opts }
172+
168173
169174--
170175-- Setter for exporting options
171176--
172177type ExportSettingSetter a = a -> ExportSettings -> ExportSettings
173178
174−-- | Set export options for sub/superscript parsing. The short syntax will
175−-- not be parsed if this is set set to @False@.
176−setExportSubSuperscripts :: ExportSettingSetter Bool
177−setExportSubSuperscripts val es = es { exportSubSuperscripts = val }
178−
179179-- | Set export options for drawers. See the @exportDrawers@ in ADT
180180-- @ExportSettings@ for details.
181181setExportDrawers :: ExportSettingSetter (Either [String] [String])
182182setExportDrawers val es = es { exportDrawers = val }
183183
184+-- | Set export options for emphasis parsing.
185+setExportEmphasizedText :: ExportSettingSetter Bool
186+setExportEmphasizedText val es = es { exportEmphasizedText = val }
187+
188+-- | Set export options for parsing of smart quotes.
189+setExportSmartQuotes :: ExportSettingSetter Bool
190+setExportSmartQuotes val es = es { exportSmartQuotes = val }
191+
192+-- | Set export options for parsing of special strings (like em/en dashes or
193+-- ellipses).
194+setExportSpecialStrings :: ExportSettingSetter Bool
195+setExportSpecialStrings val es = es { exportSpecialStrings = val }
196+
197+-- | Set export options for sub/superscript parsing. The short syntax will
198+-- not be parsed if this is set set to @False@.
199+setExportSubSuperscripts :: ExportSettingSetter Bool
200+setExportSubSuperscripts val es = es { exportSubSuperscripts = val }
201+
184202-- | Modify a parser state
185203modifyExportSettings :: ExportSettingSetter a -> a -> OrgParserState -> OrgParserState
186204modifyExportSettings setter val state =