123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902 |
- ;;; org-e-html.el --- HTML Back-End For Org Export Engine
- ;; Copyright (C) 2011-2012 Free Software Foundation, Inc.
- ;; Author: Nicolas Goaziou <n.goaziou at gmail dot com>
- ;; Keywords: outlines, hypermedia, calendar, wp
- ;; This program is free software; you can redistribute it and/or modify
- ;; it under the terms of the GNU General Public License as published by
- ;; the Free Software Foundation, either version 3 of the License, or
- ;; (at your option) any later version.
- ;; This program is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;; GNU General Public License for more details.
- ;; You should have received a copy of the GNU General Public License
- ;; along with this program. If not, see <http://www.gnu.org/licenses/>.
- ;;; Commentary:
- ;; This library implements a HTML back-end for Org generic exporter.
- ;; To test it, run
- ;;
- ;; M-: (org-export-to-buffer 'e-html "*Test e-HTML*") RET
- ;;
- ;; in an org-mode buffer then switch to the buffer to see the HTML
- ;; export. See contrib/lisp/org-export.el for more details on how
- ;; this exporter works.
- ;; It introduces three new buffer keywords: "LATEX_CLASS",
- ;; "LATEX_CLASS_OPTIONS" and "LATEX_HEADER".
- ;;; Code:
- ;;; org-xhtml.el
- (defvar org-e-html-debug nil)
- (defvar org-e-html-pp nil)
- (defun org-e-html-debug (fmt &rest args)
- (when org-e-html-debug
- (with-current-buffer (get-buffer "*debug*")
- (insert "\n" (apply 'format fmt args)))))
- (defun org-element-debug (header text)
- (insert "\n" "===== [" header "] =====")
- (insert "\n" (pp-to-string text)))
- (defun org-elements-debug (args)
- (with-current-buffer "*debug*"
- (insert "\n\n\n\n\n-------------------------\n")
- (while args
- (let* ((header (pop args))
- (text (pop args)))
- (org-element-debug (format "%s" header) text)))
- (insert "\n--------------------------\n")))
- (defvar org-elements-debug-depth 0)
- (defmacro org-e-html-pp (&rest args)
- (if org-e-html-pp
- (let ((newargs))
- (while args
- (let ((e (pop args)))
- (setq newargs (append newargs (list e (eval e))))))
- ;; (pp-eval-expression 'newargs)
- `(org-elements-debug (quote ,newargs)))
- (list 'ignore)))
- (require 'org-exp)
- (require 'format-spec)
- (eval-when-compile (require 'cl) (require 'table))
- (declare-function org-id-find-id-file "org-id" (id))
- (declare-function htmlize-region "ext:htmlize" (beg end))
- (declare-function org-pop-to-buffer-same-window
- "org-compat" (&optional buffer-or-name norecord label))
- (defgroup org-export-e-html nil
- "Options specific for HTML export of Org-mode files."
- :tag "Org Export HTML"
- :group 'org-export)
- (defconst org-export-e-html-special-string-regexps
- '(("\\\\-" . "­")
- ("---\\([^-]\\)" . "—\\1")
- ("--\\([^-]\\)" . "–\\1")
- ("\\.\\.\\." . "…"))
- "Regular expressions for special string conversion.")
- (defcustom org-export-e-html-footnotes-section "<div id=\"footnotes\">
- <h2 class=\"footnotes\">%s: </h2>
- <div id=\"text-footnotes\">
- %s
- </div>
- </div>"
- "Format for the footnotes section.
- Should contain a two instances of %s. The first will be replaced with the
- language-specific word for \"Footnotes\", the second one will be replaced
- by the footnotes themselves."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-export-e-html-footnote-format "<sup>%s</sup>"
- "The format for the footnote reference.
- %s will be replaced by the footnote reference itself."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-export-e-html-footnote-separator "<sup>, </sup>"
- "Text used to separate footnotes."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-export-e-html-coding-system nil
- "Coding system for HTML export, defaults to `buffer-file-coding-system'."
- :group 'org-export-e-html
- :type 'coding-system)
- (defcustom org-export-e-html-extension "html"
- "The extension for exported HTML files."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-export-e-html-xml-declaration
- '(("html" . "<?xml version=\"1.0\" encoding=\"%s\"?>")
- ("php" . "<?php echo \"<?xml version=\\\"1.0\\\" encoding=\\\"%s\\\" ?>\"; ?>"))
- "The extension for exported HTML files.
- %s will be replaced with the charset of the exported file.
- This may be a string, or an alist with export extensions
- and corresponding declarations."
- :group 'org-export-e-html
- :type '(choice
- (string :tag "Single declaration")
- (repeat :tag "Dependent on extension"
- (cons (string :tag "Extension")
- (string :tag "Declaration")))))
- (defcustom org-export-e-html-style-include-scripts t
- "Non-nil means include the JavaScript snippets in exported HTML files.
- The actual script is defined in `org-export-e-html-scripts' and should
- not be modified."
- :group 'org-export-e-html
- :type 'boolean)
- (defconst org-export-e-html-scripts
- "<script type=\"text/javascript\">
- <!--/*--><![CDATA[/*><!--*/
- function CodeHighlightOn(elem, id)
- {
- var target = document.getElementById(id);
- if(null != target) {
- elem.cacheClassElem = elem.className;
- elem.cacheClassTarget = target.className;
- target.className = \"code-highlighted\";
- elem.className = \"code-highlighted\";
- }
- }
- function CodeHighlightOff(elem, id)
- {
- var target = document.getElementById(id);
- if(elem.cacheClassElem)
- elem.className = elem.cacheClassElem;
- if(elem.cacheClassTarget)
- target.className = elem.cacheClassTarget;
- }
- /*]]>*///-->
- </script>"
- "Basic JavaScript that is needed by HTML files produced by Org-mode.")
- (defconst org-export-e-html-style-default
- "<style type=\"text/css\">
- <!--/*--><![CDATA[/*><!--*/
- html { font-family: Times, serif; font-size: 12pt; }
- .title { text-align: center; }
- .todo { color: red; }
- .done { color: green; }
- .tag { background-color: #add8e6; font-weight:normal }
- .target { }
- .timestamp { color: #bebebe; }
- .timestamp-kwd { color: #5f9ea0; }
- .right {margin-left:auto; margin-right:0px; text-align:right;}
- .left {margin-left:0px; margin-right:auto; text-align:left;}
- .center {margin-left:auto; margin-right:auto; text-align:center;}
- p.verse { margin-left: 3% }
- pre {
- border: 1pt solid #AEBDCC;
- background-color: #F3F5F7;
- padding: 5pt;
- font-family: courier, monospace;
- font-size: 90%;
- overflow:auto;
- }
- table { border-collapse: collapse; }
- td, th { vertical-align: top; }
- th.right { text-align:center; }
- th.left { text-align:center; }
- th.center { text-align:center; }
- td.right { text-align:right; }
- td.left { text-align:left; }
- td.center { text-align:center; }
- dt { font-weight: bold; }
- div.figure { padding: 0.5em; }
- div.figure p { text-align: center; }
- div.inlinetask {
- padding:10px;
- border:2px solid gray;
- margin:10px;
- background: #ffffcc;
- }
- textarea { overflow-x: auto; }
- .linenr { font-size:smaller }
- .code-highlighted {background-color:#ffff00;}
- .org-info-js_info-navigation { border-style:none; }
- #org-info-js_console-label { font-size:10px; font-weight:bold;
- white-space:nowrap; }
- .org-info-js_search-highlight {background-color:#ffff00; color:#000000;
- font-weight:bold; }
- /*]]>*/-->
- </style>"
- "The default style specification for exported HTML files.
- Please use the variables `org-export-e-html-style' and
- `org-export-e-html-style-extra' to add to this style. If you wish to not
- have the default style included, customize the variable
- `org-export-e-html-style-include-default'.")
- (defcustom org-export-e-html-style-include-default t
- "Non-nil means include the default style in exported HTML files.
- The actual style is defined in `org-export-e-html-style-default' and should
- not be modified. Use the variables `org-export-e-html-style' to add
- your own style information."
- :group 'org-export-e-html
- :type 'boolean)
- ;;;###autoload
- (put 'org-export-e-html-style-include-default 'safe-local-variable 'booleanp)
- (defcustom org-export-e-html-style ""
- "Org-wide style definitions for exported HTML files.
- This variable needs to contain the full HTML structure to provide a style,
- including the surrounding HTML tags. If you set the value of this variable,
- you should consider to include definitions for the following classes:
- title, todo, done, timestamp, timestamp-kwd, tag, target.
- For example, a valid value would be:
- <style type=\"text/css\">
- <![CDATA[
- p { font-weight: normal; color: gray; }
- h1 { color: black; }
- .title { text-align: center; }
- .todo, .timestamp-kwd { color: red; }
- .done { color: green; }
- ]]>
- </style>
- If you'd like to refer to an external style file, use something like
- <link rel=\"stylesheet\" type=\"text/css\" href=\"mystyles.css\">
- As the value of this option simply gets inserted into the HTML <head> header,
- you can \"misuse\" it to add arbitrary text to the header.
- See also the variable `org-export-e-html-style-extra'."
- :group 'org-export-e-html
- :type 'string)
- ;;;###autoload
- (put 'org-export-e-html-style 'safe-local-variable 'stringp)
- (defcustom org-export-e-html-style-extra ""
- "Additional style information for HTML export.
- The value of this variable is inserted into the HTML buffer right after
- the value of `org-export-e-html-style'. Use this variable for per-file
- settings of style information, and do not forget to surround the style
- settings with <style>...</style> tags."
- :group 'org-export-e-html
- :type 'string)
- ;;;###autoload
- (put 'org-export-e-html-style-extra 'safe-local-variable 'stringp)
- (defcustom org-export-e-html-mathjax-options
- '((path "http://orgmode.org/mathjax/MathJax.js")
- (scale "100")
- (align "center")
- (indent "2em")
- (mathml nil))
- "Options for MathJax setup.
- path The path where to find MathJax
- scale Scaling for the HTML-CSS backend, usually between 100 and 133
- align How to align display math: left, center, or right
- indent If align is not center, how far from the left/right side?
- mathml Should a MathML player be used if available?
- This is faster and reduces bandwidth use, but currently
- sometimes has lower spacing quality. Therefore, the default is
- nil. When browsers get better, this switch can be flipped.
- You can also customize this for each buffer, using something like
- #+MATHJAX: scale:\"133\" align:\"right\" mathml:t path:\"/MathJax/\""
- :group 'org-export-e-html
- :type '(list :greedy t
- (list :tag "path (the path from where to load MathJax.js)"
- (const :format " " path) (string))
- (list :tag "scale (scaling for the displayed math)"
- (const :format " " scale) (string))
- (list :tag "align (alignment of displayed equations)"
- (const :format " " align) (string))
- (list :tag "indent (indentation with left or right alignment)"
- (const :format " " indent) (string))
- (list :tag "mathml (should MathML display be used is possible)"
- (const :format " " mathml) (boolean))))
- (defun org-export-e-html-mathjax-config (template options in-buffer)
- "Insert the user setup into the matchjax template."
- (let (name val (yes " ") (no "// ") x)
- (mapc
- (lambda (e)
- (setq name (car e) val (nth 1 e))
- (if (string-match (concat "\\<" (symbol-name name) ":") in-buffer)
- (setq val (car (read-from-string
- (substring in-buffer (match-end 0))))))
- (if (not (stringp val)) (setq val (format "%s" val)))
- (if (string-match (concat "%" (upcase (symbol-name name))) template)
- (setq template (replace-match val t t template))))
- options)
- (setq val (nth 1 (assq 'mathml options)))
- (if (string-match (concat "\\<mathml:") in-buffer)
- (setq val (car (read-from-string
- (substring in-buffer (match-end 0))))))
- ;; Exchange prefixes depending on mathml setting
- (if (not val) (setq x yes yes no no x))
- ;; Replace cookies to turn on or off the config/jax lines
- (if (string-match ":MMLYES:" template)
- (setq template (replace-match yes t t template)))
- (if (string-match ":MMLNO:" template)
- (setq template (replace-match no t t template)))
- ;; Return the modified template
- template))
- (defcustom org-export-e-html-mathjax-template
- "<script type=\"text/javascript\" src=\"%PATH\">
- <!--/*--><![CDATA[/*><!--*/
- MathJax.Hub.Config({
- // Only one of the two following lines, depending on user settings
- // First allows browser-native MathML display, second forces HTML/CSS
- :MMLYES: config: [\"MMLorHTML.js\"], jax: [\"input/TeX\"],
- :MMLNO: jax: [\"input/TeX\", \"output/HTML-CSS\"],
- extensions: [\"tex2jax.js\",\"TeX/AMSmath.js\",\"TeX/AMSsymbols.js\",
- \"TeX/noUndefined.js\"],
- tex2jax: {
- inlineMath: [ [\"\\\\(\",\"\\\\)\"] ],
- displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"], [\"\\\\begin{displaymath}\",\"\\\\end{displaymath}\"] ],
- skipTags: [\"script\",\"noscript\",\"style\",\"textarea\",\"pre\",\"code\"],
- ignoreClass: \"tex2jax_ignore\",
- processEscapes: false,
- processEnvironments: true,
- preview: \"TeX\"
- },
- showProcessingMessages: true,
- displayAlign: \"%ALIGN\",
- displayIndent: \"%INDENT\",
- \"HTML-CSS\": {
- scale: %SCALE,
- availableFonts: [\"STIX\",\"TeX\"],
- preferredFont: \"TeX\",
- webFont: \"TeX\",
- imageFont: \"TeX\",
- showMathMenu: true,
- },
- MMLorHTML: {
- prefer: {
- MSIE: \"MML\",
- Firefox: \"MML\",
- Opera: \"HTML\",
- other: \"HTML\"
- }
- }
- });
- /*]]>*///-->
- </script>"
- "The MathJax setup for XHTML files."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-export-e-html-tag-class-prefix ""
- "Prefix to class names for TODO keywords.
- Each tag gets a class given by the tag itself, with this prefix.
- The default prefix is empty because it is nice to just use the keyword
- as a class name. But if you get into conflicts with other, existing
- CSS classes, then this prefix can be very useful."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-export-e-html-todo-kwd-class-prefix ""
- "Prefix to class names for TODO keywords.
- Each TODO keyword gets a class given by the keyword itself, with this prefix.
- The default prefix is empty because it is nice to just use the keyword
- as a class name. But if you get into conflicts with other, existing
- CSS classes, then this prefix can be very useful."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-export-e-html-preamble t
- "Non-nil means insert a preamble in HTML export.
- When `t', insert a string as defined by one of the formatting
- strings in `org-export-e-html-preamble-format'. When set to a
- string, this string overrides `org-export-e-html-preamble-format'.
- When set to a function, apply this function and insert the
- returned string. The function takes the property list of export
- options as its only argument.
- Setting :html-preamble in publishing projects will take
- precedence over this variable."
- :group 'org-export-e-html
- :type '(choice (const :tag "No preamble" nil)
- (const :tag "Default preamble" t)
- (string :tag "Custom formatting string")
- (function :tag "Function (must return a string)")))
- (defcustom org-export-e-html-preamble-format '(("en" ""))
- "The format for the HTML preamble.
- %t stands for the title.
- %a stands for the author's name.
- %e stands for the author's email.
- %d stands for the date.
- If you need to use a \"%\" character, you need to escape it
- like that: \"%%\"."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-export-e-html-postamble 'auto
- "Non-nil means insert a postamble in HTML export.
- When `t', insert a string as defined by the formatting string in
- `org-export-e-html-postamble-format'. When set to a string, this
- string overrides `org-export-e-html-postamble-format'. When set to
- 'auto, discard `org-export-e-html-postamble-format' and honor
- `org-export-author/email/creator-info' variables. When set to a
- function, apply this function and insert the returned string.
- The function takes the property list of export options as its
- only argument.
- Setting :html-postamble in publishing projects will take
- precedence over this variable."
- :group 'org-export-e-html
- :type '(choice (const :tag "No postamble" nil)
- (const :tag "Auto preamble" 'auto)
- (const :tag "Default formatting string" t)
- (string :tag "Custom formatting string")
- (function :tag "Function (must return a string)")))
- (defcustom org-export-e-html-postamble-format
- '(("en" "<p class=\"author\">Author: %a (%e)</p>
- <p class=\"date\">Date: %d</p>
- <p class=\"creator\">Generated by %c</p>
- <p class=\"xhtml-validation\">%v</p>
- "))
- "The format for the HTML postamble.
- %a stands for the author's name.
- %e stands for the author's email.
- %d stands for the date.
- %c will be replaced by information about Org/Emacs versions.
- %v will be replaced by `org-export-e-html-validation-link'.
- If you need to use a \"%\" character, you need to escape it
- like that: \"%%\"."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-export-e-html-home/up-format
- "<div id=\"org-div-home-and-up\" style=\"text-align:right;font-size:70%%;white-space:nowrap;\">
- <a accesskey=\"h\" href=\"%s\"> UP </a>
- |
- <a accesskey=\"H\" href=\"%s\"> HOME </a>
- </div>"
- "Snippet used to insert the HOME and UP links.
- This is a format string, the first %s will receive the UP link,
- the second the HOME link. If both `org-export-e-html-link-up' and
- `org-export-e-html-link-home' are empty, the entire snippet will be
- ignored."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-export-e-html-toplevel-hlevel 2
- "The <H> level for level 1 headings in HTML export.
- This is also important for the classes that will be wrapped around headlines
- and outline structure. If this variable is 1, the top-level headlines will
- be <h1>, and the corresponding classes will be outline-1, section-number-1,
- and outline-text-1. If this is 2, all of these will get a 2 instead.
- The default for this variable is 2, because we use <h1> for formatting the
- document title."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-export-e-html-link-org-files-as-html t
- "Non-nil means make file links to `file.org' point to `file.html'.
- When org-mode is exporting an org-mode file to HTML, links to
- non-html files are directly put into a href tag in HTML.
- However, links to other Org-mode files (recognized by the
- extension `.org.) should become links to the corresponding html
- file, assuming that the linked org-mode file will also be
- converted to HTML.
- When nil, the links still point to the plain `.org' file."
- :group 'org-export-e-html
- :type 'boolean)
- (defcustom org-export-e-html-inline-images 'maybe
- "Non-nil means inline images into exported HTML pages.
- This is done using an <img> tag. When nil, an anchor with href is used to
- link to the image. If this option is `maybe', then images in links with
- an empty description will be inlined, while images with a description will
- be linked only."
- :group 'org-export-e-html
- :type '(choice (const :tag "Never" nil)
- (const :tag "Always" t)
- (const :tag "When there is no description" maybe)))
- (defcustom org-export-e-html-inline-image-extensions
- '("png" "jpeg" "jpg" "gif" "svg")
- "Extensions of image files that can be inlined into HTML."
- :group 'org-export-e-html
- :type '(repeat (string :tag "Extension")))
- (defcustom org-export-e-html-table-tag
- "<table border=\"2\" cellspacing=\"0\" cellpadding=\"6\" rules=\"groups\" frame=\"hsides\">"
- "The HTML tag that is used to start a table.
- This must be a <table> tag, but you may change the options like
- borders and spacing."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-export-table-header-tags '("<th scope=\"%s\"%s>" . "</th>")
- "The opening tag for table header fields.
- This is customizable so that alignment options can be specified.
- The first %s will be filled with the scope of the field, either row or col.
- The second %s will be replaced by a style entry to align the field.
- See also the variable `org-export-e-html-table-use-header-tags-for-first-column'.
- See also the variable `org-export-e-html-table-align-individual-fields'."
- :group 'org-export-tables
- :type '(cons (string :tag "Opening tag") (string :tag "Closing tag")))
- (defcustom org-export-table-data-tags '("<td%s>" . "</td>")
- "The opening tag for table data fields.
- This is customizable so that alignment options can be specified.
- The first %s will be filled with the scope of the field, either row or col.
- The second %s will be replaced by a style entry to align the field.
- See also the variable `org-export-e-html-table-align-individual-fields'."
- :group 'org-export-tables
- :type '(cons (string :tag "Opening tag") (string :tag "Closing tag")))
- (defcustom org-export-table-row-tags '("<tr>" . "</tr>")
- "The opening tag for table data fields.
- This is customizable so that alignment options can be specified.
- Instead of strings, these can be Lisp forms that will be evaluated
- for each row in order to construct the table row tags. During evaluation,
- the variable `head' will be true when this is a header line, nil when this
- is a body line. And the variable `nline' will contain the line number,
- starting from 1 in the first header line. For example
- (setq org-export-table-row-tags
- (cons '(if head
- \"<tr>\"
- (if (= (mod nline 2) 1)
- \"<tr class=\\\"tr-odd\\\">\"
- \"<tr class=\\\"tr-even\\\">\"))
- \"</tr>\"))
- will give even lines the class \"tr-even\" and odd lines the class \"tr-odd\"."
- :group 'org-export-tables
- :type '(cons
- (choice :tag "Opening tag"
- (string :tag "Specify")
- (sexp))
- (choice :tag "Closing tag"
- (string :tag "Specify")
- (sexp))))
- (defcustom org-export-e-html-table-align-individual-fields t
- "Non-nil means attach style attributes for alignment to each table field.
- When nil, alignment will only be specified in the column tags, but this
- is ignored by some browsers (like Firefox, Safari). Opera does it right
- though."
- :group 'org-export-tables
- :type 'boolean)
- (defcustom org-export-e-html-table-use-header-tags-for-first-column nil
- "Non-nil means format column one in tables with header tags.
- When nil, also column one will use data tags."
- :group 'org-export-tables
- :type 'boolean)
- (defcustom org-export-e-html-validation-link
- "<a href=\"http://validator.w3.org/check?uri=referer\">Validate XHTML 1.0</a>"
- "Link to HTML validation service."
- :group 'org-export-e-html
- :type 'string)
- ;; FIXME Obsolete since Org 7.7
- ;; Use the :timestamp option or `org-export-time-stamp-file' instead
- (defvar org-export-e-html-with-timestamp nil
- "If non-nil, write container for HTML-helper-mode timestamp.")
- ;; FIXME Obsolete since Org 7.7
- (defvar org-export-e-html-html-helper-timestamp
- "\n<p><br/><br/>\n<!-- hhmts start --> <!-- hhmts end --></p>\n"
- "The HTML tag used as timestamp delimiter for HTML-helper-mode.")
- (defcustom org-export-e-html-protect-char-alist
- '(("&" . "&")
- ("<" . "<")
- (">" . ">"))
- "Alist of characters to be converted by `org-e-html-protect'."
- :group 'org-export-e-html
- :type '(repeat (cons (string :tag "Character")
- (string :tag "HTML equivalent"))))
- (defgroup org-export-e-htmlize nil
- "Options for processing examples with htmlize.el."
- :tag "Org Export Htmlize"
- :group 'org-export-e-html)
- (defcustom org-export-e-htmlize-output-type 'inline-css
- "Output type to be used by htmlize when formatting code snippets.
- Choices are `css', to export the CSS selectors only, or `inline-css', to
- export the CSS attribute values inline in the HTML. We use as default
- `inline-css', in order to make the resulting HTML self-containing.
- However, this will fail when using Emacs in batch mode for export, because
- then no rich font definitions are in place. It will also not be good if
- people with different Emacs setup contribute HTML files to a website,
- because the fonts will represent the individual setups. In these cases,
- it is much better to let Org/Htmlize assign classes only, and to use
- a style file to define the look of these classes.
- To get a start for your css file, start Emacs session and make sure that
- all the faces you are interested in are defined, for example by loading files
- in all modes you want. Then, use the command
- \\[org-export-e-htmlize-generate-css] to extract class definitions."
- :group 'org-export-e-htmlize
- :type '(choice (const css) (const inline-css)))
- (defcustom org-export-e-htmlize-css-font-prefix "org-"
- "The prefix for CSS class names for htmlize font specifications."
- :group 'org-export-e-htmlize
- :type 'string)
- (defcustom org-export-e-htmlized-org-css-url nil
- "URL pointing to a CSS file defining text colors for htmlized Emacs buffers.
- Normally when creating an htmlized version of an Org buffer, htmlize will
- create CSS to define the font colors. However, this does not work when
- converting in batch mode, and it also can look bad if different people
- with different fontification setup work on the same website.
- When this variable is non-nil, creating an htmlized version of an Org buffer
- using `org-export-as-org' will remove the internal CSS section and replace it
- with a link to this URL."
- :group 'org-export-e-htmlize
- :type '(choice
- (const :tag "Keep internal css" nil)
- (string :tag "URL or local href")))
- ;; FIXME: The following variable is obsolete since Org 7.7 but is
- ;; still declared and checked within code for compatibility reasons.
- ;; Use the custom variables `org-export-e-html-divs' instead.
- (defvar org-export-e-html-content-div "content"
- "The name of the container DIV that holds all the page contents.
- This variable is obsolete since Org version 7.7.
- Please set `org-export-e-html-divs' instead.")
- (defcustom org-export-e-html-divs '("preamble" "content" "postamble")
- "The name of the main divs for HTML export.
- This is a list of three strings, the first one for the preamble
- DIV, the second one for the content DIV and the third one for the
- postamble DIV."
- :group 'org-export-e-html
- :type '(list
- (string :tag " Div for the preamble:")
- (string :tag " Div for the content:")
- (string :tag "Div for the postamble:")))
- ;;; Hooks
- (defvar org-export-e-html-after-blockquotes-hook nil
- "Hook run during HTML export, after blockquote, verse, center are done.")
- (defvar org-export-e-html-final-hook nil
- "Hook run at the end of HTML export, in the new buffer.")
- (defun org-export-e-html-preprocess-latex-fragments ()
- (when (equal org-lparse-backend 'html)
- (org-export-e-html-do-preprocess-latex-fragments)))
- (defvar org-lparse-opt-plist) ; bound during org-do-lparse
- (defun org-export-e-html-do-preprocess-latex-fragments ()
- "Convert HTML fragments to images."
- (let* ((latex-frag-opt (plist-get org-lparse-opt-plist :HTML-fragments))
- (latex-frag-opt-1 ; massage the options
- (cond
- ((eq latex-frag-opt 'verbatim) 'verbatim)
- ((eq latex-frag-opt 'mathjax ) 'mathjax)
- ((eq latex-frag-opt t ) 'mathjax)
- ((eq latex-frag-opt 'dvipng ) 'dvipng)
- (t nil))))
- (when (and org-current-export-file latex-frag-opt)
- (org-format-latex
- (concat "ltxpng/" (file-name-sans-extension
- (file-name-nondirectory
- org-current-export-file)))
- org-current-export-dir nil "Creating HTML image %s"
- nil nil latex-frag-opt-1))))
- (defun org-export-e-html-preprocess-label-references ()
- (goto-char (point-min))
- (let (label l1)
- (while (re-search-forward "\\\\ref{\\([^{}\n]+\\)}" nil t)
- (org-if-unprotected-at (match-beginning 1)
- (setq label (match-string 1))
- (save-match-data
- (if (string-match "\\`[a-z]\\{1,10\\}:\\(.+\\)" label)
- (setq l1 (substring label (match-beginning 1)))
- (setq l1 label)))
- (replace-match (format "[[#%s][%s]]" label l1) t t)))))
- (defun org-export-e-html-preprocess (parameters)
- (org-export-e-html-preprocess-label-references))
- ;; Process latex fragments as part of
- ;; `org-export-preprocess-after-blockquote-hook'. Note that this hook
- ;; is the one that is closest and well before the call to
- ;; `org-export-attach-captions-and-attributes' in
- ;; `org-export-preprocess-stirng'. The above arrangement permits
- ;; captions, labels and attributes to be attached to png images
- ;; generated out of latex equations.
- (add-hook 'org-export-preprocess-after-blockquote-hook
- 'org-export-e-html-preprocess-latex-fragments)
- (defvar html-table-tag nil) ; dynamically scoped into this.
- ;; FIXME: it already exists in org-e-html.el
- (defconst org-e-html-cvt-link-fn
- nil
- "Function to convert link URLs to exportable URLs.
- Takes two arguments, TYPE and PATH.
- Returns exportable url as (TYPE PATH), or nil to signal that it
- didn't handle this case.
- Intended to be locally bound around a call to `org-export-as-html'." )
- ;; FIXME: it already exists in org-e-html.el
- (defun org-e-html-cvt-org-as-html (opt-plist type path)
- "Convert an org filename to an equivalent html filename.
- If TYPE is not file, just return `nil'.
- See variable `org-export-e-html-link-org-files-as-html'"
- (save-match-data
- (and
- org-export-e-html-link-org-files-as-html
- (string= type "file")
- (string-match "\\.org$" path)
- (progn
- (list
- "file"
- (concat
- (substring path 0 (match-beginning 0))
- "."
- (plist-get opt-plist :html-extension)))))))
- (defun org-e-html-format-org-link (opt-plist type-1 path fragment desc attr
- descp)
- "Make an HTML link.
- OPT-PLIST is an options list.
- TYPE is the device-type of the link (THIS://foo.html).
- PATH is the path of the link (http://THIS#location).
- FRAGMENT is the fragment part of the link, if any (foo.html#THIS).
- DESC is the link description, if any.
- ATTR is a string of other attributes of the \"a\" element."
- (declare (special org-lparse-par-open))
- (save-match-data
- (when (string= type-1 "coderef")
- (let ((ref fragment))
- (setq desc (format (org-export-get-coderef-format ref (and descp desc))
- (cdr (assoc ref org-export-code-refs)))
- fragment (concat "coderef-" ref)
- attr (format "class=\"coderef\" onmouseover=\"CodeHighlightOn(this, '%s');\" onmouseout=\"CodeHighlightOff(this, '%s');\""
- fragment fragment))))
- (let* ((may-inline-p
- (and (member type-1 '("http" "https" "file"))
- (org-lparse-should-inline-p path descp)
- (not fragment)))
- (type (if (equal type-1 "id") "file" type-1))
- (filename path)
- ;;First pass. Just sanity stuff.
- (components-1
- (cond
- ((string= type "file")
- (list
- type
- ;;Substitute just if original path was absolute.
- ;;(Otherwise path must remain relative)
- (if (file-name-absolute-p path)
- (concat "file://" (expand-file-name path))
- path)))
- ((string= type "")
- (list nil path))
- (t (list type path))))
- ;;Second pass. Components converted so they can refer
- ;;to a remote site.
- (components-2
- (or
- (and org-e-html-cvt-link-fn
- (apply org-e-html-cvt-link-fn
- opt-plist components-1))
- (apply #'org-e-html-cvt-org-as-html
- opt-plist components-1)
- components-1))
- (type (first components-2))
- (thefile (second components-2)))
- ;;Third pass. Build final link except for leading type
- ;;spec.
- (cond
- ((or
- (not type)
- (string= type "http")
- (string= type "https")
- (string= type "file")
- (string= type "coderef"))
- (if fragment
- (setq thefile (concat thefile "#" fragment))))
- (t))
- ;;Final URL-build, for all types.
- (setq thefile
- (let
- ((str (org-xml-format-href thefile)))
- (if (and type (not (or (string= "file" type)
- (string= "coderef" type))))
- (concat type ":" str)
- str)))
- (if may-inline-p
- (org-e-html-format-image thefile)
- (org-lparse-format
- 'LINK (org-xml-format-desc desc) thefile attr)))))
- (defun org-e-html-format-inline-image (path &optional caption label attr)
- ;; FIXME: alt text missing here?
- (let ((inline-image (format "<img src=\"%s\" alt=\"%s\"/>"
- path (file-name-nondirectory path))))
- (if (not label) inline-image
- (org-e-html-format-section inline-image "figure" label))))
- ;; FIXME: the org-lparse defvar belongs to org-lparse.el
- (defvar org-lparse-link-description-is-image)
- (defun org-e-html-format-image (src)
- "Create image tag with source and attributes."
- (save-match-data
- (let* ((caption (org-find-text-property-in-string 'org-caption src))
- (attr (org-find-text-property-in-string 'org-attributes src))
- (label (org-find-text-property-in-string 'org-label src))
- (caption (and caption (org-xml-encode-org-text caption)))
- (img-extras (if (string-match "^ltxpng/" src)
- (format " alt=\"%s\""
- (org-find-text-property-in-string
- 'org-latex-src src))
- (if (string-match "\\<alt=" (or attr ""))
- (concat " " attr )
- (concat " " attr " alt=\"" src "\""))))
- (img (format "<img src=\"%s\"%s />" src img-extras))
- (extra (concat
- (and label
- (format "id=\"%s\" " (org-solidify-link-text label)))
- "class=\"figure\"")))
- (if caption
- (with-temp-buffer
- (with-org-lparse-preserve-paragraph-state
- (insert
- (org-lparse-format
- '("<div %s>" . "\n</div>")
- (concat
- (org-lparse-format '("\n<p>" . "</p>") img)
- (org-lparse-format '("\n<p>" . "</p>") caption))
- extra)))
- (buffer-string))
- img))))
- (defun org-export-e-html-get-bibliography ()
- "Find bibliography, cut it out and return it."
- (catch 'exit
- (let (beg end (cnt 1) bib)
- (save-excursion
- (goto-char (point-min))
- (when (re-search-forward "^[ \t]*<div \\(id\\|class\\)=\"bibliography\"" nil t)
- (setq beg (match-beginning 0))
- (while (re-search-forward "</?div\\>" nil t)
- (setq cnt (+ cnt (if (string= (match-string 0) "<div") +1 -1)))
- (when (= cnt 0)
- (and (looking-at ">") (forward-char 1))
- (setq bib (buffer-substring beg (point)))
- (delete-region beg (point))
- (throw 'exit bib))))
- nil))))
- (defmacro with-org-lparse-backend (backend &rest body)
- `(let* ((org-lparse-backend ,backend)
- (org-lparse-entity-control-callbacks-alist
- (org-lparse-get 'ENTITY-CONTROL))
- (org-lparse-entity-format-callbacks-alist
- (org-lparse-get 'ENTITY-FORMAT)))
- ,@body))
- (defun org-e-html-format-table (lines olines)
- (let ((org-e-html-format-table-no-css nil))
- (org-lparse-format-table lines olines)))
- ;; Following variable is defined for native tables i.e., when
- ;; `org-lparse-table-is-styled' evals to t.
- (defvar org-e-html-format-table-no-css)
- (defvar org-table-number-regexp) ; defined in org-table.el
- (defun org-format-table-html (lines olines &optional no-css)
- "Find out which HTML converter to use and return the HTML code.
- NO-CSS is passed to the exporter."
- (with-org-lparse-backend
- 'html (let* ((org-e-html-format-table-no-css no-css))
- (org-lparse-format-table lines olines))))
- (defun org-format-org-table-html (lines &optional splice no-css)
- (with-org-lparse-backend
- 'html (let* ((org-e-html-format-table-no-css no-css))
- (org-lparse-format-org-table lines splice))))
- (defun org-export-splice-attributes (tag attributes)
- "Read attributes in string ATTRIBUTES, add and replace in HTML tag TAG."
- (if (not attributes)
- tag
- (let (oldatt newatt)
- (setq oldatt (org-extract-attributes-from-string tag)
- tag (pop oldatt)
- newatt (cdr (org-extract-attributes-from-string attributes)))
- (while newatt
- (setq oldatt (plist-put oldatt (pop newatt) (pop newatt))))
- (if (string-match ">" tag)
- (setq tag
- (replace-match (concat (org-attributes-to-string oldatt) ">")
- t t tag)))
- tag)))
- (defun org-format-table-table-html (lines)
- (with-org-lparse-backend
- 'html (org-lparse-format-table-table lines)))
- (defun org-export-splice-style (style extra)
- "Splice EXTRA into STYLE, just before \"</style>\"."
- (if (and (stringp extra)
- (string-match "\\S-" extra)
- (string-match "</style>" style))
- (concat (substring style 0 (match-beginning 0))
- "\n" extra "\n"
- (substring style (match-beginning 0)))
- style))
- (defvar htmlize-buffer-places) ; from htmlize.el
- (defun org-export-e-htmlize-region-for-paste (beg end)
- "Convert the region to HTML, using htmlize.el.
- This is much like `htmlize-region-for-paste', only that it uses
- the settings define in the org-... variables."
- (let* ((htmlize-output-type org-export-e-htmlize-output-type)
- (htmlize-css-name-prefix org-export-e-htmlize-css-font-prefix)
- (htmlbuf (htmlize-region beg end)))
- (unwind-protect
- (with-current-buffer htmlbuf
- (buffer-substring (plist-get htmlize-buffer-places 'content-start)
- (plist-get htmlize-buffer-places 'content-end)))
- (kill-buffer htmlbuf))))
- ;;;###autoload
- (defun org-export-e-htmlize-generate-css ()
- "Create the CSS for all font definitions in the current Emacs session.
- Use this to create face definitions in your CSS style file that can then
- be used by code snippets transformed by htmlize.
- This command just produces a buffer that contains class definitions for all
- faces used in the current Emacs session. You can copy and paste the ones you
- need into your CSS file.
- If you then set `org-export-e-htmlize-output-type' to `css', calls to
- the function `org-export-e-htmlize-region-for-paste' will produce code
- that uses these same face definitions."
- (interactive)
- (require 'htmlize)
- (and (get-buffer "*html*") (kill-buffer "*html*"))
- (with-temp-buffer
- (let ((fl (face-list))
- (htmlize-css-name-prefix "org-")
- (htmlize-output-type 'css)
- f i)
- (while (setq f (pop fl)
- i (and f (face-attribute f :inherit)))
- (when (and (symbolp f) (or (not i) (not (listp i))))
- (insert (org-add-props (copy-sequence "1") nil 'face f))))
- (htmlize-region (point-min) (point-max))))
- (org-pop-to-buffer-same-window "*html*")
- (goto-char (point-min))
- (if (re-search-forward "<style" nil t)
- (delete-region (point-min) (match-beginning 0)))
- (if (re-search-forward "</style>" nil t)
- (delete-region (1+ (match-end 0)) (point-max)))
- (beginning-of-line 1)
- (if (looking-at " +") (replace-match ""))
- (goto-char (point-min)))
- (defvar body-only) ; dynamically scoped into this.
- ;; Following variable is let bound when `org-do-lparse' is in
- ;; progress. See org-lparse.el.
- ;; FIXME: the org-lparse defvar belongs to org-lparse.el
- (defvar org-lparse-toc)
- (defvar org-lparse-footnote-definitions)
- (defvar org-lparse-dyn-first-heading-pos)
- (defun org-e-html-end-export ()
- ;; insert the table of contents
- (when (and org-export-with-toc (not body-only) org-lparse-toc)
- (org-e-html-insert-toc org-lparse-toc))
- ;; remove empty paragraphs
- (goto-char (point-min))
- (while (re-search-forward "<p>[ \r\n\t]*</p>" nil t)
- (replace-match ""))
- ;; Convert whitespace place holders
- (goto-char (point-min))
- (let (beg end n)
- (while (setq beg (next-single-property-change (point) 'org-whitespace))
- (setq n (get-text-property beg 'org-whitespace)
- end (next-single-property-change beg 'org-whitespace))
- (goto-char beg)
- (delete-region beg end)
- (insert (format "<span style=\"visibility:hidden;\">%s</span>"
- (make-string n ?x)))))
- ;; Remove empty lines at the beginning of the file.
- (goto-char (point-min))
- (when (looking-at "\\s-+\n") (replace-match ""))
- ;; Remove display properties
- (remove-text-properties (point-min) (point-max) '(display t))
- ;; Run the hook
- (run-hooks 'org-export-e-html-final-hook))
- (defun org-e-html-format-toc-entry (snumber todo headline tags href)
- (setq headline (concat
- (and org-export-with-section-numbers
- (concat snumber " "))
- headline
- (and tags
- (concat
- (org-lparse-format 'SPACES 3)
- (org-lparse-format 'FONTIFY tags "tag")))))
- (when todo
- (setq headline (org-lparse-format 'FONTIFY headline "todo")))
- (org-lparse-format 'LINK headline (concat "#" href)))
- (defun org-e-html-format-toc-item (toc-entry level org-last-level)
- (when (> level org-last-level)
- (let ((cnt (- level org-last-level)))
- (while (>= (setq cnt (1- cnt)) 0)
- (org-lparse-begin-list 'unordered)
- (org-lparse-begin-list-item 'unordered))))
- (when (< level org-last-level)
- (let ((cnt (- org-last-level level)))
- (while (>= (setq cnt (1- cnt)) 0)
- (org-lparse-end-list-item-1)
- (org-lparse-end-list 'unordered))))
- (org-lparse-end-list-item-1)
- (org-lparse-begin-list-item 'unordered)
- (insert toc-entry))
- (defun org-e-html-begin-toc (lang-specific-heading max-level)
- (org-lparse-insert-tag "<div id=\"table-of-contents\">")
- (insert
- (org-lparse-format 'HEADING lang-specific-heading
- (or (org-lparse-get 'TOPLEVEL-HLEVEL) 1)))
- (org-lparse-insert-tag "<div id=\"text-table-of-contents\">")
- (org-lparse-begin-list 'unordered)
- (org-lparse-begin-list-item 'unordered))
- (defun org-e-html-end-toc ()
- (while (> org-last-level (1- org-min-level))
- (setq org-last-level (1- org-last-level))
- (org-lparse-end-list-item-1)
- (org-lparse-end-list 'unordered))
- (org-lparse-insert-tag "</div>")
- (org-lparse-insert-tag "</div>")
- ;; cleanup empty list items in toc
- (while (re-search-backward "<li>[ \r\n\t]*</li>\n?" (point-min) t)
- (replace-match "")))
- ;;;###autoload
- ;; (defun org-export-as-html-and-open (arg)
- ;; "Export the outline as HTML and immediately open it with a browser.
- ;; If there is an active region, export only the region.
- ;; The prefix ARG specifies how many levels of the outline should become
- ;; headlines. The default is 3. Lower levels will become bulleted lists."
- ;; (interactive "P")
- ;; (org-lparse-and-open "html" "html" arg))
- ;;;###autoload
- ;; (defun org-export-as-html-batch ()
- ;; "Call the function `org-lparse-batch'.
- ;; This function can be used in batch processing as:
- ;; emacs --batch
- ;; --load=$HOME/lib/emacs/org.el
- ;; --eval \"(setq org-export-headline-levels 2)\"
- ;; --visit=MyFile --funcall org-export-as-html-batch"
- ;; (org-lparse-batch "html"))
- ;;;###autoload
- ;; (defun org-export-as-html-to-buffer (arg)
- ;; "Call `org-lparse-to-buffer` with output to a temporary buffer.
- ;; No file is created. The prefix ARG is passed through to `org-lparse-to-buffer'."
- ;; (interactive "P")
- ;; (org-lparse-to-buffer "html" arg))
- ;;;###autoload
- ;; (defun org-replace-region-by-html (beg end)
- ;; "Assume the current region has org-mode syntax, and convert it to HTML.
- ;; This can be used in any buffer. For example, you could write an
- ;; itemized list in org-mode syntax in an HTML buffer and then use this
- ;; command to convert it."
- ;; (interactive "r")
- ;; (org-replace-region-by "html" beg end))
- ;;;###autoload
- ;; (defun org-export-region-as-html (beg end &optional body-only buffer)
- ;; "Convert region from BEG to END in `org-mode' buffer to HTML.
- ;; If prefix arg BODY-ONLY is set, omit file header, footer, and table of
- ;; contents, and only produce the region of converted text, useful for
- ;; cut-and-paste operations.
- ;; If BUFFER is a buffer or a string, use/create that buffer as a target
- ;; of the converted HTML. If BUFFER is the symbol `string', return the
- ;; produced HTML as a string and leave not buffer behind. For example,
- ;; a Lisp program could call this function in the following way:
- ;; (setq html (org-export-region-as-html beg end t 'string))
- ;; When called interactively, the output buffer is selected, and shown
- ;; in a window. A non-interactive call will only return the buffer."
- ;; (interactive "r\nP")
- ;; (org-lparse-region "html" beg end body-only buffer))
- ;;; org-export-as-html
- ;;;###autoload
- ;; (defun org-export-as-html (arg &optional hidden ext-plist
- ;; to-buffer body-only pub-dir)
- ;; "Export the outline as a pretty HTML file.
- ;; Use `org-lparse' internally to perform the actual export. This
- ;; routine merely binds the TARGET-BACKEND and NATIVE-BACKEND args
- ;; of `org-lparse' to \"html\"."
- ;; (interactive "P")
- ;; (org-lparse "html" "html" arg hidden ext-plist to-buffer body-only pub-dir))
- (defvar org-e-html-entity-control-callbacks-alist
- `((EXPORT
- . (org-e-html-begin-export org-e-html-end-export))
- (DOCUMENT-CONTENT
- . (org-e-html-begin-document-content org-e-html-end-document-content))
- (DOCUMENT-BODY
- . (org-e-html-begin-document-body org-e-html-end-document-body))
- (TOC
- . (org-e-html-begin-toc org-e-html-end-toc))
- (ENVIRONMENT
- . (org-e-html-begin-environment org-e-html-end-environment))
- (FOOTNOTE-DEFINITION
- . (org-e-html-begin-footnote-definition org-e-html-end-footnote-definition))
- (TABLE
- . (org-e-html-begin-table org-e-html-end-table))
- (TABLE-ROWGROUP
- . (org-e-html-begin-table-rowgroup org-e-html-end-table-rowgroup))
- (LIST
- . (org-e-html-begin-list org-e-html-end-list))
- (LIST-ITEM
- . (org-e-html-begin-list-item org-e-html-end-list-item))
- (OUTLINE
- . (org-e-html-begin-outline org-e-html-end-outline))
- (OUTLINE-TEXT
- . (org-e-html-begin-outline-text org-e-html-end-outline-text))
- (PARAGRAPH
- . (org-e-html-begin-paragraph org-e-html-end-paragraph)))
- "Alist of control callbacks registered with the exporter.
- Each element is of the form (ENTITY . (BEGIN-ENTITY-FUNCTION
- END-ENTITY-FUNCTION)). ENTITY is one of PARAGRAPH, LIST etc as
- seen above. BEGIN-ENTITY-FUNCTION and END-ENTITY-FUNCTION are
- functions that get called when the exporter needs to begin or end
- an entity in the currently exported file. The signatures of
- these callbacks are specific to the ENTITY being emitted. These
- callbacks always get called with exported file as the current
- buffer and need to insert the appropriate tags into the current
- buffer. For example, `org-e-html-begin-paragraph' inserts <p> and
- `org-e-html-end-paragraph' inserts </p> in to the current buffer.
- These callbacks are invoked via `org-lparse-begin' and
- `org-lparse-end'.")
- (defvar org-e-html-entity-format-callbacks-alist
- `((EXTRA-TARGETS . org-lparse-format-extra-targets)
- (ORG-TAGS . org-lparse-format-org-tags)
- (SECTION-NUMBER . org-lparse-format-section-number)
- (HEADLINE . org-e-html-format-headline)
- (TOC-ENTRY . org-e-html-format-toc-entry)
- (TOC-ITEM . org-e-html-format-toc-item)
- (TAGS . org-e-html-format-tags)
- (SPACES . org-e-html-format-spaces)
- (TABS . org-e-html-format-tabs)
- (LINE-BREAK . org-e-html-format-line-break)
- (FONTIFY . org-e-html-format-fontify)
- (TODO . org-lparse-format-todo)
- (ORG-LINK . org-e-html-format-org-link)
- (LINK . org-e-html-format-link)
- (INLINE-IMAGE . org-e-html-format-inline-image)
- (HEADING . org-e-html-format-heading)
- (ANCHOR . org-e-html-format-anchor)
- (TABLE . org-e-html-format-table)
- (TABLE-ROW . org-e-html-format-table-row)
- (TABLE-CELL . org-e-html-format-table-cell)
- (FOOTNOTES-SECTION . org-e-html-format-footnotes-section)
- (FOOTNOTE-REFERENCE . org-e-html-format-footnote-reference)
- (HORIZONTAL-LINE . org-e-html-format-horizontal-line)
- (LINE . org-e-html-format-line)
- (COMMENT . org-e-html-format-comment)
- (ORG-ENTITY . org-e-html-format-org-entity))
- "Alist of format callbacks registered with the exporter.
- Each element is of the form (ENTITY . ENTITY-FORMAT-FUNCTION).
- ENTITY is one of LINE, HEADING, COMMENT, LINK, TABLE-ROW etc as
- seen above. ENTITY-FORMAT-FUNCTION is a functions that gets
- called when the exporter needs to format a string in `org-mode'
- buffer in a backend specific way. The signatures of the
- formatting callback is specific to the ENTITY being passed in.
- These callbacks always need to encode the incoming entity in
- backend specific way and return the same. These callbacks do not
- make any modifications to the exporter file. For example,
- `org-e-html-format-table-row' encloses incoming entity in <tr>
- </tr> tags and returns it. See also `org-lparse-format'.")
- (defun org-e-html-unload-function ()
- (org-lparse-unregister-backend 'html)
- (remove-hook 'org-export-preprocess-after-blockquote-hook
- 'org-export-e-html-preprocess-latex-fragments)
- nil)
- (defun org-e-html-begin-body (info)
- )
- (defun org-e-html-begin-document-content (info)
- )
- (defun org-e-html-end-document-content ()
- )
- (defun org-e-html-begin-outline (level1 snumber title tags
- target extra-targets extra-class)
- (let* ((class (format "outline-%d" level1))
- (class (if extra-class (concat class " " extra-class) class))
- (id (format "outline-container-%s"
- (org-lparse-suffix-from-snumber snumber)))
- (extra (concat (when id (format " id=\"%s\"" id))
- (when class (format " class=\"%s\"" class)))))
- (org-lparse-insert-tag "<div%s>" extra)
- (insert
- (org-lparse-format 'HEADING
- (org-lparse-format
- 'HEADLINE title extra-targets tags snumber level1)
- level1 target))))
- (defun org-e-html-end-outline ()
- (org-lparse-insert-tag "</div>"))
- ;; (defun org-e-html-format-heading (text level &optional id)
- ;; (let* ((extra (concat (when id (format " id=\"%s\"" id)))))
- ;; (concat (format "<h%d%s>" level extra) text (format "</h%d>" level))))
- (defun org-e-html-suffix-from-snumber (snumber)
- (let* ((snu (replace-regexp-in-string "\\." "-" snumber))
- (href (cdr (assoc (concat "sec-" snu)
- org-export-preferred-target-alist))))
- (org-solidify-link-text (or href snu))))
- (defun org-e-html-format-outline (contents level1 snumber title
- tags target extra-targets extra-class)
- (let* ((class (format "outline-%d" level1))
- (class (if extra-class (concat class " " extra-class) class))
- (id (and snumber ;; FIXME
- (format "outline-container-%s"
- (org-e-html-suffix-from-snumber snumber))))
- (extra (concat (when id (format " id=\"%s\"" id))
- (when class (format " class=\"%s\"" class)))))
- (concat
- (format "<div%s>\n" extra)
- (org-e-html-format-heading
- (org-e-html-format-headline title extra-targets tags snumber level1)
- level1 target)
- contents
- "</div>")))
- (defun org-e-html-begin-outline-text (level1 snumber extra-class)
- (let* ((class (format "outline-text-%d" level1))
- (class (if extra-class (concat class " " extra-class) class))
- (id (format "text-%s" (org-lparse-suffix-from-snumber snumber)))
- (extra (concat (when id (format " id=\"%s\"" id))
- (when class (format " class=\"%s\"" class)))))
- (org-lparse-insert-tag "<div%s>" extra)))
- (defun org-e-html-end-outline-text ()
- (org-lparse-insert-tag "</div>"))
- (defun org-e-html-begin-paragraph (&optional style)
- (let* ((class (cdr (assoc style '((footnote . "footnote")
- (verse . nil)))))
- (extra (if class (format " class=\"%s\"" class) "")))
- (org-lparse-insert-tag "<p%s>" extra)))
- (defun org-e-html-end-paragraph ()
- (insert "</p>"))
- (defun org-e-html-format-environment (style beg-end)
- (assert (memq style '(blockquote center verse fixedwidth quote native)) t)
- (case style
- (blockquote
- (case beg-end
- (BEGIN
- (org-lparse-end-paragraph)
- (insert "<blockquote>\n")
- (org-lparse-begin-paragraph))
- (END
- (org-lparse-end-paragraph)
- (insert "\n</blockquote>\n")
- (org-lparse-begin-paragraph))))
- (verse
- (case beg-end
- (BEGIN
- (org-lparse-end-paragraph)
- (insert "\n<p class=\"verse\">\n")
- (setq org-lparse-par-open t))
- (END
- (insert "</p>\n")
- (setq org-lparse-par-open nil)
- (org-lparse-begin-paragraph))))
- (center
- (case beg-end
- (BEGIN
- (org-lparse-end-paragraph)
- (insert "\n<div style=\"text-align: center\">")
- (org-lparse-begin-paragraph))
- (END
- (org-lparse-end-paragraph)
- (insert "\n</div>")
- (org-lparse-begin-paragraph))))
- (fixedwidth
- (case beg-end
- (BEGIN
- (org-lparse-end-paragraph)
- (insert "<pre class=\"example\">\n"))
- (END
- (insert "</pre>\n")
- (org-lparse-begin-paragraph))))
- (quote
- (case beg-end
- (BEGIN
- (org-lparse-end-paragraph)
- (insert "<pre>"))
- (END
- (insert "</pre>\n")
- (org-lparse-begin-paragraph))))
- (native
- (case beg-end
- (BEGIN (org-lparse-end-paragraph))
- (END (org-lparse-begin-paragraph))))
- (t (error "Unknown environment %s" style))))
- (defun org-e-html-begin-environment (style env-options-plist)
- (org-e-html-format-environment style 'BEGIN))
- (defun org-e-html-end-environment (style env-options-plist)
- (org-e-html-format-environment style 'END))
- (defun org-e-html-begin-list (ltype)
- (setq ltype (or (org-lparse-html-list-type-to-canonical-list-type ltype)
- ltype))
- (case ltype
- (ordered (let* ((arg1 nil)
- (extra (if arg1 (format " start=\"%d\"" arg1) "")))
- (org-lparse-insert-tag "<ol%s>" extra)))
- (unordered (org-lparse-insert-tag "<ul>"))
- (description (org-lparse-insert-tag "<dl>"))
- (t (error "Unknown list type: %s" ltype))))
- (defun org-e-html-end-list (ltype)
- (setq ltype (or (org-lparse-html-list-type-to-canonical-list-type ltype)
- ltype))
- (org-lparse-insert-tag
- (case ltype
- (ordered "</ol>")
- (unordered "</ul>")
- (description "</dl>")
- (t (error "Unknown list type: %s" ltype)))))
- (defun org-e-html-begin-list-item (ltype &optional arg headline)
- (setq ltype (or (org-lparse-html-list-type-to-canonical-list-type ltype)
- ltype))
- (case ltype
- (ordered
- (assert (not headline) t)
- (let* ((counter arg)
- (extra (if counter (format " value=\"%s\"" counter) "")))
- (org-lparse-insert-tag "<li%s>" extra)))
- (unordered
- (let* ((id arg)
- (extra (if id (format " id=\"%s\"" id) "")))
- (org-lparse-insert-tag "<li%s>" extra)
- (when headline
- (insert headline (org-lparse-format 'LINE-BREAK) "\n"))))
- (description
- (assert (not headline) t)
- (let* ((desc-tag (or arg "(no term)")))
- (insert
- (org-e-html-format-tags '("<dt>" . "</dt>") desc-tag))
- (org-lparse-insert-tag "<dd>")))
- (t (error "Unknown list type"))))
- (defun org-e-html-end-list-item (ltype)
- (setq ltype (or (org-lparse-html-list-type-to-canonical-list-type ltype)
- ltype))
- (case ltype
- (ordered (org-lparse-insert-tag "</li>"))
- (unordered (org-lparse-insert-tag "</li>"))
- (description (org-lparse-insert-tag "</dd>"))
- (t (error "Unknown list type"))))
- ;; Following variables are let bound when table emission is in
- ;; progress. See org-lparse.el.
- ;; FIXME: the org-lparse defvar belongs to org-lparse.el
- (defvar org-lparse-table-begin-marker)
- (defvar org-lparse-table-ncols)
- (defvar org-lparse-table-rowgrp-open)
- (defvar org-lparse-table-rownum)
- (defvar org-lparse-table-cur-rowgrp-is-hdr)
- (defvar org-lparse-table-is-styled)
- (defvar org-lparse-table-rowgrp-info)
- (defvar org-lparse-table-colalign-vector)
- (defvar org-lparse-table-num-numeric-items-per-column)
- (defun org-e-html-begin-footnote-definition (n)
- (org-lparse-begin-paragraph 'footnote)
- (insert
- (format
- (format org-export-e-html-footnote-format
- "<a class=\"footnum\" name=\"fn.%s\" href=\"#fnr.%s\">%s</a>")
- n n n)))
- (defun org-e-html-end-footnote-definition (n)
- (org-lparse-end-paragraph))
- (defun org-e-html-format-footnote-definition (contents n)
- (concat
- (format
- (format org-export-e-html-footnote-format
- "<a class=\"footnum\" name=\"fn.%s\" href=\"#fnr.%s\">%s</a>")
- n n n)
- contents))
- ;; (defun org-e-html-format-spaces (n)
- ;; (let ((space (or (and org-lparse-encode-pending "\\nbsp") " ")) out)
- ;; (while (> n 0)
- ;; (setq out (concat out space))
- ;; (setq n (1- n))) out))
- (defun org-e-html-format-tabs (&optional n)
- (ignore))
- (defun org-e-html-format-line-break ()
- (org-e-html-format-tags "<br/>" ""))
- (defun org-e-html-format-horizontal-line ()
- (concat "\n" "<hr/>" "\n"))
- (defun org-e-html-format-line (line)
- (case org-lparse-dyn-current-environment
- ((quote fixedwidth) (concat (org-e-html-encode-plain-text line) "\n"))
- (t (concat line "\n"))))
- (defun org-e-html-format-comment (fmt &rest args)
- (let ((comment (apply 'format fmt args)))
- (format "\n<!-- %s -->\n" comment)))
- (defun org-e-html-fix-class-name (kwd) ; audit callers of this function
- "Turn todo keyword into a valid class name.
- Replaces invalid characters with \"_\"."
- (save-match-data
- (while (string-match "[^a-zA-Z0-9_]" kwd)
- (setq kwd (replace-match "_" t t kwd))))
- kwd)
- (defun org-e-html-format-fontify (text style &optional id)
- (let (class extra how)
- (cond
- ((eq style 'underline)
- (setq extra " style=\"text-decoration:underline;\"" ))
- ((setq how (cdr (assoc style
- '((bold . ("<b>" . "</b>"))
- (emphasis . ("<i>" . "</i>"))
- (code . ("<code>" . "</code>"))
- (verbatim . ("<code>" . "</code>"))
- (strike . ("<del>" . "</del>"))
- (subscript . ("<sub>" . "</sub>"))
- (superscript . ("<sup>" . "</sup>")))))))
- ((listp style)
- (setq class (mapconcat 'identity style " ")))
- ((stringp style)
- (setq class style))
- (t (error "Unknown style %S" style)))
- (setq extra (concat (when class (format " class=\"%s\"" class))
- (when id (format " id=\"%s\"" id))
- extra))
- (let ((tags (or how '("<span%s>" . "</span>"))))
- (concat (format (car tags) extra) text (cdr tags)))))
- (defun org-e-html-format-link (text href &optional extra)
- (let ((extra (concat (format " href=\"%s\"" href)
- (and extra (concat " " extra)))))
- (format "<a%s>%s</a>" extra text)))
- (defun org-e-html-format-internal-link (text href &optional extra)
- (org-e-html-format-link text (concat "#" href) extra))
- (defun org-e-html-format-heading (text level &optional id)
- (let* ((extra (concat (when id (format " id=\"%s\"" id)))))
- (concat (format "<h%d%s>" level extra) text (format "</h%d>" level))))
- ;; (defun org-e-html-format-headline (title extra-targets tags
- ;; &optional snumber level)
- ;; (concat
- ;; (org-lparse-format 'EXTRA-TARGETS extra-targets)
- ;; (concat (org-lparse-format 'SECTION-NUMBER snumber level) " ")
- ;; title
- ;; (and tags (concat (org-lparse-format 'SPACES 3)
- ;; (org-lparse-format 'ORG-TAGS tags)))))
- (defun org-e-html-format-anchor (text name &optional class)
- (let* ((id name)
- (extra (concat
- (when name (format " name=\"%s\"" name))
- (when id (format " id=\"%s\"" id))
- (when class (format " class=\"%s\"" class)))))
- (format "<a%s>%s</a>" extra text)))
- (defun org-e-html-format-extra-targets (extra-targets)
- (if (not extra-targets) ""
- (mapconcat (lambda (x)
- (when x
- (setq x (org-solidify-link-text
- (if (org-uuidgen-p x) (concat "ID-" x) x)))
- (org-e-html-format-anchor "" x))) extra-targets "")))
- (defun org-e-html-format-spaces (n)
- (let (out) (dotimes (i n out) (setq out (concat out " ")))))
- (defun org-e-html-format-org-tags (tags)
- (if (not tags) ""
- (org-e-html-format-fontify
- (mapconcat
- (lambda (x)
- (org-e-html-format-fontify
- x (concat org-export-e-html-tag-class-prefix
- (org-e-html-fix-class-name x))))
- (org-split-string tags ":")
- (org-e-html-format-spaces 1)) "tag")))
- (defun org-e-html-format-section-number (&optional snumber level)
- ;; FIXME
- (and org-export-with-section-numbers
- ;; (not org-lparse-body-only)
- snumber level
- (org-e-html-format-fontify snumber (format "section-number-%d" level))))
- (defun org-e-html-format-headline (title extra-targets tags
- &optional snumber level)
- (concat
- (org-e-html-format-extra-targets extra-targets)
- (concat (org-e-html-format-section-number snumber level) " ")
- title
- (and tags (concat (org-e-html-format-spaces 3)
- (org-e-html-format-org-tags tags)))))
- (defun org-e-html-format-footnote-reference (n def refcnt)
- (let ((extra (if (= refcnt 1) "" (format ".%d" refcnt))))
- (format org-export-e-html-footnote-format
- (format
- "<a class=\"footref\" name=\"fnr.%s%s\" href=\"#fn.%s\">%s</a>"
- n extra n n))))
- (defun org-e-html-format-footnotes-section (section-name definitions)
- (if (not definitions) ""
- (format org-export-e-html-footnotes-section section-name definitions)))
- (defun org-e-html-format-org-entity (wd)
- (org-entity-get-representation wd 'html))
- (defun org-e-html-format-tags (tag text &rest args)
- (let ((prefix (when org-lparse-encode-pending "@"))
- (suffix (when org-lparse-encode-pending "@")))
- (apply 'org-lparse-format-tags tag text prefix suffix args)))
- (defun org-e-html-get (what &optional opt-plist)
- (case what
- (BACKEND 'html)
- (INIT-METHOD nil)
- (SAVE-METHOD nil)
- (CLEANUP-METHOD nil)
- ;; (OTHER-BACKENDS
- ;; ;; There is a provision to register a per-backend converter and
- ;; ;; output formats. Refer `org-lparse-get-converter' and
- ;; ;; `org-lparse-get-other-backends'.
- ;; ;; The default behaviour is to use `org-lparse-convert-process'
- ;; ;; and `org-lparse-convert-capabilities'.
- ;; )
- ;; (CONVERT-METHOD
- ;; ;; See note above
- ;; )
- (EXPORT-DIR (org-export-directory :html opt-plist))
- (FILE-NAME-EXTENSION (plist-get opt-plist :html-extension))
- (EXPORT-BUFFER-NAME "*Org HTML Export*")
- (ENTITY-CONTROL org-e-html-entity-control-callbacks-alist)
- (ENTITY-FORMAT org-e-html-entity-format-callbacks-alist)
- (TOPLEVEL-HLEVEL org-export-e-html-toplevel-hlevel)
- (SPECIAL-STRING-REGEXPS org-export-e-html-special-string-regexps)
- (CODING-SYSTEM-FOR-WRITE org-export-e-html-coding-system)
- (CODING-SYSTEM-FOR-SAVE org-export-e-html-coding-system)
- (INLINE-IMAGES org-export-e-html-inline-images)
- (INLINE-IMAGE-EXTENSIONS org-export-e-html-inline-image-extensions)
- (PLAIN-TEXT-MAP org-export-e-html-protect-char-alist)
- (TABLE-FIRST-COLUMN-AS-LABELS
- org-export-e-html-table-use-header-tags-for-first-column)
- (TODO-KWD-CLASS-PREFIX org-export-e-html-todo-kwd-class-prefix)
- (TAG-CLASS-PREFIX org-export-e-html-tag-class-prefix)
- (FOOTNOTE-SEPARATOR org-export-e-html-footnote-separator)
- (t (error "Unknown property: %s" what))))
- (defun org-e-html-get-coding-system-for-write ()
- (or org-export-e-html-coding-system
- (and (boundp 'buffer-file-coding-system) buffer-file-coding-system)))
- (defun org-e-html-get-coding-system-for-save ()
- (or org-export-e-html-coding-system
- (and (boundp 'buffer-file-coding-system) buffer-file-coding-system)))
- (defun org-e-html-insert-toc (toc)
- ;; locate where toc needs to be inserted
- (goto-char (point-min))
- (cond
- ((or (re-search-forward "<p>\\s-*\\[TABLE-OF-CONTENTS\\]\\s-*</p>" nil t)
- (re-search-forward "\\[TABLE-OF-CONTENTS\\]" nil t))
- (goto-char (match-beginning 0))
- (replace-match "")
- (insert toc))
- (org-lparse-dyn-first-heading-pos
- (goto-char org-lparse-dyn-first-heading-pos)
- (when (looking-at "\\s-*</p>")
- (goto-char (match-end 0))
- (insert "\n"))
- (insert toc))
- (t (ignore))))
- (defun org-e-html-format-date (info)
- (let ((date (plist-get info :date)))
- (cond
- ((and date (string-match "%" date))
- (format-time-string date))
- (date date)
- (t (format-time-string "%Y-%m-%d %T %Z")))))
- (defun org-e-html-footnote-section (info)
- (when org-e-html-footnotes-alist
- ;; (setq org-e-html-footnotes-alist
- ;; (sort org-e-html-footnotes-alist
- ;; (lambda (n1 n2) (< (or (nth 1 n1) most-positive-fixnum)
- ;; (or (nth 1 n2) most-positive-fixnum)))))
- ;; (setq org-e-html-footnote-alist (nreverse org-e-html-footnotes-alist))
- (setq org-e-html-footnotes-alist (nreverse org-e-html-footnotes-alist))
- (org-e-html-format-footnotes-section
- (nth 4 (or (assoc (plist-get info :language)
- org-export-language-setup)
- (assoc "en" org-export-language-setup)))
- (format "
- <table border=\"2\" cellspacing=\"0\" cellpadding=\"6\" rules=\"groups\" frame=\"hsides\">
- %s
- </table>
- "
- (mapconcat
- (lambda (x)
- (let ((n (car x))
- (def (cdr x)))
- (format "
- <tr>
- <td>%s</td>
- <td>%s</td>
- </tr>
- "
- (format
- (format org-export-e-html-footnote-format
- "<a class=\"footnum\" name=\"fn.%s\" href=\"#fnr.%s\">%s</a>")
- n n n) def)))
- org-e-html-footnotes-alist "\n")
- )
- )))
- (defun org-e-html-bibliography ()
- (org-export-e-html-get-bibliography))
- (defun org-e-html-expand (s)
- (with-org-lparse-backend 'html (org-xml-encode-org-text-skip-links s)))
- (defun org-e-html-protect (s)
- (with-org-lparse-backend 'html (org-e-html-encode-plain-text s)))
- (defun org-e-html-do-expand (s)
- (with-org-lparse-backend 'html (org-xml-encode-org-text s)))
- (defun org-export-e-html-format-href (s)
- (org-xml-format-href s))
- (defun org-export-e-html-format-desc (s)
- (org-xml-format-desc s))
- (eval-when-compile (require 'cl))
- ;;; org-e-html.el
- (defvar org-export-latex-default-packages-alist)
- (defvar org-export-latex-packages-alist)
- (declare-function org-element-get-property "org-element" (property element))
- (declare-function org-element-normalize-string "org-element" (s))
- (declare-function org-element-parse-secondary-string
- "org-element" (string restriction &optional buffer))
- (defvar org-element-string-restrictions)
- (declare-function org-export-clean-table "org-export" (table specialp))
- (declare-function org-export-data "org-export" (data backend info))
- (declare-function org-export-directory "org-export" (type plist))
- (declare-function org-export-expand-macro "org-export" (macro info))
- (declare-function org-export-first-sibling-p "org-export" (headline info))
- (declare-function org-export-footnote-first-reference-p "org-export"
- (footnote-reference info))
- (declare-function org-export-get-coderef-format "org-export" (path desc))
- (declare-function org-export-get-footnote-definition "org-export"
- (footnote-reference info))
- (declare-function org-export-get-footnote-number "org-export" (footnote info))
- (declare-function org-export-get-previous-element "org-export" (blob info))
- (declare-function org-export-get-relative-level "org-export" (headline info))
- (declare-function org-export-handle-code
- "org-export" (element info &optional num-fmt ref-fmt delayed))
- (declare-function org-export-included-file "org-export" (keyword backend info))
- (declare-function org-export-inline-image-p "org-export"
- (link &optional extensions))
- (declare-function org-export-last-sibling-p "org-export" (headline info))
- (declare-function org-export-low-level-p "org-export" (headline info))
- (declare-function org-export-output-file-name
- "org-export" (extension &optional subtreep pub-dir))
- (declare-function org-export-resolve-coderef "org-export" (ref info))
- (declare-function org-export-resolve-fuzzy-link "org-export" (link info))
- (declare-function org-export-secondary-string "org-export"
- (secondary backend info))
- (declare-function org-export-solidify-link-text "org-export" (s))
- (declare-function org-export-table-format-info "org-export" (table))
- (declare-function
- org-export-to-buffer "org-export"
- (backend buffer &optional subtreep visible-only body-only ext-plist))
- (declare-function
- org-export-to-file "org-export"
- (backend file &optional subtreep visible-only body-only ext-plist))
- ;;; Internal Variables
- ;; (defconst org-e-html-option-alist
- ;; '((:date "DATE" nil org-e-html-date-format t)
- ;; (:latex-class "LATEX_CLASS" nil org-e-html-default-class t)
- ;; (:latex-class-options "LATEX_CLASS_OPTIONS" nil nil t)
- ;; (:latex-header-extra "LATEX_HEADER" nil nil newline))
- ;; "Alist between HTML export properties and ways to set them.
- ;; See `org-export-option-alist' for more information on the
- ;; structure of the value.")
- (defconst org-e-html-option-alist
- '((:agenda-style nil nil org-agenda-export-html-style)
- (:convert-org-links nil nil org-export-e-html-link-org-files-as-html)
- ;; (:expand-quoted-html nil "@" org-export-e-html-expand) FIXME
- (:inline-images nil nil org-export-e-html-inline-images)
- ;; (:link-home nil nil org-export-e-html-link-home) FIXME
- ;; (:link-up nil nil org-export-e-html-link-up) FIXME
- (:style nil nil org-export-e-html-style)
- (:style-extra nil nil org-export-e-html-style-extra)
- (:style-include-default nil nil org-export-e-html-style-include-default)
- (:style-include-scripts nil nil org-export-e-html-style-include-scripts)
- (:timestamp nil nil org-export-e-html-with-timestamp)
- (:html-extension nil nil org-export-e-html-extension)
- (:html-postamble nil nil org-export-e-html-postamble)
- (:html-preamble nil nil org-export-e-html-preamble)
- (:html-table-tag nil nil org-export-e-html-table-tag)
- (:xml-declaration nil nil org-export-e-html-xml-declaration)
- (:LaTeX-fragments nil "LaTeX" org-export-with-LaTeX-fragments))
- "Alist between export properties and ways to set them.
- The car of the alist is the property name, and the cdr is a list
- like \(KEYWORD OPTION DEFAULT BEHAVIOUR\) where:
- KEYWORD is a string representing a buffer keyword, or nil.
- OPTION is a string that could be found in an #+OPTIONS: line.
- DEFAULT is the default value for the property.
- BEHAVIOUR determine how Org should handle multiple keywords for
- the same property. It is a symbol among:
- nil Keep old value and discard the new one.
- t Replace old value with the new one.
- `space' Concatenate the values, separating them with a space.
- `newline' Concatenate the values, separating them with
- a newline.
- `split' Split values at white spaces, and cons them to the
- previous list.
- KEYWORD and OPTION have precedence over DEFAULT.
- All these properties should be back-end agnostic. For back-end
- specific properties, define a similar variable named
- `org-BACKEND-option-alist', replacing BACKEND with the name of
- the appropriate back-end. You can also redefine properties
- there, as they have precedence over these.")
- ;;; User Configurable Variables
- (defgroup org-export-e-html nil
- "Options for exporting Org mode files to HTML."
- :tag "Org Export HTML"
- :group 'org-export)
- ;;;; Preamble
- (defcustom org-e-html-default-class "article"
- "The default HTML class."
- :group 'org-export-e-html
- :type '(string :tag "HTML class"))
- (defcustom org-e-html-classes
- '(("article"
- "\\documentclass[11pt]{article}"
- ("\\section{%s}" . "\\section*{%s}")
- ("\\subsection{%s}" . "\\subsection*{%s}")
- ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
- ("\\paragraph{%s}" . "\\paragraph*{%s}")
- ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
- ("report"
- "\\documentclass[11pt]{report}"
- ("\\part{%s}" . "\\part*{%s}")
- ("\\chapter{%s}" . "\\chapter*{%s}")
- ("\\section{%s}" . "\\section*{%s}")
- ("\\subsection{%s}" . "\\subsection*{%s}")
- ("\\subsubsection{%s}" . "\\subsubsection*{%s}"))
- ("book"
- "\\documentclass[11pt]{book}"
- ("\\part{%s}" . "\\part*{%s}")
- ("\\chapter{%s}" . "\\chapter*{%s}")
- ("\\section{%s}" . "\\section*{%s}")
- ("\\subsection{%s}" . "\\subsection*{%s}")
- ("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
- "Alist of HTML classes and associated header and structure.
- If #+HTML_CLASS is set in the buffer, use its value and the
- associated information. Here is the structure of each cell:
- \(class-name
- header-string
- \(numbered-section . unnumbered-section\)
- ...\)
- The header string
- -----------------
- The HEADER-STRING is the header that will be inserted into the
- HTML file. It should contain the \\documentclass macro, and
- anything else that is needed for this setup. To this header, the
- following commands will be added:
- - Calls to \\usepackage for all packages mentioned in the
- variables `org-export-latex-default-packages-alist' and
- `org-export-latex-packages-alist'. Thus, your header
- definitions should avoid to also request these packages.
- - Lines specified via \"#+HTML_HEADER:\"
- If you need more control about the sequence in which the header
- is built up, or if you want to exclude one of these building
- blocks for a particular class, you can use the following
- macro-like placeholders.
- [DEFAULT-PACKAGES] \\usepackage statements for default packages
- [NO-DEFAULT-PACKAGES] do not include any of the default packages
- [PACKAGES] \\usepackage statements for packages
- [NO-PACKAGES] do not include the packages
- [EXTRA] the stuff from #+HTML_HEADER
- [NO-EXTRA] do not include #+HTML_HEADER stuff
- [BEAMER-HEADER-EXTRA] the beamer extra headers
- So a header like
- \\documentclass{article}
- [NO-DEFAULT-PACKAGES]
- [EXTRA]
- \\providecommand{\\alert}[1]{\\textbf{#1}}
- [PACKAGES]
- will omit the default packages, and will include the
- #+HTML_HEADER lines, then have a call to \\providecommand, and
- then place \\usepackage commands based on the content of
- `org-export-latex-packages-alist'.
- If your header, `org-export-latex-default-packages-alist' or
- `org-export-latex-packages-alist' inserts
- \"\\usepackage[AUTO]{inputenc}\", AUTO will automatically be
- replaced with a coding system derived from
- `buffer-file-coding-system'. See also the variable
- `org-e-html-inputenc-alist' for a way to influence this
- mechanism.
- The sectioning structure
- ------------------------
- The sectioning structure of the class is given by the elements
- following the header string. For each sectioning level, a number
- of strings is specified. A %s formatter is mandatory in each
- section string and will be replaced by the title of the section.
- Instead of a cons cell \(numbered . unnumbered\), you can also
- provide a list of 2 or 4 elements,
- \(numbered-open numbered-close\)
- or
- \(numbered-open numbered-close unnumbered-open unnumbered-close\)
- providing opening and closing strings for a HTML environment
- that should represent the document section. The opening clause
- should have a %s to represent the section title.
- Instead of a list of sectioning commands, you can also specify
- a function name. That function will be called with two
- parameters, the \(reduced) level of the headline, and a predicate
- non-nil when the headline should be numbered. It must return
- a format string in which the section title will be added."
- :group 'org-export-e-html
- :type '(repeat
- (list (string :tag "HTML class")
- (string :tag "HTML header")
- (repeat :tag "Levels" :inline t
- (choice
- (cons :tag "Heading"
- (string :tag " numbered")
- (string :tag "unnumbered"))
- (list :tag "Environment"
- (string :tag "Opening (numbered)")
- (string :tag "Closing (numbered)")
- (string :tag "Opening (unnumbered)")
- (string :tag "Closing (unnumbered)"))
- (function :tag "Hook computing sectioning"))))))
- (defcustom org-e-html-inputenc-alist nil
- "Alist of inputenc coding system names, and what should really be used.
- For example, adding an entry
- (\"utf8\" . \"utf8x\")
- will cause \\usepackage[utf8x]{inputenc} to be used for buffers that
- are written as utf8 files."
- :group 'org-export-e-html
- :type '(repeat
- (cons
- (string :tag "Derived from buffer")
- (string :tag "Use this instead"))))
- (defcustom org-e-html-date-format
- "\\today"
- "Format string for \\date{...}."
- :group 'org-export-e-html
- :type 'boolean)
- (defcustom org-e-html-title-command "\\maketitle"
- "The command used to insert the title just after \\begin{document}.
- If this string contains the formatting specification \"%s\" then
- it will be used as a formatting string, passing the title as an
- argument."
- :group 'org-export-e-html
- :type 'string)
- ;;;; Headline
- (defcustom org-e-html-format-headline-function nil
- "Function to format headline text.
- This function will be called with 5 arguments:
- TODO the todo keyword \(string or nil\).
- TODO-TYPE the type of todo \(symbol: `todo', `done', nil\)
- PRIORITY the priority of the headline \(integer or nil\)
- TEXT the main headline text \(string\).
- TAGS the tags string, separated with colons \(string or nil\).
- The function result will be used in the section format string.
- As an example, one could set the variable to the following, in
- order to reproduce the default set-up:
- \(defun org-e-html-format-headline \(todo todo-type priority text tags\)
- \"Default format function for an headline.\"
- \(concat \(when todo
- \(format \"\\\\textbf{\\\\textsc{\\\\textsf{%s}}} \" todo\)\)
- \(when priority
- \(format \"\\\\framebox{\\\\#%c} \" priority\)\)
- text
- \(when tags \(format \"\\\\hfill{}\\\\textsc{%s}\" tags\)\)\)\)"
- :group 'org-export-e-html
- :type 'function)
- ;;;; Emphasis
- (defcustom org-e-html-emphasis-alist
- '(("*" . "\\textbf{%s}")
- ("/" . "\\emph{%s}")
- ("_" . "\\underline{%s}")
- ("+" . "\\st{%s}")
- ("=" . protectedtexttt)
- ("~" . verb))
- "Alist of HTML expressions to convert emphasis fontifiers.
- The key is the character used as a marker for fontification. The
- value is a formatting string to wrap fontified text with.
- Value can also be set to the following symbols: `verb' and
- `protectedtexttt'. For the former, Org will use \"\\verb\" to
- create a format string and select a delimiter character that
- isn't in the string. For the latter, Org will use \"\\texttt\"
- to typeset and try to protect special characters."
- :group 'org-export-e-html
- :type 'alist)
- ;;;; Footnotes
- (defcustom org-e-html-footnote-separator "<sup>, </sup>"
- "Text used to separate footnotes."
- :group 'org-export-e-html
- :type 'string)
- ;;;; Time-stamps
- (defcustom org-e-html-active-timestamp-format "\\textit{%s}"
- "A printf format string to be applied to active time-stamps."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-e-html-inactive-timestamp-format "\\textit{%s}"
- "A printf format string to be applied to inactive time-stamps."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-e-html-diary-timestamp-format "\\textit{%s}"
- "A printf format string to be applied to diary time-stamps."
- :group 'org-export-e-html
- :type 'string)
- ;;;; Links
- (defcustom org-e-html-image-default-option "width=.9\\linewidth"
- "Default option for images."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-e-html-default-figure-position "htb"
- "Default position for latex figures."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-e-html-inline-image-rules
- '(("file" . "\\.\\(pdf\\|jpeg\\|jpg\\|png\\|ps\\|eps\\)\\'"))
- "Rules characterizing image files that can be inlined into HTML.
- A rule consists in an association whose key is the type of link
- to consider, and value is a regexp that will be matched against
- link's path.
- Note that, by default, the image extension *actually* allowed
- depend on the way the HTML file is processed. When used with
- pdflatex, pdf, jpg and png images are OK. When processing
- through dvi to Postscript, only ps and eps are allowed. The
- default we use here encompasses both."
- :group 'org-export-e-html
- :type '(alist :key-type (string :tag "Type")
- :value-type (regexp :tag "Path")))
- ;;;; Tables
- (defcustom org-e-html-default-table-environment "tabular"
- "Default environment used to build tables."
- :group 'org-export-e-html
- :type 'string)
- (defcustom org-e-html-tables-centered t
- "When non-nil, tables are exported in a center environment."
- :group 'org-export-e-html
- :type 'boolean)
- (defcustom org-e-html-tables-verbatim nil
- "When non-nil, tables are exported verbatim."
- :group 'org-export-e-html
- :type 'boolean)
- (defcustom org-e-html-tables-booktabs nil
- "When non-nil, display tables in a formal \"booktabs\" style.
- This option assumes that the \"booktabs\" package is properly
- loaded in the header of the document. This value can be ignored
- locally with \"booktabs=yes\" and \"booktabs=no\" HTML
- attributes."
- :group 'org-export-e-html
- :type 'boolean)
- (defcustom org-e-html-table-caption-above t
- "When non-nil, place caption string at the beginning of the table.
- Otherwise, place it near the end."
- :group 'org-export-e-html
- :type 'boolean)
- ;;;; Drawers
- (defcustom org-e-html-format-drawer-function nil
- "Function called to format a drawer in HTML code.
- The function must accept two parameters:
- NAME the drawer name, like \"LOGBOOK\"
- CONTENTS the contents of the drawer.
- The function should return the string to be exported.
- For example, the variable could be set to the following function
- in order to mimic default behaviour:
- \(defun org-e-html-format-drawer-default \(name contents\)
- \"Format a drawer element for HTML export.\"
- contents\)"
- :group 'org-export-e-html
- :type 'function)
- ;;;; Inlinetasks
- (defcustom org-e-html-format-inlinetask-function nil
- "Function called to format an inlinetask in HTML code.
- The function must accept six parameters:
- TODO the todo keyword, as a string
- TODO-TYPE the todo type, a symbol among `todo', `done' and nil.
- PRIORITY the inlinetask priority, as a string
- NAME the inlinetask name, as a string.
- TAGS the inlinetask tags, as a string.
- CONTENTS the contents of the inlinetask, as a string.
- The function should return the string to be exported.
- For example, the variable could be set to the following function
- in order to mimic default behaviour:
- \(defun org-e-html-format-inlinetask \(todo type priority name tags contents\)
- \"Format an inline task element for HTML export.\"
- \(let \(\(full-title
- \(concat
- \(when todo
- \(format \"\\\\textbf{\\\\textsf{\\\\textsc{%s}}} \" todo\)\)
- \(when priority \(format \"\\\\framebox{\\\\#%c} \" priority\)\)
- title
- \(when tags \(format \"\\\\hfill{}\\\\textsc{%s}\" tags\)\)\)\)\)
- \(format \(concat \"\\\\begin{center}\\n\"
- \"\\\\fbox{\\n\"
- \"\\\\begin{minipage}[c]{.6\\\\textwidth}\\n\"
- \"%s\\n\\n\"
- \"\\\\rule[.8em]{\\\\textwidth}{2pt}\\n\\n\"
- \"%s\"
- \"\\\\end{minipage}}\"
- \"\\\\end{center}\"\)
- full-title contents\)\)"
- :group 'org-export-e-html
- :type 'function)
- ;; Src blocks
- (defcustom org-e-html-listings nil
- "Non-nil means export source code using the listings package.
- This package will fontify source code, possibly even with color.
- If you want to use this, you also need to make HTML use the
- listings package, and if you want to have color, the color
- package. Just add these to `org-export-latex-packages-alist',
- for example using customize, or with something like:
- \(require 'org-e-html)
- \(add-to-list 'org-export-latex-packages-alist '\(\"\" \"listings\"))
- \(add-to-list 'org-export-latex-packages-alist '\(\"\" \"color\"))
- Alternatively,
- \(setq org-e-html-listings 'minted)
- causes source code to be exported using the minted package as
- opposed to listings. If you want to use minted, you need to add
- the minted package to `org-export-latex-packages-alist', for
- example using customize, or with
- \(require 'org-e-html)
- \(add-to-list 'org-export-latex-packages-alist '\(\"\" \"minted\"))
- In addition, it is necessary to install pygments
- \(http://pygments.org), and to configure the variable
- `org-e-html-pdf-process' so that the -shell-escape option is
- passed to pdflatex."
- :group 'org-export-e-html
- :type '(choice
- (const :tag "Use listings" t)
- (const :tag "Use minted" 'minted)
- (const :tag "Export verbatim" nil)))
- (defcustom org-e-html-listings-langs
- '((emacs-lisp "Lisp") (lisp "Lisp") (clojure "Lisp")
- (c "C") (cc "C++")
- (fortran "fortran")
- (perl "Perl") (cperl "Perl") (python "Python") (ruby "Ruby")
- (html "HTML") (xml "XML")
- (tex "TeX") (latex "TeX")
- (shell-script "bash")
- (gnuplot "Gnuplot")
- (ocaml "Caml") (caml "Caml")
- (sql "SQL") (sqlite "sql"))
- "Alist mapping languages to their listing language counterpart.
- The key is a symbol, the major mode symbol without the \"-mode\".
- The value is the string that should be inserted as the language
- parameter for the listings package. If the mode name and the
- listings name are the same, the language does not need an entry
- in this list - but it does not hurt if it is present."
- :group 'org-export-e-html
- :type '(repeat
- (list
- (symbol :tag "Major mode ")
- (string :tag "Listings language"))))
- (defcustom org-e-html-listings-options nil
- "Association list of options for the latex listings package.
- These options are supplied as a comma-separated list to the
- \\lstset command. Each element of the association list should be
- a list containing two strings: the name of the option, and the
- value. For example,
- (setq org-e-html-listings-options
- '((\"basicstyle\" \"\\small\")
- (\"keywordstyle\" \"\\color{black}\\bfseries\\underbar\")))
- will typeset the code in a small size font with underlined, bold
- black keywords.
- Note that the same options will be applied to blocks of all
- languages."
- :group 'org-export-e-html
- :type '(repeat
- (list
- (string :tag "Listings option name ")
- (string :tag "Listings option value"))))
- (defcustom org-e-html-minted-langs
- '((emacs-lisp "common-lisp")
- (cc "c++")
- (cperl "perl")
- (shell-script "bash")
- (caml "ocaml"))
- "Alist mapping languages to their minted language counterpart.
- The key is a symbol, the major mode symbol without the \"-mode\".
- The value is the string that should be inserted as the language
- parameter for the minted package. If the mode name and the
- listings name are the same, the language does not need an entry
- in this list - but it does not hurt if it is present.
- Note that minted uses all lower case for language identifiers,
- and that the full list of language identifiers can be obtained
- with:
- pygmentize -L lexers"
- :group 'org-export-e-html
- :type '(repeat
- (list
- (symbol :tag "Major mode ")
- (string :tag "Minted language"))))
- (defcustom org-e-html-minted-options nil
- "Association list of options for the latex minted package.
- These options are supplied within square brackets in
- \\begin{minted} environments. Each element of the alist should
- be a list containing two strings: the name of the option, and the
- value. For example,
- \(setq org-e-html-minted-options
- '\((\"bgcolor\" \"bg\") \(\"frame\" \"lines\")))
- will result in src blocks being exported with
- \\begin{minted}[bgcolor=bg,frame=lines]{<LANG>}
- as the start of the minted environment. Note that the same
- options will be applied to blocks of all languages."
- :group 'org-export-e-html
- :type '(repeat
- (list
- (string :tag "Minted option name ")
- (string :tag "Minted option value"))))
- (defvar org-e-html-custom-lang-environments nil
- "Alist mapping languages to language-specific HTML environments.
- It is used during export of src blocks by the listings and minted
- latex packages. For example,
- \(setq org-e-html-custom-lang-environments
- '\(\(python \"pythoncode\"\)\)\)
- would have the effect that if org encounters begin_src python
- during latex export it will output
- \\begin{pythoncode}
- <src block body>
- \\end{pythoncode}")
- ;;;; Plain text
- (defcustom org-e-html-quotes
- '(("fr" ("\\(\\s-\\|[[(]\\)\"" . "«~") ("\\(\\S-\\)\"" . "~»") ("\\(\\s-\\|(\\)'" . "'"))
- ("en" ("\\(\\s-\\|[[(]\\)\"" . "``") ("\\(\\S-\\)\"" . "''") ("\\(\\s-\\|(\\)'" . "`")))
- "Alist for quotes to use when converting english double-quotes.
- The CAR of each item in this alist is the language code.
- The CDR of each item in this alist is a list of three CONS:
- - the first CONS defines the opening quote;
- - the second CONS defines the closing quote;
- - the last CONS defines single quotes.
- For each item in a CONS, the first string is a regexp
- for allowed characters before/after the quote, the second
- string defines the replacement string for this quote."
- :group 'org-export-e-html
- :type '(list
- (cons :tag "Opening quote"
- (string :tag "Regexp for char before")
- (string :tag "Replacement quote "))
- (cons :tag "Closing quote"
- (string :tag "Regexp for char after ")
- (string :tag "Replacement quote "))
- (cons :tag "Single quote"
- (string :tag "Regexp for char before")
- (string :tag "Replacement quote "))))
- ;;;; Compilation
- (defcustom org-e-html-pdf-process
- '("pdflatex -interaction nonstopmode -output-directory %o %f"
- "pdflatex -interaction nonstopmode -output-directory %o %f"
- "pdflatex -interaction nonstopmode -output-directory %o %f")
- "Commands to process a HTML file to a PDF file.
- This is a list of strings, each of them will be given to the
- shell as a command. %f in the command will be replaced by the
- full file name, %b by the file base name \(i.e. without
- extension) and %o by the base directory of the file.
- The reason why this is a list is that it usually takes several
- runs of `pdflatex', maybe mixed with a call to `bibtex'. Org
- does not have a clever mechanism to detect which of these
- commands have to be run to get to a stable result, and it also
- does not do any error checking.
- By default, Org uses 3 runs of `pdflatex' to do the processing.
- If you have texi2dvi on your system and if that does not cause
- the infamous egrep/locale bug:
- http://lists.gnu.org/archive/html/bug-texinfo/2010-03/msg00031.html
- then `texi2dvi' is the superior choice. Org does offer it as one
- of the customize options.
- Alternatively, this may be a Lisp function that does the
- processing, so you could use this to apply the machinery of
- AUCTeX or the Emacs HTML mode. This function should accept the
- file name as its single argument."
- :group 'org-export-pdf
- :type '(choice
- (repeat :tag "Shell command sequence"
- (string :tag "Shell command"))
- (const :tag "2 runs of pdflatex"
- ("pdflatex -interaction nonstopmode -output-directory %o %f"
- "pdflatex -interaction nonstopmode -output-directory %o %f"))
- (const :tag "3 runs of pdflatex"
- ("pdflatex -interaction nonstopmode -output-directory %o %f"
- "pdflatex -interaction nonstopmode -output-directory %o %f"
- "pdflatex -interaction nonstopmode -output-directory %o %f"))
- (const :tag "pdflatex,bibtex,pdflatex,pdflatex"
- ("pdflatex -interaction nonstopmode -output-directory %o %f"
- "bibtex %b"
- "pdflatex -interaction nonstopmode -output-directory %o %f"
- "pdflatex -interaction nonstopmode -output-directory %o %f"))
- (const :tag "texi2dvi"
- ("texi2dvi -p -b -c -V %f"))
- (const :tag "rubber"
- ("rubber -d --into %o %f"))
- (function)))
- (defcustom org-e-html-logfiles-extensions
- '("aux" "idx" "log" "out" "toc" "nav" "snm" "vrb")
- "The list of file extensions to consider as HTML logfiles."
- :group 'org-export-e-html
- :type '(repeat (string :tag "Extension")))
- (defcustom org-e-html-remove-logfiles t
- "Non-nil means remove the logfiles produced by PDF production.
- These are the .aux, .log, .out, and .toc files."
- :group 'org-export-e-html
- :type 'boolean)
- ;;; Internal Functions
- (defun org-e-html--caption/label-string (caption label info)
- "Return caption and label HTML string for floats.
- CAPTION is a cons cell of secondary strings, the car being the
- standard caption and the cdr its short form. LABEL is a string
- representing the label. INFO is a plist holding contextual
- information.
- If there's no caption nor label, return the empty string.
- For non-floats, see `org-e-html--wrap-label'."
- (setq label nil) ;; FIXME
- (let ((label-str (if label (format "\\label{%s}" label) "")))
- (cond
- ((and (not caption) (not label)) "")
- ((not caption) (format "\\label{%s}\n" label))
- ;; Option caption format with short name.
- ((cdr caption)
- (format "\\caption[%s]{%s%s}\n"
- (org-export-secondary-string (cdr caption) 'e-html info)
- label-str
- (org-export-secondary-string (car caption) 'e-html info)))
- ;; Standard caption format.
- ;; (t (format "\\caption{%s%s}\n"
- ;; label-str
- ;; (org-export-secondary-string (car caption) 'e-html info)))
- (t (org-export-secondary-string (car caption) 'e-html info)))))
- (defun org-e-html--guess-inputenc (header)
- "Set the coding system in inputenc to what the buffer is.
- HEADER is the HTML header string.
- Return the new header."
- (let* ((cs (or (ignore-errors
- (latexenc-coding-system-to-inputenc
- buffer-file-coding-system))
- "utf8")))
- (if (not cs)
- header
- ;; First translate if that is requested.
- (setq cs (or (cdr (assoc cs org-e-html-inputenc-alist)) cs))
- ;; Then find the \usepackage statement and replace the option.
- (replace-regexp-in-string "\\\\usepackage\\[\\(AUTO\\)\\]{inputenc}"
- cs header t nil 1))))
- (defun org-e-html--find-verb-separator (s)
- "Return a character not used in string S.
- This is used to choose a separator for constructs like \\verb."
- (let ((ll "~,./?;':\"|!@#%^&-_=+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ<>()[]{}"))
- (loop for c across ll
- when (not (string-match (regexp-quote (char-to-string c)) s))
- return (char-to-string c))))
- (defun org-e-html--make-option-string (options)
- "Return a comma separated string of keywords and values.
- OPTIONS is an alist where the key is the options keyword as
- a string, and the value a list containing the keyword value, or
- nil."
- (mapconcat (lambda (pair)
- (concat (first pair)
- (when (> (length (second pair)) 0)
- (concat "=" (second pair)))))
- options
- ","))
- (defun org-e-html--quotation-marks (text info)
- "Export quotation marks depending on language conventions.
- TEXT is a string containing quotation marks to be replaced. INFO
- is a plist used as a communication channel."
- (mapc (lambda(l)
- (let ((start 0))
- (while (setq start (string-match (car l) text start))
- (let ((new-quote (concat (match-string 1 text) (cdr l))))
- (setq text (replace-match new-quote t t text))))))
- (cdr (or (assoc (plist-get info :language) org-e-html-quotes)
- ;; Falls back on English.
- (assoc "en" org-e-html-quotes))))
- text)
- (defun org-e-html--wrap-label (element output)
- "Wrap label associated to ELEMENT around OUTPUT, if appropriate.
- This function shouldn't be used for floats. See
- `org-e-html--caption/label-string'."
- ;; (let ((label (org-element-get-property :name element)))
- ;; (if (or (not output) (not label) (string= output "") (string= label ""))
- ;; output
- ;; (concat (format "\\label{%s}\n" label) output)))
- output)
- ;;; Template
- ;; (defun org-e-html-template (contents info)
- ;; "Return complete document string after HTML conversion.
- ;; CONTENTS is the transcoded contents string. INFO is a plist
- ;; holding export options."
- ;; (let ((title (org-export-secondary-string
- ;; (plist-get info :title) 'e-html info)))
- ;; (concat
- ;; ;; 1. Time-stamp.
- ;; (and (plist-get info :time-stamp-file)
- ;; (format-time-string "%% Created %Y-%m-%d %a %H:%M\n"))
- ;; ;; 2. Document class and packages.
- ;; (let ((class (plist-get info :latex-class))
- ;; (class-options (plist-get info :latex-class-options)))
- ;; (org-element-normalize-string
- ;; (let* ((header (nth 1 (assoc class org-e-html-classes)))
- ;; (document-class-string
- ;; (and (stringp header)
- ;; (if class-options
- ;; (replace-regexp-in-string
- ;; "^[ \t]*\\\\documentclass\\(\\[.*?\\]\\)"
- ;; class-options header t nil 1)
- ;; header))))
- ;; (org-e-html--guess-inputenc
- ;; (org-splice-latex-header
- ;; document-class-string
- ;; org-export-latex-default-packages-alist ; defined in org.el
- ;; org-export-latex-packages-alist nil ; defined in org.el
- ;; (plist-get info :latex-header-extra))))))
- ;; ;; 3. Define alert if not yet defined.
- ;; "\\providecommand{\\alert}[1]{\\textbf{#1}}\n"
- ;; ;; 4. Possibly limit depth for headline numbering.
- ;; (let ((sec-num (plist-get info :section-numbers)))
- ;; (when (integerp sec-num)
- ;; (format "\\setcounter{secnumdepth}{%d}\n" sec-num)))
- ;; ;; 5. Author.
- ;; (let ((author (and (plist-get info :with-author)
- ;; (let ((auth (plist-get info :author)))
- ;; (and auth (org-export-secondary-string
- ;; auth 'e-html info)))))
- ;; (email (and (plist-get info :with-email)
- ;; (org-export-secondary-string
- ;; (plist-get info :email) 'e-html info))))
- ;; (cond ((and author email (not (string= "" email)))
- ;; (format "\\author{%s\\thanks{%s}}\n" author email))
- ;; (author (format "\\author{%s}\n" author))
- ;; (t "\\author{}\n")))
- ;; ;; 6. Date.
- ;; (let ((date (plist-get info :date)))
- ;; (and date (format "\\date{%s}\n" date)))
- ;; ;; 7. Title
- ;; (format "\\title{%s}\n" title)
- ;; ;; 8. Hyperref options.
- ;; (format "\\hypersetup{\n pdfkeywords={%s},\n pdfsubject={%s},\n pdfcreator={%s}}\n"
- ;; (or (plist-get info :keywords) "")
- ;; (or (plist-get info :description) "")
- ;; (if (not (plist-get info :with-creator)) ""
- ;; (plist-get info :creator)))
- ;; ;; 9. Document start.
- ;; "\\begin{document}\n\n"
- ;; ;; 10. Title command.
- ;; (org-element-normalize-string
- ;; (cond ((string= "" title) nil)
- ;; ((not (stringp org-e-html-title-command)) nil)
- ;; ((string-match "\\(?:[^%]\\|^\\)%s"
- ;; org-e-html-title-command)
- ;; (format org-e-html-title-command title))
- ;; (t org-e-html-title-command)))
- ;; ;; 11. Table of contents.
- ;; (let ((depth (plist-get info :with-toc)))
- ;; (when depth
- ;; (concat (when (wholenump depth)
- ;; (format "\\setcounter{tocdepth}{%d}\n" depth))
- ;; "\\tableofcontents\n\\vspace*{1cm}\n\n")))
- ;; ;; 12. Document's body.
- ;; contents
- ;; ;; 13. Creator.
- ;; (let ((creator-info (plist-get info :with-creator)))
- ;; (cond
- ;; ((not creator-info) "")
- ;; ((eq creator-info 'comment)
- ;; (format "%% %s\n" (plist-get info :creator)))
- ;; (t (concat (plist-get info :creator) "\n"))))
- ;; ;; 14. Document end.
- ;; "\\end{document}")))
- (defun org-e-html-meta-info (info)
- (concat
- (format "
- <title>%s</title>" (plist-get info :title))
- (format "
- <meta http-equiv=\"Content-Type\" content=\"text/html;charset=%s\"/>"
- (and coding-system-for-write
- (fboundp 'coding-system-get)
- (coding-system-get coding-system-for-write
- 'mime-charset)))
- (format "
- <meta name=\"title\" content=\"%s\"/>" (plist-get info :title))
- "
- <meta name=\"generator\" content=\"Org-mode\"/>"
- (format "
- <meta name=\"generated\" content=\"%s\"/>" (org-e-html-format-date info))
- (format "
- <meta name=\"author\" content=\"%s\"/>" (plist-get info :author))
- (format "
- <meta name=\"description\" content=\"%s\"/>" (plist-get info :description))
- (format "
- <meta name=\"keywords\" content=\"%s\"/>" (plist-get info :keywords))))
- (defun org-e-html-style (info)
- (concat
- (when (plist-get info :style-include-default)
- org-export-e-html-style-default)
- (plist-get info :style)
- (plist-get info :style-extra)
- "\n"
- (when (plist-get info :style-include-scripts)
- org-export-e-html-scripts)))
- (defun org-e-html-mathjax (info)
- (when (or (eq (plist-get info :HTML-fragments) 'mathjax)
- (and org-export-have-math
- (eq (plist-get info :HTML-fragments) t)))
- (org-export-e-html-mathjax-config
- org-export-e-html-mathjax-template
- org-export-e-html-mathjax-options
- (or (plist-get info :mathjax) ""))))
- (defun org-e-html-preamble (info)
- (when (plist-get info :html-preamble)
- (let* ((title (plist-get info :title))
- (date (org-e-html-format-date info))
- (author (plist-get info :author))
- (lang-words (or (assoc (plist-get info :language)
- org-export-language-setup)
- (assoc "en" org-export-language-setup)))
- (email (plist-get info :email))
- (html-pre-real-contents
- (cond
- ((functionp (plist-get info :html-preamble))
- (with-temp-buffer
- (funcall (plist-get info :html-preamble))
- (buffer-string)))
- ((stringp (plist-get info :html-preamble))
- (format-spec (plist-get info :html-preamble)
- `((?t . ,title) (?a . ,author)
- (?d . ,date) (?e . ,email))))
- (t
- (format-spec
- (or (cadr (assoc (nth 0 lang-words)
- org-export-e-html-preamble-format))
- (cadr (assoc "en" org-export-e-html-preamble-format)))
- `((?t . ,title) (?a . ,author)
- (?d . ,date) (?e . ,email)))))))
- (when (not (equal html-pre-real-contents ""))
- (concat
- (format "
- <div id=\"%s\"> " (nth 0 org-export-e-html-divs))
- "
- "
- html-pre-real-contents
- "
- </div>")))))
- ;; (defun org-e-html-footnote-section (info)
- ;; (when org-e-html-footnotes-alist
- ;; (setq org-e-html-footnotes-alist
- ;; (sort org-e-html-footnotes-alist
- ;; (lambda (n1 n2) (< (or (nth 1 n1) most-positive-fixnum)
- ;; (or (nth 1 n2) most-positive-fixnum)))))
- ;; (org-e-html-format-footnotes-section
- ;; (nth 4 (or (assoc (plist-get info :language)
- ;; org-export-language-setup)
- ;; (assoc "en" org-export-language-setup)))
- ;; (mapconcat
- ;; (lambda (x)
- ;; (org-e-html-format-footnote-definition (nth 2 x) (nth 1 x)))
- ;; org-e-html-footnotes-alist "\n"))))
- (defun org-e-html-bibliography ()
- (org-export-e-html-get-bibliography))
- (defun org-e-html-postamble (info)
- (concat
- (when (and (not body-only)
- (plist-get info :html-postamble))
- (let* ((html-post (plist-get info :html-postamble))
- (date (org-e-html-format-date info))
- (author (plist-get info :author))
- (email (plist-get info :email))
- (lang-words (or (assoc (plist-get info :language)
- org-export-language-setup)
- (assoc "en" org-export-language-setup)))
- (email
- (mapconcat (lambda(e)
- (format "<a href=\"mailto:%s\">%s</a>" e e))
- (split-string email ",+ *")
- ", "))
- (html-validation-link (or org-export-e-html-validation-link ""))
- (creator-info
- (concat "Org version " org-version " with Emacs version "
- (number-to-string emacs-major-version))))
- (concat
- ;; begin postamble
- "
- <div id=\"" (nth 2 org-export-e-html-divs) "\">"
- (cond
- ;; auto postamble
- ((eq (plist-get info :html-postamble) 'auto)
- (concat
- (when (plist-get info :time-stamp-file)
- (format "
- <p class=\"date\"> %s: %s </p> " (nth 2 lang-words) date))
- (when (and (plist-get info :with-author) author)
- (format "
- <p class=\"author\"> %s : %s</p>" (nth 1 lang-words) author))
- (when (and (plist-get info :with-email) email)
- (format "
- <p class=\"email\"> %s </p>" email))
- (when (plist-get info :with-creator)
- (format "
- <p class=\"creator\"> %s </p>" creator-info))
- html-validation-link "\n"))
- ;; postamble from a string
- ((stringp (plist-get info :html-postamble))
- (format-spec (plist-get info :html-postamble)
- `((?a . ,author) (?e . ,email)
- (?d . ,date) (?c . ,creator-info)
- (?v . ,html-validation-link))))
- ;; postamble from a function
- ((functionp (plist-get info :html-postamble))
- (with-temp-buffer
- (funcall (plist-get info :html-postamble))
- (buffer-string)))
- ;; default postamble
- (t
- (format-spec
- (or (cadr (assoc (nth 0 lang-words)
- org-export-e-html-postamble-format))
- (cadr (assoc "en" org-export-e-html-postamble-format)))
- `((?a . ,author) (?e . ,email)
- (?d . ,date) (?c . ,creator-info)
- (?v . ,html-validation-link)))))
- "
- </div>")))
- org-export-e-html-html-helper-timestamp))
- (defun org-e-html-template (contents info)
- "Return complete document string after HTML conversion.
- CONTENTS is the transcoded contents string. RAW-DATA is the
- original parsed data. INFO is a plist holding export options."
- (concat
- (format
- (or (and (stringp org-export-e-html-xml-declaration)
- org-export-e-html-xml-declaration)
- (cdr (assoc (plist-get info :html-extension)
- org-export-e-html-xml-declaration))
- (cdr (assoc "html" org-export-e-html-xml-declaration))
- "")
- (or (and coding-system-for-write
- (fboundp 'coding-system-get)
- (coding-system-get coding-system-for-write
- 'mime-charset))
- "iso-8859-1"))
- "
- <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
- \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"
- (format "
- <html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"%s\" xml:lang=\"%s\"> "
- (plist-get info :language) (plist-get info :language))
- "
- <head>"
- (org-e-html-meta-info info) ; meta
- (org-e-html-style info) ; style
- (org-e-html-mathjax info) ; mathjax
- "
- </head>"
- "
- <body>"
- (let ((link-up (and (plist-get info :link-up)
- (string-match "\\S-" (plist-get info :link-up))
- (plist-get info :link-up)))
- (link-home (and (plist-get info :link-home)
- (string-match "\\S-" (plist-get info :link-home))
- (plist-get info :link-home))))
- (when (or link-up link-home)
- (format org-export-e-html-home/up-format
- (or link-up link-home)
- (or link-home link-up))))
- ;; preamble
- (org-e-html-preamble info)
- ;; content
- (format "
- <div id=\"%s\">" (or org-export-e-html-content-div
- (nth 1 org-export-e-html-divs)))
- (format "
- <h1 class=\"title\"> %s </h1>\n" (plist-get info :title))
- contents
- (org-e-html-footnote-section info)
- (org-e-html-bibliography)
- (unless body-only
- "
- </div>")
- ;; postamble
- (org-e-html-postamble info)
- (unless body-only
- "
- </body>")
- "
- </html>"))
- ;;; Transcode Functions
- ;;;; Block
- (defun org-e-html-center-block (center-block contents info)
- "Transcode a CENTER-BLOCK element from Org to HTML.
- CONTENTS holds the contents of the block. INFO is a plist
- holding contextual information."
- ;; (org-e-html--wrap-label
- ;; center-block
- ;; (format "\\begin{center}\n%s\\end{center}" contents))
- (org-e-html--wrap-label
- center-block
- (format "<div style=\"text-align: center\">\n%s</div>" contents)))
- ;;;; Comment
- ;; Comments are ignored.
- ;;;; Comment Block
- ;; Comment Blocks are ignored.
- ;;;; Drawer
- (defun org-e-html-drawer (drawer contents info)
- "Transcode a DRAWER element from Org to HTML.
- CONTENTS holds the contents of the block. INFO is a plist
- holding contextual information."
- (let* ((name (org-element-get-property :drawer-name drawer))
- (output (if (functionp org-e-html-format-drawer-function)
- (funcall org-e-html-format-drawer-function
- name contents)
- ;; If there's no user defined function: simply
- ;; display contents of the drawer.
- contents)))
- (org-e-html--wrap-label drawer output)))
- ;;;; Dynamic Block
- (defun org-e-html-dynamic-block (dynamic-block contents info)
- "Transcode a DYNAMIC-BLOCK element from Org to HTML.
- CONTENTS holds the contents of the block. INFO is a plist
- holding contextual information. See
- `org-export-data'."
- (org-e-html--wrap-label dynamic-block contents))
- ;;;; Emphasis
- (defun org-e-html-emphasis (emphasis contents info)
- "Transcode EMPHASIS from Org to HTML.
- CONTENTS is the contents of the emphasized text. INFO is a plist
- holding contextual information.."
- ;; (format (cdr (assoc (org-element-get-property :marker emphasis)
- ;; org-e-html-emphasis-alist))
- ;; contents)
- (org-e-html-format-fontify
- contents (cadr (assoc
- (org-element-get-property :marker emphasis)
- '(("*" bold)
- ("/" emphasis)
- ("_" underline)
- ("=" code)
- ("~" verbatim)
- ("+" strike))))))
- ;;;; Entity
- (defun org-e-html-entity (entity contents info)
- "Transcode an ENTITY object from Org to HTML.
- CONTENTS are the definition itself. INFO is a plist holding
- contextual information."
- ;; (let ((ent (org-element-get-property :latex entity)))
- ;; (if (org-element-get-property :latex-math-p entity)
- ;; (format "$%s$" ent)
- ;; ent))
- (org-element-get-property :html entity))
- ;;;; Example Block
- ;; (defun org-odt-format-source-code-or-example-colored
- ;; (lines lang caption textareap cols rows num cont rpllbl fmt))
- (defun org-e-html-format-source-code-or-example-plain
- (lines lang caption textareap cols rows num cont rpllbl fmt)
- (setq lines
- (concat
- "<pre class=\"example\">\n"
- (cond
- (textareap
- (concat
- (format "<p>\n<textarea cols=\"%d\" rows=\"%d\">"
- cols rows)
- lines "</textarea>\n</p>\n"))
- (t
- (with-temp-buffer
- (insert lines)
- (goto-char (point-min))
- (while (re-search-forward "[<>&]" nil t)
- (replace-match (cdr (assq (char-before)
- '((?&."&")(?<."<")(?>.">"))))
- t t))
- (buffer-string))))
- "</pre>\n"))
- (unless textareap
- (setq lines (org-export-number-lines lines 1 1 num cont rpllbl fmt)))
- ;; (when (string-match "\\(\\`<[^>]*>\\)\n" lines)
- ;; (setq lines (replace-match "\\1" t nil lines)))
- lines)
- (defun org-e-html-format-source-code-or-example-colored
- (lines lang caption textareap cols rows num cont rpllbl fmt)
- (let* ((lang-m (when lang
- (or (cdr (assoc lang org-src-lang-modes))
- lang)))
- (mode (and lang-m (intern
- (concat
- (if (symbolp lang-m)
- (symbol-name lang-m)
- lang-m)
- "-mode"))))
- (org-inhibit-startup t)
- (org-startup-folded nil))
- (setq lines
- (with-temp-buffer
- (insert lines)
- (if (functionp mode)
- (funcall mode)
- (fundamental-mode))
- (font-lock-fontify-buffer)
- ;; markup each line separately
- (org-remove-formatting-on-newlines-in-region
- (point-min) (point-max))
- (org-src-mode)
- (set-buffer-modified-p nil)
- (org-export-e-htmlize-region-for-paste
- (point-min) (point-max))))
- (when (string-match "<pre\\([^>]*\\)>\n*" lines)
- (setq lines (replace-match
- (format "<pre class=\"src src-%s\">\n" lang) t t lines)))
- (when caption
- (setq lines
- (concat
- "<div class=\"org-src-container\">"
- (format "<label class=\"org-src-name\">%s</label>" caption)
- lines "</div>")))
- (unless textareap
- (setq lines (org-export-number-lines lines 1 1 num cont rpllbl fmt)))
- ;; (when (string-match "\\(\\`<[^>]*>\\)\n" lines)
- ;; (setq lines (replace-match "\\1" t nil lines)))
- lines))
- (defun org-e-html-format-source-code-or-example
- (lang code &optional opts indent caption)
- "Format CODE from language LANG and return it formatted for export.
- The CODE is marked up in `org-export-current-backend' format.
- Check if a function by name
- \"org-<backend>-format-source-code-or-example\" is bound. If yes,
- use it as the custom formatter. Otherwise, use the default
- formatter. Default formatters are provided for docbook, html,
- latex and ascii backends. For example, use
- `org-e-html-format-source-code-or-example' to provide a custom
- formatter for export to \"html\".
- If LANG is nil, do not add any fontification.
- OPTS contains formatting options, like `-n' for triggering numbering lines,
- and `+n' for continuing previous numbering.
- Code formatting according to language currently only works for HTML.
- Numbering lines works for all three major backends (html, latex, and ascii).
- INDENT was the original indentation of the block."
- (save-match-data
- (let* ((backend-formatter 'org-e-html-format-source-code-or-example-plain)
- num cont rtn rpllbl keepp textareap preserve-indentp cols rows fmt)
- (setq opts (or opts "")
- num (string-match "[-+]n\\>" opts)
- cont (string-match "\\+n\\>" opts)
- rpllbl (string-match "-r\\>" opts)
- keepp (string-match "-k\\>" opts)
- textareap (string-match "-t\\>" opts)
- preserve-indentp (or org-src-preserve-indentation
- (string-match "-i\\>" opts))
- cols (if (string-match "-w[ \t]+\\([0-9]+\\)" opts)
- (string-to-number (match-string 1 opts))
- 80)
- rows (if (string-match "-h[ \t]+\\([0-9]+\\)" opts)
- (string-to-number (match-string 1 opts))
- (org-count-lines code))
- fmt (if (string-match "-l[ \t]+\"\\([^\"\n]+\\)\"" opts)
- (match-string 1 opts)))
- (when (and textareap
- ;; (eq org-export-current-backend 'html)
- )
- ;; we cannot use numbering or highlighting.
- (setq num nil cont nil lang nil))
- (if keepp (setq rpllbl 'keep))
- (setq rtn (if preserve-indentp code (org-remove-indentation code)))
- (when (string-match "^," rtn)
- (setq rtn (with-temp-buffer
- (insert rtn)
- ;; Free up the protected lines
- (goto-char (point-min))
- (while (re-search-forward "^," nil t)
- (if (or (equal lang "org")
- (save-match-data
- (looking-at "\\([*#]\\|[ \t]*#\\+\\)")))
- (replace-match ""))
- (end-of-line 1))
- (buffer-string))))
- (when lang
- (if (featurep 'xemacs)
- (require 'htmlize)
- (require 'htmlize nil t)))
- (setq backend-formatter
- (cond
- ((fboundp 'htmlize-region-for-paste)
- 'org-e-html-format-source-code-or-example-colored)
- (t
- (message
- "htmlize.el 1.34 or later is needed for source code formatting")
- 'org-e-html-format-source-code-or-example-plain)))
- (funcall backend-formatter rtn lang caption textareap cols rows
- num cont rpllbl fmt))))
- (defun org-e-html-example-block (example-block contents info)
- "Transcode a EXAMPLE-BLOCK element from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (let* ((options (or (org-element-get-property :options example-block) ""))
- (value (org-export-handle-code example-block info)))
- ;; (org-e-html--wrap-label
- ;; example-block (format "\\begin{verbatim}\n%s\\end{verbatim}" value))
- (org-e-html--wrap-label
- example-block (org-e-html-format-source-code-or-example nil value))))
- ;;;; Export Snippet
- (defun org-e-html-export-snippet (export-snippet contents info)
- "Transcode a EXPORT-SNIPPET object from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (org-element-get-property :value export-snippet))
- ;;;; Export Block
- (defun org-e-html-export-block (export-block contents info)
- "Transcode a EXPORT-BLOCK element from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (when (string= (org-element-get-property :type export-block) "latex")
- (org-remove-indentation (org-element-get-property :value export-block))))
- ;;;; Fixed Width
- (defun org-e-html-fixed-width (fixed-width contents info)
- "Transcode a FIXED-WIDTH element from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (let* ((value (org-element-normalize-string
- (replace-regexp-in-string
- "^[ \t]*: ?" ""
- (org-element-get-property :value fixed-width)))))
- ;; (org-e-html--wrap-label
- ;; fixed-width (format "\\begin{verbatim}\n%s\\end{verbatim}" value))
- (org-e-html--wrap-label
- fixed-width (org-e-html-format-source-code-or-example nil value)) ;; FIXME
- ))
- ;;;; Footnote Definition
- ;; Footnote Definitions are ignored.
- ;;;; Footnote Reference
- (defun org-e-html-footnote-reference (footnote-reference contents info)
- "Transcode a FOOTNOTE-REFERENCE element from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (concat
- ;; Insert separator between two footnotes in a row.
- (let ((prev (org-export-get-previous-element footnote-reference info)))
- (when (and (listp prev) (eq (car prev) 'footnote-reference))
- org-e-html-footnote-separator))
- ;; Use \footnotemark if the footnote has already been defined.
- ;; Otherwise, define it with \footnote command.
- (cond
- ((not (org-export-footnote-first-reference-p footnote-reference info))
- ;; (format "\\footnotemark[%s]"
- ;; (org-export-get-footnote-number footnote-reference info))
- (org-e-html-format-footnote-reference
- (org-export-get-footnote-number footnote-reference info)
- "FIXME" 100) ;; FIXME
- )
- ;; Inline definitions are secondary strings.
- ((eq (org-element-get-property :type footnote-reference) 'inline)
- ;; (format "\\footnote{%s}"
- ;; (org-trim
- ;; (org-export-secondary-string
- ;; (org-export-get-footnote-definition footnote-reference info)
- ;; 'e-html info)))
- (let ((n (org-export-get-footnote-number footnote-reference info))
- (def (format
- "<p>%s</p>"
- (org-trim
- (org-export-secondary-string
- (org-export-get-footnote-definition footnote-reference info)
- 'e-html info)))))
- (push (cons n def) org-e-html-footnotes-alist)
- (org-e-html-format-footnote-reference n def 1)))
- ;; Non-inline footnotes definitions are full Org data.
- (t
- ;; (format "\\footnote{%s}"
- ;; (org-trim
- ;; (org-export-data
- ;; (org-export-get-footnote-definition footnote-reference info)
- ;; 'e-html info)))
- (let ((n (org-export-get-footnote-number footnote-reference info))
- (def (org-trim
- (org-export-data
- (org-export-get-footnote-definition footnote-reference info)
- 'e-html info))))
- (push (cons n def) org-e-html-footnotes-alist)
- (org-e-html-format-footnote-reference n def 1))
- ))))
- ;;;; Headline
- (defun org-e-html-todo (todo)
- (when todo
- (org-e-html-format-fontify
- (concat
- ;; (ignore-errors (org-lparse-get 'TODO-KWD-CLASS-PREFIX))
- org-export-e-html-todo-kwd-class-prefix
- (org-e-html-fix-class-name todo))
- (list (if (member todo org-done-keywords) "done" "todo")
- todo))))
- (defun org-e-html-headline (headline contents info)
- "Transcode an HEADLINE element from Org to HTML.
- CONTENTS holds the contents of the headline. INFO is a plist
- holding contextual information."
- (let* ((class (plist-get info :latex-class))
- (numberedp (plist-get info :section-numbers))
- ;; Get level relative to current parsed data.
- (level (org-export-get-relative-level headline info))
- (class-sectionning (assoc class org-e-html-classes))
- ;; Section formatting will set two placeholders: one for the
- ;; title and the other for the contents.
- (section-fmt
- (let ((sec (if (and (symbolp (nth 2 class-sectionning))
- (fboundp (nth 2 class-sectionning)))
- (funcall (nth 2 class-sectionning) level numberedp)
- (nth (1+ level) class-sectionning))))
- (cond
- ;; No section available for that LEVEL.
- ((not sec) nil)
- ;; Section format directly returned by a function.
- ((stringp sec) sec)
- ;; (numbered-section . unnumbered-section)
- ((not (consp (cdr sec)))
- (concat (funcall (if numberedp #'car #'cdr) sec) "\n%s"))
- ;; (numbered-open numbered-close)
- ((= (length sec) 2)
- (when numberedp (concat (car sec) "\n%s" (nth 1 sec))))
- ;; (num-in num-out no-num-in no-num-out)
- ((= (length sec) 4)
- (if numberedp
- (concat (car sec) "\n%s" (nth 1 sec))
- (concat (nth 2 sec) "\n%s" (nth 3 sec)))))))
- (text (org-export-secondary-string
- (org-element-get-property :title headline) 'e-html info))
- (todo (and (plist-get info :with-todo-keywords)
- (let ((todo (org-element-get-property
- :todo-keyword headline)))
- (and todo
- (org-export-secondary-string todo 'e-html info)))))
- (todo-type (and todo (org-element-get-property :todo-type headline)))
- (tags (and (plist-get info :with-tags)
- (org-element-get-property :tags headline)))
- (priority (and (plist-get info :with-priority)
- (org-element-get-property :priority headline)))
- ;; Create the headline text.
- (full-text (if (functionp org-e-html-format-headline-function)
- ;; User-defined formatting function.
- (funcall org-e-html-format-headline-function
- todo todo-type priority text tags)
- ;; Default formatting.
- (concat
- ;; (when todo
- ;; (format "\\textbf{\\textsf{\\textsc{%s}}} " todo))
- (org-e-html-todo todo) " "
- (when priority (format "\\framebox{\\#%c} " priority))
- text
- ;; (when tags (format "\\hfill{}\\textsc{%s}" tags))
- )))
- ;; Associate some \label to the headline for internal links.
- ;; (headline-label
- ;; (format "\\label{sec-%s}\n"
- ;; (mapconcat 'number-to-string
- ;; (org-export-get-headline-number headline info)
- ;; "-")))
- ;; FIXME - begin
- (headline-no (org-export-get-headline-number headline info))
- (headline-label
- (format "sec-%s" (mapconcat 'number-to-string headline-no "-")))
- (headline-labels (list headline-label))
- (headline-no (org-export-get-headline-number headline info))
- (section-no (mapconcat 'number-to-string headline-no "."))
- ;; FIXME - end
- (pre-blanks (make-string
- (org-element-get-property :pre-blank headline) 10)))
- (cond
- ;; Case 1: This is a footnote section: ignore it.
- ((org-element-get-property :footnote-section-p headline) nil)
- ;; Case 2. This is a deep sub-tree: export it as a list item.
- ;; Also export as items headlines for which no section
- ;; format has been found.
- ;; ((or (not section-fmt) (org-export-low-level-p headline info)) FIXME
- ;; ;; Build the real contents of the sub-tree.
- ;; (let ((low-level-body
- ;; (concat
- ;; ;; If the headline is the first sibling, start a list.
- ;; (when (org-export-first-sibling-p headline info)
- ;; (format "\\begin{%s}\n" (if numberedp 'enumerate 'itemize)))
- ;; ;; Itemize headline
- ;; "\\item " full-text "\n" headline-label pre-blanks contents)))
- ;; ;; If headline in the last sibling, close the list, before any
- ;; ;; blank line. Otherwise, simply return LOW-LEVEL-BODY.
- ;; (if (org-export-last-sibling-p headline info)
- ;; (replace-regexp-in-string
- ;; "[ \t\n]*\\'"
- ;; (format "\n\\\\end{%s}" (if numberedp 'enumerate 'itemize))
- ;; low-level-body)
- ;; low-level-body)))
- ;; Case 3. Standard headline. Export it as a section.
- (t
- ;; (format section-fmt full-text
- ;; (concat headline-label pre-blanks contents))
- (org-e-html-format-outline contents level section-no full-text tags
- (car (last headline-labels))
- (butlast headline-labels) nil)))))
- ;;;; Horizontal Rule
- (defun org-e-html-horizontal-rule (horizontal-rule contents info)
- "Transcode an HORIZONTAL-RULE object from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (let ((attr (mapconcat #'identity
- (org-element-get-property :attr_html horizontal-rule)
- " ")))
- (org-e-html--wrap-label horizontal-rule
- (org-e-html-format-horizontal-line))))
- ;;;; Inline Babel Call
- ;; Inline Babel Calls are ignored.
- ;;;; Inline Src Block
- (defun org-e-html-inline-src-block (inline-src-block contents info)
- "Transcode an INLINE-SRC-BLOCK element from Org to HTML.
- CONTENTS holds the contents of the item. INFO is a plist holding
- contextual information."
- (let* ((code (org-element-get-property :value inline-src-block))
- (separator (org-e-html--find-verb-separator code)))
- (cond
- ;; Do not use a special package: transcode it verbatim.
- ((not org-e-html-listings)
- (concat "\\verb" separator code separator))
- ;; Use minted package.
- ((eq org-e-html-listings 'minted)
- (let* ((org-lang (org-element-get-property :language inline-src-block))
- (mint-lang (or (cadr (assq (intern org-lang)
- org-e-html-minted-langs))
- org-lang))
- (options (org-e-html--make-option-string
- org-e-html-minted-options)))
- (concat (format "\\mint%s{%s}"
- (if (string= options "") "" (format "[%s]" options))
- mint-lang)
- separator code separator)))
- ;; Use listings package.
- (t
- ;; Maybe translate language's name.
- (let* ((org-lang (org-element-get-property :language inline-src-block))
- (lst-lang (or (cadr (assq (intern org-lang)
- org-e-html-listings-langs))
- org-lang))
- (options (org-e-html--make-option-string
- (append org-e-html-listings-options
- `(("language" ,lst-lang))))))
- (concat (format "\\lstinline[%s]" options)
- separator code separator))))))
- ;;;; Inlinetask
- (defun org-e-html-format-section (text class &optional id)
- (let ((extra (concat (when id (format " id=\"%s\"" id)))))
- (concat (format "<div class=\"%s\"%s>\n" class extra) text "</div>\n")))
- (defun org-e-html-inlinetask (inlinetask contents info)
- "Transcode an INLINETASK element from Org to HTML.
- CONTENTS holds the contents of the block. INFO is a plist
- holding contextual information."
- (let ((title (org-export-secondary-string
- (org-element-get-property :title inlinetask) 'e-html info))
- (todo (and (plist-get info :with-todo-keywords)
- (let ((todo (org-element-get-property
- :todo-keyword inlinetask)))
- (and todo
- (org-export-secondary-string todo 'e-html info)))))
- (todo-type (org-element-get-property :todo-type inlinetask))
- (tags (and (plist-get info :with-tags)
- (org-element-get-property :tags inlinetask)))
- (priority (and (plist-get info :with-priority)
- (org-element-get-property :priority inlinetask))))
- ;; If `org-e-html-format-inlinetask-function' is provided, call it
- ;; with appropriate arguments.
- (if (functionp org-e-html-format-inlinetask-function)
- (funcall org-e-html-format-inlinetask-function
- todo todo-type priority title tags contents)
- ;; Otherwise, use a default template.
- (org-e-html--wrap-label
- inlinetask
- (let ((full-title
- (concat
- (when todo (format "\\textbf{\\textsf{\\textsc{%s}}} " todo))
- (when priority (format "\\framebox{\\#%c} " priority))
- title
- (when tags (format "\\hfill{}\\textsc{%s}" tags)))))
- (format (concat "\\begin{center}\n"
- "\\fbox{\n"
- "\\begin{minipage}[c]{.6\\textwidth}\n"
- "%s\n\n"
- "\\rule[.8em]{\\textwidth}{2pt}\n\n"
- "%s"
- "\\end{minipage}\n"
- "}\n"
- "\\end{center}")
- full-title contents))))))
- ;;;; Item
- (defun org-e-html-format-list-item (contents type &optional arg headline)
- (setq headline nil) ; FIXME
- (concat
- (case type
- (ordered
- (let* ((counter arg)
- (extra (if counter (format " value=\"%s\"" counter) "")))
- (format "<li%s>" extra)))
- (unordered
- (let* ((id arg)
- (extra (if id (format " id=\"%s\"" id) "")))
- (concat
- (format "<li%s>" extra)
- (when headline (concat headline "<br/>")))))
- (descriptive
- (let* ((desc-tag (or arg "(no term)")))
- (concat (format "<dt> %s </dt>" desc-tag) "<dd>"))))
- contents
- (case type
- (ordered "</li>")
- (unordered "</li>")
- (descriptive "</dd>"))))
- (defun org-e-html-item (item contents info)
- "Transcode an ITEM element from Org to HTML.
- CONTENTS holds the contents of the item. INFO is a plist holding
- contextual information."
- ;; Grab `:level' from plain-list properties, which is always the
- ;; first element above current item.
- (let* ((plain-list (car (org-export-get-genealogy item info)))
- (type (org-element-get-property :type plain-list))
- (level (org-element-get-property
- :level (car (plist-get info :genealogy))))
- (counter (let ((count (org-element-get-property :counter item)))
- (and count
- (< level 4)
- (format "\\setcounter{enum%s}{%s}\n"
- (nth level '("i" "ii" "iii" "iv"))
- (1- count)))))
- (checkbox (let ((checkbox (org-element-get-property :checkbox item)))
- (cond ((eq checkbox 'on) "$\\boxtimes$ ")
- ((eq checkbox 'off) "$\\Box$ ")
- ((eq checkbox 'trans) "$\\boxminus$ "))))
- (tag (let ((tag (org-element-get-property :tag item)))
- (and tag
- (format "[%s]" (org-export-secondary-string
- tag 'e-html info))))))
- ;; (concat counter "\\item" tag " " checkbox contents)
- (org-e-html-format-list-item contents type nil)
- ))
- ;;;; Keyword
- (defun org-e-html-keyword (keyword contents info)
- "Transcode a KEYWORD element from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (let ((key (downcase (org-element-get-property :key keyword)))
- (value (org-element-get-property :value keyword)))
- (cond
- ((string= key "latex") value)
- ((string= key "index") (format "\\index{%s}" value))
- ((string= key "target")
- (format "\\label{%s}" (org-export-solidify-link-text value)))
- ((string= key "toc")
- (let ((value (downcase value)))
- (cond
- ((string-match "\\<headlines\\>" value)
- (let ((depth (or (and (string-match "[0-9]+" value)
- (string-to-number (match-string 0 value)))
- (plist-get info :with-toc))))
- (concat
- (when (wholenump depth)
- (format "\\setcounter{tocdepth}{%s}\n" depth))
- "\\tableofcontents")))
- ((string= "tables" value) "\\listoftables")
- ((string= "figures" value) "\\listoffigures")
- ((string= "listings" value)
- (cond
- ((eq org-e-html-listings 'minted) "\\listoflistings")
- (org-e-html-listings "\\lstlistoflistings")
- ;; At the moment, src blocks with a caption are wrapped
- ;; into a figure environment.
- (t "\\listoffigures")))))))))
- ;;;; Latex Environment
- (defun org-e-html-format-latex (latex-frag processing-type)
- (let* ((cache-relpath
- (concat "ltxpng/" (file-name-sans-extension
- (file-name-nondirectory (buffer-file-name)))))
- (cache-dir (file-name-directory (buffer-file-name )))
- (display-msg "Creating LaTeX Image..."))
- (with-temp-buffer
- (insert latex-frag)
- (org-format-latex cache-relpath cache-dir nil display-msg
- nil nil processing-type)
- (buffer-string))))
- (defun org-e-html-latex-environment (latex-environment contents info)
- "Transcode a LATEX-ENVIRONMENT element from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- ;; (org-e-html--wrap-label
- ;; latex-environment
- ;; (org-remove-indentation (org-element-get-property :value latex-environment)))
- (org-e-html--wrap-label
- latex-environment
- (let ((latex-frag
- (org-remove-indentation
- (org-element-get-property :value latex-environment)))
- (processing-type (plist-get info :LaTeX-fragments)))
- (cond
- ((member processing-type '(t mathjax))
- (org-e-html-format-latex latex-frag 'mathjax))
- ((equal processing-type 'dvipng)
- (let* ((formula-link (org-e-html-format-latex
- latex-frag processing-type)))
- (when (and formula-link
- (string-match "file:\\([^]]*\\)" formula-link))
- (setq formula-file (match-string 1 formula-link))
- (org-e-html-format-inline-image formula-file))))
- (t
- latex-frag)))))
- ;;;; Latex Fragment
- (defun org-e-html-latex-fragment (latex-fragment contents info)
- "Transcode a LATEX-FRAGMENT object from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- ;; (org-element-get-property :value latex-fragment)
- (let* ((latex-frag (org-element-get-property :value latex-fragment)))
- (cond
- ((string-match "\\\\ref{\\([^{}\n]+\\)}" latex-frag)
- (let* ((label (match-string 1 latex-frag))
- (href (and label (org-export-solidify-link-text label)))
- (text (if (string-match "\\`[a-z]\\{1,10\\}:\\(.+\\)" label)
- (substring label (match-beginning 1))
- label)))
- (org-e-html-format-internal-link text href)))
- (t
- (let ((processing-type (plist-get info :LaTeX-fragments)))
- (cond
- ((member processing-type '(t mathjax))
- (org-e-html-format-latex latex-frag 'mathjax))
- ((equal processing-type 'dvipng)
- (let* ((formula-link (org-e-html-format-latex
- latex-frag processing-type)))
- (when (and formula-link
- (string-match "file:\\([^]]*\\)" formula-link))
- (setq formula-file (match-string 1 formula-link))
- (org-e-html-format-inline-image formula-file))))
- (t
- latex-frag)))))))
- ;;;; Line Break
- (defun org-e-html-line-break (line-break contents info)
- "Transcode a LINE-BREAK object from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- "<br/>")
- ;;;; Link
- (defun org-e-html-link--inline-image (link info)
- "Return HTML code for an inline image.
- LINK is the link pointing to the inline image. INFO is a plist
- used as a communication channel."
- (let* ((parent (org-export-get-parent-paragraph link info))
- (path (let ((raw-path (org-element-get-property :path link)))
- (if (not (file-name-absolute-p raw-path)) raw-path
- (expand-file-name raw-path))))
- (caption (org-e-html--caption/label-string
- (org-element-get-property :caption parent)
- (org-element-get-property :name parent)
- info))
- (label (org-element-get-property :name parent))
- ;; Retrieve latex attributes from the element around.
- (attr (let ((raw-attr
- (mapconcat #'identity
- (org-element-get-property :attr_html parent)
- " ")))
- (unless (string= raw-attr "") raw-attr)))
- (disposition
- (cond
- ((and attr (string-match "\\<wrap\\>" attr)) 'wrap)
- ((and attr (string-match "\\<multicolumn\\>" attr)) 'multicolumn)
- ((or (and attr (string-match "\\<float\\>" attr))
- (not (string= caption "")))
- 'float)))
- (placement
- (cond
- ((and attr (string-match "\\<placement=\\(\\S-+\\)" attr))
- (org-match-string-no-properties 1 attr))
- ((eq disposition 'wrap) "{l}{0.5\\textwidth}")
- ((eq disposition 'float)
- (concat "[" org-e-html-default-figure-position "]"))
- (t ""))))
- ;; Now clear ATTR from any special keyword and set a default
- ;; value if nothing is left.
- (setq attr
- (if (not attr) ""
- (org-trim
- (replace-regexp-in-string
- "\\(wrap\\|multicolumn\\|float\\|placement=\\S-+\\)" "" attr))))
- (setq attr (cond ((not (string= attr "")) attr)
- ((eq disposition 'float) "width=0.7\\textwidth")
- ((eq disposition 'wrap) "width=0.48\\textwidth")
- (t (or org-e-html-image-default-option ""))))
- ;; Return proper string, depending on DISPOSITION.
- (case disposition
- (wrap (format "\\begin{wrapfigure}%s
- \\centering
- \\includegraphics[%s]{%s}
- %s\\end{wrapfigure}" placement attr path caption))
- (mulicolumn (format "\\begin{figure*}%s
- \\centering
- \\includegraphics[%s]{%s}
- %s\\end{figure*}" placement attr path caption))
- (float (format "\\begin{figure}%s
- \\centering
- \\includegraphics[%s]{%s}
- %s\\end{figure}" placement attr path caption))
- (t (format "\\includegraphics[%s]{%s}" attr path)))
- (let ((href (and label (org-export-solidify-link-text label))))
- (org-e-html-format-inline-image path caption href attr))))
- (defun org-e-html-link (link desc info)
- "Transcode a LINK object from Org to HTML.
- DESC is the description part of the link, or the empty string.
- INFO is a plist holding contextual information. See
- `org-export-data'."
- (let* ((type (org-element-get-property :type link))
- (raw-path (org-element-get-property :path link))
- ;; Ensure DESC really exists, or set it to nil.
- (desc (and (not (string= desc "")) desc))
- (imagep (org-export-inline-image-p
- link org-e-html-inline-image-rules))
- (path (cond
- ((member type '("http" "https" "ftp" "mailto"))
- (concat type ":" raw-path))
- ((string= type "file")
- (when (string-match "\\(.+\\)::.+" raw-path)
- (setq raw-path (match-string 1 raw-path)))
- (if (file-name-absolute-p raw-path)
- (concat "file://" (expand-file-name raw-path))
- ;; TODO: Not implemented yet. Concat also:
- ;; (org-export-directory :HTML info)
- (concat "file://" raw-path)))
- (t raw-path)))
- protocol)
- (cond
- ;; Image file.
- (imagep (org-e-html-link--inline-image link info))
- ;; Target or radioed target: replace link with the normalized
- ;; custom-id/target name.
- ((member type '("target" "radio"))
- ;; (format "\\hyperref[%s]{%s}"
- ;; (org-export-solidify-link-text path)
- ;; (or desc (org-export-secondary-string path 'e-html info)))
- (org-e-html-format-internal-link
- (or desc (org-export-secondary-string path 'e-html info))
- (org-export-solidify-link-text path)))
- ;; Links pointing to an headline: Find destination and build
- ;; appropriate referencing commanding.
- ((member type '("custom-id" "fuzzy" "id"))
- (let ((destination (if (string= type "fuzzy")
- (org-export-resolve-fuzzy-link link info)
- (org-export-resolve-id-link link info))))
- ;; Fuzzy link points to a target. Do as above.
- (case (car destination)
- (target
- ;; (format "\\hyperref[%s]{%s}"
- ;; (org-export-solidify-link-text
- ;; (org-element-get-property :raw-value destination))
- ;; (or desc
- ;; (org-export-secondary-string
- ;; (org-element-get-property :raw-link link)
- ;; 'e-html info)))
- (org-e-html-format-internal-link
- (or desc
- (org-export-secondary-string
- (org-element-get-property :raw-link link)
- 'e-html info))
- (org-export-solidify-link-text
- (org-element-get-property :raw-value destination))))
- ;; Fuzzy link points to an headline. If headlines are
- ;; numbered and the link has no description, display
- ;; headline's number. Otherwise, display description or
- ;; headline's title.
- (headline
- (let ((label
- (format "sec-%s"
- (mapconcat
- 'number-to-string
- (org-export-get-headline-number destination info)
- "-"))))
- (if (and (plist-get info :section-numbers) (not desc))
- (format "\\ref{%s}" label)
- ;; (format "\\hyperref[%s]{%s}" label
- ;; (or desc
- ;; (org-export-secondary-string
- ;; (org-element-get-property :title destination)
- ;; 'e-html info)))
- (org-e-html-format-internal-link
- (or desc
- (org-export-secondary-string
- (org-element-get-property :title destination)
- 'e-html info)) label))))
- ;; Fuzzy link points nowhere.
- (otherwise
- ;; (format "\\texttt{%s}"
- ;; (or desc
- ;; (org-export-secondary-string
- ;; (org-element-get-property :raw-link link)
- ;; 'e-html info)))
- (org-e-html-format-fontify
- (or desc
- (org-export-secondary-string
- (org-element-get-property :raw-link link)
- 'e-html info)) 'emphasis)))))
- ;; Coderef: replace link with the reference name or the
- ;; equivalent line number.
- ((string= type "coderef")
- (format (org-export-get-coderef-format path (or desc ""))
- (org-export-resolve-coderef path info)))
- ;; Link type is handled by a special function.
- ((functionp (setq protocol (nth 2 (assoc type org-link-protocols))))
- (funcall protocol (org-link-unescape path) desc 'html))
- ;; External link with a description part.
- ((and path desc)
- ;; (format "\\href{%s}{%s}" path desc)
- (org-e-html-format-link desc path))
- ;; External link without a description part.
- (path
- ;; (format "\\url{%s}" path)
- (org-e-html-format-link path path))
- ;; No path, only description. Try to do something useful.
- (t
- ;; (format "\\texttt{%s}" desc)
- (org-e-html-format-fontify desc 'emphasis)))))
- ;;;; Babel Call
- ;; Babel Calls are ignored.
- ;;;; Macro
- (defun org-e-html-macro (macro contents info)
- "Transcode a MACRO element from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- ;; Use available tools.
- (org-export-expand-macro macro info))
- ;;;; Paragraph
- (defun org-e-html-paragraph (paragraph contents info)
- "Transcode a PARAGRAPH element from Org to HTML.
- CONTENTS is the contents of the paragraph, as a string. INFO is
- the plist used as a communication channel."
- (let* ((style nil) ; FIXME
- (class (cdr (assoc style '((footnote . "footnote")
- (verse . nil)))))
- (extra (if class (format " class=\"%s\"" class) ""))
- (parent (car (org-export-get-genealogy paragraph info))))
- (cond
- ;; is this the first paragraph in a list item
- ;; (plain-list (car (org-export-get-genealogy item info)))
- ;; (type (org-element-get-property :type plain-list))
- ((and (equal parent 'item)
- (= (org-element-get-property :begin paragraph)
- (plist-get (plist-get info :parent-properties)
- :contents-begin)))
- contents)
- (t
- (concat (format "<p%s> " extra) contents "</p>")))))
- ;;;; Plain List
- (defun org-e-html-plain-list (plain-list contents info)
- "Transcode a PLAIN-LIST element from Org to HTML.
- CONTENTS is the contents of the list. INFO is a plist holding
- contextual information."
- (let* ((type (org-element-get-property :type plain-list))
- (paralist-types '("inparaenum" "asparaenum" "inparaitem" "asparaitem"
- "inparadesc" "asparadesc"))
- (paralist-regexp (concat
- "\\("
- (mapconcat 'identity paralist-types "\\|")
- "\\)"))
- (attr (mapconcat #'identity
- (org-element-get-property :attr_html plain-list)
- " "))
- (latex-type (cond
- ((and attr
- (string-match
- (format "\\<%s\\>" paralist-regexp) attr))
- (match-string 1 attr))
- ((eq type 'ordered) "enumerate")
- ((eq type 'unordered) "itemize")
- ((eq type 'descriptive) "description")))
- arg1 ;; FIXME
- )
- (org-e-html--wrap-label
- plain-list
- ;; (format "\\begin{%s}%s\n%s\\end{%s}"
- ;; latex-type
- ;; ;; Once special environment, if any, has been removed, the
- ;; ;; rest of the attributes will be optional arguments.
- ;; ;; They will be put inside square brackets if necessary.
- ;; (let ((opt (replace-regexp-in-string
- ;; (format " *%s *" paralist-regexp) "" attr)))
- ;; (cond ((string= opt "") "")
- ;; ((string-match "\\`\\[[^][]+\\]\\'" opt) opt)
- ;; (t (format "[%s]" opt))))
- ;; contents
- ;; latex-type)
- (format "%s\n%s%s"
- (case type
- (ordered
- (format "<ol%s>" (if arg1
- (format " start=\"%d\"" arg1)
- "")))
- (unordered "<ul>")
- (descriptive "<dl>"))
- contents
- (case type
- (ordered "</ol>")
- (unordered "</ul>")
- (descriptive "</dl>")))
- )))
- ;;;; Plain Text
- (defun org-e-html-convert-special-strings (string)
- "Convert special characters in STRING to HTML."
- (let ((all org-export-e-html-special-string-regexps)
- e a re rpl start)
- (while (setq a (pop all))
- (setq re (car a) rpl (cdr a) start 0)
- (while (string-match re string start)
- (setq string (replace-match rpl t nil string))))
- string))
- (defun org-e-html-encode-plain-text (s)
- "Convert plain text characters to HTML equivalent.
- Possible conversions are set in `org-export-html-protect-char-alist'."
- (let ((cl org-export-e-html-protect-char-alist) c)
- (while (setq c (pop cl))
- (let ((start 0))
- (while (string-match (car c) s start)
- (setq s (replace-match (cdr c) t t s)
- start (1+ (match-beginning 0))))))
- s))
- (defun org-e-html-plain-text (text info)
- "Transcode a TEXT string from Org to HTML.
- TEXT is the string to transcode. INFO is a plist holding
- contextual information."
- (setq text (org-e-html-encode-plain-text text))
- ;; Protect %, #, &, $, ~, ^, _, { and }.
- ;; (while (string-match "\\([^\\]\\|^\\)\\([%$#&{}~^_]\\)" text)
- ;; (setq text
- ;; (replace-match (format "\\%s" (match-string 2 text)) nil t text 2)))
- ;; Protect \
- ;; (setq text (replace-regexp-in-string
- ;; "\\(?:[^\\]\\|^\\)\\(\\\\\\)\\(?:[^%$#&{}~^_\\]\\|$\\)"
- ;; "$\\backslash$" text nil t 1))
- ;; HTML into \HTML{} and TeX into \TeX{}.
- ;; (let ((case-fold-search nil)
- ;; (start 0))
- ;; (while (string-match "\\<\\(\\(?:La\\)?TeX\\)\\>" text start)
- ;; (setq text (replace-match
- ;; (format "\\%s{}" (match-string 1 text)) nil t text)
- ;; start (match-end 0))))
- ;; Handle quotation marks
- ;; (setq text (org-e-html--quotation-marks text info))
- ;; Convert special strings.
- ;; (when (plist-get info :with-special-strings)
- ;; (while (string-match (regexp-quote "...") text)
- ;; (setq text (replace-match "\\ldots{}" nil t text))))
- (when (plist-get info :with-special-strings)
- (setq text (org-e-html-convert-special-strings text)))
- ;; Handle break preservation if required.
- (when (plist-get info :preserve-breaks)
- (setq text (replace-regexp-in-string "\\(\\\\\\\\\\)?[ \t]*\n" " \\\\\\\\\n"
- text)))
- ;; Return value.
- text)
- ;;;; Property Drawer
- (defun org-e-html-property-drawer (property-drawer contents info)
- "Transcode a PROPERTY-DRAWER element from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual
- information."
- ;; The property drawer isn't exported but we want separating blank
- ;; lines nonetheless.
- "")
- ;;;; Quote Block
- (defun org-e-html-quote-block (quote-block contents info)
- "Transcode a QUOTE-BLOCK element from Org to HTML.
- CONTENTS holds the contents of the block. INFO is a plist
- holding contextual information."
- ;; (org-e-html--wrap-label
- ;; quote-block
- ;; (format "\\begin{quote}\n%s\\end{quote}" contents))
- (org-e-html--wrap-label
- quote-block (format "<blockquote>\n%s</blockquote>" contents)))
- ;;;; Quote Section
- (defun org-e-html-quote-section (quote-section contents info)
- "Transcode a QUOTE-SECTION element from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (let ((value (org-remove-indentation
- (org-element-get-property :value quote-section))))
- (when value
- ;; (format "\\begin{verbatim}\n%s\\end{verbatim}" value)
- (format "<pre>\n%s</pre>" value))))
- ;;;; Section
- (defun org-e-html-section (section contents info)
- "Transcode a SECTION element from Org to HTML.
- CONTENTS holds the contents of the section. INFO is a plist
- holding contextual information."
- contents)
- ;;;; Radio Target
- (defun org-e-html-radio-target (radio-target text info)
- "Transcode a RADIO-TARGET object from Org to HTML.
- TEXT is the text of the target. INFO is a plist holding
- contextual information."
- ;; (format "\\label{%s}%s"
- ;; (org-export-solidify-link-text
- ;; (org-element-get-property :raw-value radio-target))
- ;; text)
- (org-e-html-format-anchor
- text
- (org-export-solidify-link-text
- (org-element-get-property :raw-value radio-target))))
- ;;;; Special Block
- (defun org-e-html-special-block (special-block contents info)
- "Transcode a SPECIAL-BLOCK element from Org to HTML.
- CONTENTS holds the contents of the block. INFO is a plist
- holding contextual information."
- (let ((type (downcase (org-element-get-property :type special-block))))
- (org-e-html--wrap-label
- special-block
- (format "\\begin{%s}\n%s\\end{%s}" type contents type))))
- ;;;; Src Block
- (defun org-e-html-src-block (src-block contents info)
- "Transcode a SRC-BLOCK element from Org to HTML.
- CONTENTS holds the contents of the item. INFO is a plist holding
- contextual information."
- (let* ((lang (org-element-get-property :language src-block))
- (code (org-export-handle-code src-block info))
- (caption (org-element-get-property :caption src-block))
- (label (org-element-get-property :name src-block))
- (custom-env (and lang
- (cadr (assq (intern lang)
- org-e-html-custom-lang-environments)))))
- ;; FIXME: Handle caption
- (org-e-html-format-source-code-or-example lang code)
- ;; (cond
- ;; ;; No source fontification.
- ;; ((not org-e-html-listings)
- ;; (let ((caption-str (org-e-html--caption/label-string
- ;; caption label info))
- ;; (float-env (when caption "\\begin{figure}[H]\n%s\n\\end{figure}")))
- ;; (format (or float-env "%s")
- ;; (concat
- ;; caption-str
- ;; (format "\\begin{verbatim}\n%s\\end{verbatim}" code)))))
- ;; ;; Custom environment.
- ;; (custom-env
- ;; (format "\\begin{%s}\n%s\\end{%s}\n" custom-env code custom-env))
- ;; ;; Use minted package.
- ;; ((eq org-e-html-listings 'minted)
- ;; (let* ((mint-lang (or (cadr (assq (intern lang) org-e-html-minted-langs))
- ;; lang))
- ;; (float-env (when (or label caption)
- ;; (format "\\begin{listing}[H]\n%%s\n%s\\end{listing}"
- ;; (org-e-html--caption/label-string
- ;; caption label info))))
- ;; (body (format "\\begin{minted}[%s]{%s}\n%s\\end{minted}"
- ;; (org-e-html--make-option-string
- ;; org-e-html-minted-options)
- ;; mint-lang code)))
- ;; (if float-env (format float-env body) body)))
- ;; ;; Use listings package.
- ;; (t
- ;; (let ((lst-lang
- ;; (or (cadr (assq (intern lang) org-e-html-listings-langs)) lang))
- ;; (caption-str
- ;; (when caption
- ;; (let ((main (org-export-secondary-string
- ;; (car caption) 'e-html info)))
- ;; (if (not (cdr caption)) (format "{%s}" main)
- ;; (format
- ;; "{[%s]%s}"
- ;; (org-export-secondary-string (cdr caption) 'e-html info)
- ;; main))))))
- ;; (concat (format "\\lstset{%s}\n"
- ;; (org-e-html--make-option-string
- ;; (append org-e-html-listings-options
- ;; `(("language" ,lst-lang))
- ;; (when label `(("label" ,label)))
- ;; (when caption-str
- ;; `(("caption" ,caption-str))))))
- ;; (format "\\begin{lstlisting}\n%s\\end{lstlisting}" code)))))
- ))
- ;;;; Statistics Cookie
- (defun org-e-html-statistics-cookie (statistics-cookie contents info)
- "Transcode a STATISTICS-COOKIE object from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (org-element-get-property :value statistics-cookie))
- ;;;; Subscript
- (defun org-e-html-subscript (subscript contents info)
- "Transcode a SUBSCRIPT object from Org to HTML.
- CONTENTS is the contents of the object. INFO is a plist holding
- contextual information."
- ;; (format (if (= (length contents) 1) "$_%s$" "$_{\\mathrm{%s}}$") contents)
- (org-e-html-format-fontify contents 'subscript))
- ;;;; Superscript
- (defun org-e-html-superscript (superscript contents info)
- "Transcode a SUPERSCRIPT object from Org to HTML.
- CONTENTS is the contents of the object. INFO is a plist holding
- contextual information."
- ;; (format (if (= (length contents) 1) "$^%s$" "$^{\\mathrm{%s}}$") contents)
- (org-e-html-format-fontify contents 'superscript))
- ;;;; Table
- (defun org-e-html-table--format-string (table table-info info)
- "Return an appropriate format string for TABLE.
- TABLE-INFO is the plist containing format info about the table,
- as returned by `org-export-table-format-info'. INFO is a plist
- used as a communication channel.
- The format string leaves one placeholder for the body of the
- table."
- (let* ((label (org-element-get-property :name table))
- (caption (org-e-html--caption/label-string
- (org-element-get-property :caption table) label info))
- (attr (mapconcat 'identity
- (org-element-get-property :attr_html table)
- " "))
- ;; Determine alignment string.
- (alignment (org-e-html-table--align-string attr table-info))
- ;; Determine environment for the table: longtable, tabular...
- (table-env (cond
- ((not attr) org-e-html-default-table-environment)
- ((string-match "\\<longtable\\>" attr) "longtable")
- ((string-match "\\<tabular.?\\>" attr)
- (org-match-string-no-properties 0 attr))
- (t org-e-html-default-table-environment)))
- ;; If table is a float, determine environment: table or table*.
- (float-env (cond
- ((string= "longtable" table-env) nil)
- ((and attr
- (or (string-match (regexp-quote "table*") attr)
- (string-match "\\<multicolumn\\>" attr)))
- "table*")
- ((or (not (string= caption "")) label) "table")))
- ;; Extract others display options.
- (width (and attr (string-match "\\<width=\\(\\S-+\\)" attr)
- (org-match-string-no-properties 1 attr)))
- (placement
- (if (and attr (string-match "\\<placement=\\(\\S-+\\)" attr))
- (org-match-string-no-properties 1 attr)
- (format "[%s]" org-e-html-default-figure-position))))
- ;; Prepare the final format string for the table.
- (cond
- ;; Longtable.
- ((string= "longtable" table-env)
- (format
- "\\begin{longtable}{%s}\n%s\n%%s\n%s\\end{longtable}"
- alignment
- (if (or (not org-e-html-table-caption-above) (string= "" caption)) ""
- (concat (org-trim caption) "\\\\"))
- (if (or org-e-html-table-caption-above (string= "" caption)) ""
- (concat (org-trim caption) "\\\\\n"))))
- ;; Others.
- (t (concat (when float-env
- (concat
- (format "\\begin{%s}%s\n" float-env placement)
- (if org-e-html-table-caption-above caption "")))
- (when org-e-html-tables-centered "\\begin{center}\n")
- (format "\\begin{%s}%s{%s}\n%%s\n\\end{%s}"
- table-env
- (if width (format "{%s}" width) "") alignment table-env)
- (when org-e-html-tables-centered "\n\\end{center}")
- (when float-env
- (concat (if org-e-html-table-caption-above "" caption)
- (format "\n\\end{%s}" float-env))))))))
- (defun org-e-html-table--align-string (attr table-info)
- "Return an appropriate HTML alignment string.
- ATTR is a string containing table's HTML specific attributes.
- TABLE-INFO is the plist containing format info about the table,
- as returned by `org-export-table-format-info'."
- (or (and attr
- (string-match "\\<align=\\(\\S-+\\)" attr)
- (match-string 1 attr))
- (let* ((align (copy-sequence (plist-get table-info :alignment)))
- (colgroups (copy-sequence (plist-get table-info :column-groups)))
- (cols (length align))
- (separators (make-vector (1+ cols) "")))
- ;; Ignore the first column if it's special.
- (when (plist-get table-info :special-column-p)
- (aset align 0 "") (aset colgroups 0 nil))
- (let ((col 0))
- (mapc (lambda (el)
- (let ((gr (aref colgroups col)))
- (when (memq gr '(start start-end))
- (aset separators col "|"))
- (when (memq gr '(end start-end))
- (aset separators (1+ col) "|")))
- (incf col))
- align))
- ;; Build the HTML specific alignment string.
- (loop for al across align
- for sep across separators
- concat (concat sep al) into output
- finally return (concat output (aref separators cols))))))
- ;; tables
- (defun org-e-html-begin-table (caption label attributes)
- (let* ((html-table-tag (or (plist-get info :html-table-tag) ; FIXME
- org-export-e-html-table-tag))
- (html-table-tag
- (org-export-splice-attributes html-table-tag attributes)))
- (when label
- (setq html-table-tag
- (org-export-splice-attributes
- html-table-tag
- (format "id=\"%s\"" (org-solidify-link-text label)))))
- (concat "\n" html-table-tag
- (format "\n<caption>%s</caption>" (or caption "")))))
- (defun org-e-html-end-table ()
- (when org-lparse-table-is-styled
- ;; column groups
- ;; (unless (car org-table-colgroup-info)
- ;; (setq org-table-colgroup-info
- ;; (cons :start (cdr org-table-colgroup-info))))
- ;; column alignment
- (let ((c -1))
- ;; (mapc
- ;; (lambda (x)
- ;; (incf c)
- ;; (setf (aref org-lparse-table-colalign-vector c)
- ;; (or (aref org-lparse-table-colalign-vector c)
- ;; (if (> (/ (float x) (1+ org-lparse-table-rownum))
- ;; org-table-number-fraction)
- ;; "right" "left"))))
- ;; org-lparse-table-num-numeric-items-per-column)
- ))
- ;; html specific stuff starts here
- ;; (org-e-html-end-table)
- "</table>\n")
- (defun org-e-html-format-table-cell (text r c horiz-span)
- (let ((cell-style-cookie
- (if org-export-e-html-table-align-individual-fields
- (format (if (and (boundp 'org-e-html-format-table-no-css)
- org-e-html-format-table-no-css)
- " align=\"%s\"" " class=\"%s\"")
- (or (aref (plist-get table-info :alignment) c) "left")) ""))) ;; FIXME
- (cond
- (org-lparse-table-cur-rowgrp-is-hdr
- (concat
- (format (car org-export-table-header-tags) "col" cell-style-cookie)
- text (cdr org-export-table-header-tags)))
- ((and (= c 0) org-export-e-html-table-use-header-tags-for-first-column)
- (concat
- (format (car org-export-table-header-tags) "row" cell-style-cookie)
- text (cdr org-export-table-header-tags)))
- (t
- (concat
- (format (car org-export-table-data-tags) cell-style-cookie)
- text (cdr org-export-table-data-tags))))))
- (defun org-e-html-format-table-row (row)
- (concat (eval (car org-export-table-row-tags)) row
- (eval (cdr org-export-table-row-tags))))
- (defun org-e-html-table-row (fields &optional text-for-empty-fields)
- (if org-lparse-table-ncols
- ;; second and subsequent rows of the table
- ;; (when (and org-lparse-list-table-p
- ;; (> (length fields) org-lparse-table-ncols))
- ;; (error "Table row has %d columns but header row claims %d columns"
- ;; (length fields) org-lparse-table-ncols))
- ;; first row of the table
- (setq org-lparse-table-ncols (length fields))
- ;; (when org-lparse-table-is-styled
- ;; (setq org-lparse-table-num-numeric-items-per-column
- ;; (make-vector org-lparse-table-ncols 0)))
- )
- (incf org-lparse-table-rownum)
- (let ((i -1))
- (org-e-html-format-table-row
- (mapconcat
- (lambda (x)
- (when (and (string= x "") text-for-empty-fields)
- (setq x text-for-empty-fields))
- (incf i)
- (let (col-cookie horiz-span)
- (when org-lparse-table-is-styled
- ;; (when (and (< i org-lparse-table-ncols)
- ;; (string-match org-table-number-regexp x))
- ;; (incf (aref org-lparse-table-num-numeric-items-per-column i)))
- (setq col-cookie (cdr (assoc (1+ i) org-lparse-table-colalign-info))
- horiz-span (nth 1 col-cookie)))
- (org-e-html-format-table-cell
- x org-lparse-table-rownum i (or horiz-span 0))))
- fields "\n"))))
- (defun org-e-html-end-table-rowgroup ()
- (when org-lparse-table-rowgrp-open
- (setq org-lparse-table-rowgrp-open nil)
- (if org-lparse-table-cur-rowgrp-is-hdr "</thead>" "</tbody>")))
- (defun org-e-html-begin-table-rowgroup (&optional is-header-row)
- (concat
- (when org-lparse-table-rowgrp-open
- (org-e-html-end-table-rowgroup))
- (progn
- (setq org-lparse-table-rowgrp-open t)
- (setq org-lparse-table-cur-rowgrp-is-hdr is-header-row)
- (if is-header-row "<thead>" "<tbody>"))))
- (defun org-e-html-table-preamble ()
- (let ((colgroup-vector (plist-get table-info :column-groups)) ;; FIXME
- c gr colgropen preamble)
- (unless (aref colgroup-vector 0)
- (setf (aref colgroup-vector 0) 'start))
- (dotimes (c columns-number preamble)
- (setq gr (aref colgroup-vector c))
- (setq preamble
- (concat
- preamble
- (when (memq gr '(start start-end))
- (prog1 (if colgropen "</colgroup>\n<colgroup>" "\n<colgroup>")
- (setq colgropen t)))
- (let* ((colalign-vector (plist-get table-info :alignment)) ;; FIXME
- (align (cdr (assoc (aref colalign-vector c)
- '(("l" . "left")
- ("r" . "right")
- ("c" . "center")))))
- (alignspec (if (and (boundp 'org-e-html-format-table-no-css)
- org-e-html-format-table-no-css)
- " align=\"%s\"" " class=\"%s\""))
- (extra (format alignspec align)))
- (format "<col%s />" extra))
- (when (memq gr '(end start-end))
- (setq colgropen nil)
- "</colgroup>"))))
- (concat preamble (if colgropen "</colgroup>"))))
- (defun org-e-html-list-table (lines &optional splice
- caption label attributes head
- org-lparse-table-colalign-info)
- (or (featurep 'org-table) ; required for
- (require 'org-table)) ; `org-table-number-regexp'
- (let* ((org-lparse-table-rownum -1)
- (org-lparse-table-ncols (length (plist-get info :alignment)))
- i (cnt 0)
- tbopen fields line
- org-lparse-table-cur-rowgrp-is-hdr
- org-lparse-table-rowgrp-open
- ;; org-lparse-table-num-numeric-items-per-column
- org-lparse-table-colalign-vector n
- org-lparse-table-rowgrp-info
- (org-lparse-table-style 'org-table)
- org-lparse-table-is-styled)
- (cond
- (splice
- (setq org-lparse-table-is-styled nil)
- (mapconcat 'org-e-html-table-row lines "\n"))
- (t
- (setq org-lparse-table-is-styled t)
- (concat
- (org-e-html-begin-table caption label attributes)
- (org-e-html-table-preamble)
- (progn (push (cons (1+ org-lparse-table-rownum) :start)
- org-lparse-table-rowgrp-info)
- (org-e-html-begin-table-rowgroup head))
- (mapconcat
- (lambda (line)
- (cond
- ((equal line :hrule)
- (push (cons (1+ org-lparse-table-rownum) :start)
- org-lparse-table-rowgrp-info)
- (org-e-html-begin-table-rowgroup))
- (t
- (org-e-html-table-row line))))
- lines "\n")
- (org-e-html-end-table-rowgroup)
- (org-e-html-end-table))))))
- (defun org-e-html-org-table-to-list-table (lines &optional splice)
- "Convert org-table to list-table.
- LINES is a list of the form (ROW1 ROW2 ROW3 ...) where each
- element is a `string' representing a single row of org-table.
- Thus each ROW has vertical separators \"|\" separating the table
- fields. A ROW could also be a row-group separator of the form
- \"|---...|\". Return a list of the form (ROW1 ROW2 ROW3
- ...). ROW could either be symbol `:hrule' or a list of the
- form (FIELD1 FIELD2 FIELD3 ...) as appropriate."
- (let (line lines-1)
- (cond
- (splice
- (while (setq line (pop lines))
- (unless (string-match "^[ \t]*|-" line)
- (push (org-split-string line "[ \t]*|[ \t]*") lines-1))))
- (t
- (while (setq line (pop lines))
- (cond
- ((string-match "^[ \t]*|-" line)
- (when lines
- (push :hrule lines-1)))
- (t
- (push (org-split-string line "[ \t]*|[ \t]*") lines-1))))))
- (nreverse lines-1)))
- (defun org-e-html-table (table contents info)
- "Transcode a TABLE element from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (let* (
- ;; FIXME
- ;; see `org-e-html-table--format-string'
- (label (org-element-get-property :name table))
- (caption (org-e-html--caption/label-string
- (org-element-get-property :caption table) label info))
- ;; FIXME
- (attr (mapconcat #'identity
- (org-element-get-property :attr_html table)
- " "))
- (raw-table (org-element-get-property :raw-table table)))
- (cond
- ;; Case 1: verbatim table.
- ((or org-e-html-tables-verbatim
- (and attr (string-match "\\<verbatim\\>" attr)))
- (format "\\begin{verbatim}\n%s\n\\end{verbatim}"
- (org-export-clean-table
- raw-table
- (plist-get (org-export-table-format-info raw-table)
- :special-column-p))))
- ;; Case 2: table.el table. Convert it using appropriate tools.
- ((eq (org-element-get-property :type table) 'table.el)
- (require 'table)
- ;; Ensure "*org-export-table*" buffer is empty.
- (with-current-buffer (get-buffer-create "*org-export-table*")
- (erase-buffer))
- (let ((output (with-temp-buffer
- (insert raw-table)
- (goto-char 1)
- (re-search-forward "^[ \t]*|[^|]" nil t)
- (table-generate-source 'html "*org-export-table*")
- (with-current-buffer "*org-export-table*"
- (org-trim (buffer-string))))))
- (kill-buffer (get-buffer "*org-export-table*"))
- ;; Remove left out comments.
- (while (string-match "^%.*\n" output)
- (setq output (replace-match "" t t output)))
- ;; When the "rmlines" attribute is provided, remove all hlines
- ;; but the the one separating heading from the table body.
- (when (and attr (string-match "\\<rmlines\\>" attr))
- (let ((n 0) (pos 0))
- (while (and (< (length output) pos)
- (setq pos (string-match "^\\\\hline\n?" output pos)))
- (incf n)
- (unless (= n 2)
- (setq output (replace-match "" nil nil output))))))
- ;; (if (not org-e-html-tables-centered) output
- ;; (format "\\begin{center}\n%s\n\\end{center}" output))
- output))
- ;; Case 3: Standard table.
- (t
- (let* ((table-info (org-export-table-format-info raw-table))
- (columns-number (length (plist-get table-info :alignment)))
- (longtablep (and attr (string-match "\\<longtable\\>" attr)))
- (booktabsp
- (or (and attr (string-match "\\<booktabs=\\(yes\\|t\\)\\>" attr))
- org-e-html-tables-booktabs))
- ;; CLEAN-TABLE is a table turned into a list, much like
- ;; `org-table-to-lisp', with special column and
- ;; formatting cookies removed, and cells already
- ;; transcoded.
- (lines (org-split-string
- (org-export-clean-table
- raw-table (plist-get table-info :special-column-p)) "\n"))
- ;; (clean-table
- ;; (mapcar
- ;; (lambda (row)
- ;; (if (string-match org-table-hline-regexp row) 'hline
- ;; (mapcar
- ;; (lambda (cell)
- ;; (org-export-secondary-string
- ;; (org-element-parse-secondary-string
- ;; cell
- ;; (cdr (assq 'table org-element-string-restrictions)))
- ;; 'e-html info))
- ;; (org-split-string row "[ \t]*|[ \t]*"))))
- ;; lines))
- )
- (let ((splice nil) head)
- (setq lines (org-e-html-org-table-to-list-table lines splice))
- (org-e-html-list-table lines splice caption label attr head nil))
- ;; If BOOKTABSP is non-nil, remove any rule at the beginning
- ;; and the end of the table, since booktabs' special rules
- ;; will be inserted instead.
- ;; (when booktabsp
- ;; (when (eq (car clean-table) 'hline)
- ;; (setq clean-table (cdr clean-table)))
- ;; (when (eq (car (last clean-table)) 'hline)
- ;; (setq clean-table (butlast clean-table))))
- ;; Convert ROWS to send them to `orgtbl-to-latex'. In
- ;; particular, send each cell to
- ;; `org-element-parse-secondary-string' to expand any Org
- ;; object within. Eventually, flesh the format string out
- ;; with the table.
- ;; (format
- ;; (org-e-html-table--format-string table table-info info)
- ;; (orgtbl-to-latex
- ;; clean-table
- ;; ;; Parameters passed to `orgtbl-to-latex'.
- ;; `(:tstart ,(and booktabsp "\\toprule")
- ;; :tend ,(and booktabsp "\\bottomrule")
- ;; :hline ,(if booktabsp "\\midrule" "\\hline")
- ;; ;; Longtable environment requires specific header
- ;; ;; lines end string.
- ;; :hlend ,(and longtablep
- ;; (format "\\\\
- ;; %s
- ;; \\endhead
- ;; %s\\multicolumn{%d}{r}{Continued on next page}\\\\
- ;; \\endfoot
- ;; \\endlastfoot"
- ;; (if booktabsp "\\midrule" "\\hline")
- ;; (if booktabsp "\\midrule" "\\hline")
- ;; columns-number)))))
- )))))
- ;;;; Target
- (defun org-e-html-target (target text info)
- "Transcode a TARGET object from Org to HTML.
- TEXT is the text of the target. INFO is a plist holding
- contextual information."
- ;; (format "\\label{%s}%s"
- ;; (org-export-solidify-link-text
- ;; (org-element-get-property :raw-value target))
- ;; text)
- (org-e-html-format-anchor
- text (org-export-solidify-link-text
- (org-element-get-property :raw-value target))))
- ;;;; Time-stamp
- (defun org-e-html-time-stamp (time-stamp contents info)
- "Transcode a TIME-STAMP object from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual
- information."
- ;; (let ((value (org-element-get-property :value time-stamp))
- ;; (type (org-element-get-property :type time-stamp))
- ;; (appt-type (org-element-get-property :appt-type time-stamp)))
- ;; (concat (cond ((eq appt-type 'scheduled)
- ;; (format "\\textbf{\\textsc{%s}} " org-scheduled-string))
- ;; ((eq appt-type 'deadline)
- ;; (format "\\textbf{\\textsc{%s}} " org-deadline-string))
- ;; ((eq appt-type 'closed)
- ;; (format "\\textbf{\\textsc{%s}} " org-closed-string)))
- ;; (cond ((memq type '(active active-range))
- ;; (format org-e-html-active-timestamp-format value))
- ;; ((memq type '(inactive inactive-range))
- ;; (format org-e-html-inactive-timestamp-format value))
- ;; (t
- ;; (format org-e-html-diary-timestamp-format value)))))
- (let ((value (org-element-get-property :value time-stamp))
- (type (org-element-get-property :type time-stamp))
- (appt-type (org-element-get-property :appt-type time-stamp)))
- (org-e-html-format-fontify
- (concat
- (org-e-html-format-fontify
- (cond ((eq appt-type 'scheduled) org-scheduled-string)
- ((eq appt-type 'deadline) org-deadline-string)
- ((eq appt-type 'closed) org-closed-string)) "timestamp-kwd")
- ;; FIXME: (org-translate-time value)
- (org-e-html-format-fontify value "timestamp"))
- "timestamp-wrapper")))
- ;;;; Verbatim
- (defun org-e-html-verbatim (verbatim contents info)
- "Transcode a VERBATIM object from Org to HTML.
- CONTENTS is nil. INFO is a plist used as a communication
- channel."
- (org-e-html-emphasis
- verbatim (org-element-get-property :value verbatim) info)
- ;; (let ((fmt (cdr (assoc (org-element-get-property :marker verbatim)
- ;; org-e-html-emphasis-alist)))
- ;; (value (org-element-get-property :value verbatim)))
- ;; (cond
- ;; ;; Handle the `verb' special case.
- ;; ((eq 'verb fmt)
- ;; (let ((separator (org-e-html--find-verb-separator value)))
- ;; (concat "\\verb" separator value separator)))
- ;; ;; Handle the `protectedtexttt' special case.
- ;; ((eq 'protectedtexttt fmt)
- ;; (let ((start 0)
- ;; (trans '(("\\" . "\\textbackslash{}")
- ;; ("~" . "\\textasciitilde{}")
- ;; ("^" . "\\textasciicircum{}")))
- ;; (rtn "")
- ;; char)
- ;; (while (string-match "[\\{}$%&_#~^]" value)
- ;; (setq char (match-string 0 value))
- ;; (if (> (match-beginning 0) 0)
- ;; (setq rtn (concat rtn (substring value 0 (match-beginning 0)))))
- ;; (setq value (substring value (1+ (match-beginning 0))))
- ;; (setq char (or (cdr (assoc char trans)) (concat "\\" char))
- ;; rtn (concat rtn char)))
- ;; (setq value (concat rtn value)
- ;; fmt "\\texttt{%s}")
- ;; (while (string-match "--" value)
- ;; (setq value (replace-match "-{}-" t t value)))
- ;; (format fmt value)))
- ;; ;; Else use format string.
- ;; (t (format fmt value))))
- )
- ;;;; Verse Block
- (defun org-e-html-verse-block (verse-block contents info)
- "Transcode a VERSE-BLOCK element from Org to HTML.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (org-e-html--wrap-label
- verse-block
- ;; In a verse environment, add a line break to each newline
- ;; character and change each white space at beginning of a line
- ;; into a space of 1 em. Also change each blank line with
- ;; a vertical space of 1 em.
- (progn
- (setq contents (replace-regexp-in-string
- "^ *\\\\\\\\$" "\\\\vspace*{1em}"
- (replace-regexp-in-string
- "\\(\\\\\\\\\\)?[ \t]*\n" " \\\\\\\\\n"
- (org-remove-indentation
- (org-export-secondary-string
- (org-element-get-property :value verse-block)
- 'e-html info)))))
- (while (string-match "^[ \t]+" contents)
- (let ((new-str (format "\\hspace*{%dem}"
- (length (match-string 0 contents)))))
- (setq contents (replace-match new-str nil t contents))))
- (format "\\begin{verse}\n%s\\end{verse}" contents)))
- (org-e-html--wrap-label
- verse-block
- ;; In a verse environment, add a line break to each newline
- ;; character and change each white space at beginning of a line
- ;; into a space of 1 em. Also change each blank line with
- ;; a vertical space of 1 em.
- (progn
- (setq contents (replace-regexp-in-string
- "^ *\\\\\\\\$" "<br/>\n"
- (replace-regexp-in-string
- "\\(\\\\\\\\\\)?[ \t]*\n" " <br/>\n"
- (org-remove-indentation
- (org-export-secondary-string
- (org-element-get-property :value verse-block)
- 'e-html info)))))
- (while (string-match "^[ \t]+" contents)
- (let ((new-str (format " "
- (length (match-string 0 contents)))))
- (setq contents (replace-match new-str nil t contents))))
- (format "<p class=\"verse\">\n%s</p>" contents)))
- )
- ;;; Interactive functions
- (setq org-e-html-pp t)
- (defun org-e-html-export-to-html
- (&optional subtreep visible-only body-only ext-plist pub-dir)
- "Export current buffer to a HTML file.
- If narrowing is active in the current buffer, only export its
- narrowed part.
- If a region is active, export that region.
- When optional argument SUBTREEP is non-nil, export the sub-tree
- at point, extracting information from the headline properties
- first.
- When optional argument VISIBLE-ONLY is non-nil, don't export
- contents of hidden elements.
- When optional argument BODY-ONLY is non-nil, only write code
- between \"\\begin{document}\" and \"\\end{document}\".
- EXT-PLIST, when provided, is a property list with external
- parameters overriding Org default settings, but still inferior to
- file-local settings.
- When optional argument PUB-DIR is set, use it as the publishing
- directory.
- Return output file's name."
- (interactive)
- (setq org-e-html-footnotes-alist nil)
- ;; FIXME
- (with-current-buffer (get-buffer-create "*debug*")
- (erase-buffer))
- (let ((outfile (org-export-output-file-name ".html" subtreep pub-dir)))
- (org-export-to-file
- 'e-html outfile subtreep visible-only body-only ext-plist)))
- (defun org-e-html-export-to-pdf
- (&optional subtreep visible-only body-only ext-plist pub-dir)
- "Export current buffer to HTML then process through to PDF.
- If narrowing is active in the current buffer, only export its
- narrowed part.
- If a region is active, export that region.
- When optional argument SUBTREEP is non-nil, export the sub-tree
- at point, extracting information from the headline properties
- first.
- When optional argument VISIBLE-ONLY is non-nil, don't export
- contents of hidden elements.
- When optional argument BODY-ONLY is non-nil, only write code
- between \"\\begin{document}\" and \"\\end{document}\".
- EXT-PLIST, when provided, is a property list with external
- parameters overriding Org default settings, but still inferior to
- file-local settings.
- When optional argument PUB-DIR is set, use it as the publishing
- directory.
- Return PDF file's name."
- (interactive)
- (org-e-html-compile
- (org-e-html-export-to-html
- subtreep visible-only body-only ext-plist pub-dir)))
- (defun org-e-html-compile (texfile)
- "Compile a TeX file.
- TEXFILE is the name of the file being compiled. Processing is
- done through the command specified in `org-e-html-pdf-process'.
- Return PDF file name or an error if it couldn't be produced."
- (let* ((wconfig (current-window-configuration))
- (texfile (file-truename texfile))
- (base (file-name-sans-extension texfile))
- errors)
- (message (format "Processing HTML file %s ..." texfile))
- (unwind-protect
- (progn
- (cond
- ;; A function is provided: Apply it.
- ((functionp org-latex-to-pdf-process)
- (funcall org-latex-to-pdf-process (shell-quote-argument texfile)))
- ;; A list is provided: Replace %b, %f and %o with appropriate
- ;; values in each command before applying it. Output is
- ;; redirected to "*Org PDF HTML Output*" buffer.
- ((consp org-e-html-pdf-process)
- (let* ((out-dir (or (file-name-directory texfile) "./"))
- (outbuf (get-buffer-create "*Org PDF HTML Output*")))
- (mapc
- (lambda (command)
- (shell-command
- (replace-regexp-in-string
- "%b" (shell-quote-argument base)
- (replace-regexp-in-string
- "%f" (shell-quote-argument texfile)
- (replace-regexp-in-string
- "%o" (shell-quote-argument out-dir) command)))
- outbuf))
- org-e-html-pdf-process)
- ;; Collect standard errors from output buffer.
- (setq errors (org-e-html-collect-errors outbuf))))
- (t (error "No valid command to process to PDF")))
- (let ((pdffile (concat base ".pdf")))
- ;; Check for process failure. Provide collected errors if
- ;; possible.
- (if (not (file-exists-p pdffile))
- (error (concat (format "PDF file %s wasn't produced" pdffile)
- (when errors (concat ": " errors))))
- ;; Else remove log files, when specified, and signal end of
- ;; process to user, along with any error encountered.
- (when org-e-html-remove-logfiles
- (dolist (ext org-e-html-logfiles-extensions)
- (let ((file (concat base "." ext)))
- (when (file-exists-p file) (delete-file file)))))
- (message (concat "Process completed"
- (if (not errors) "."
- (concat " with errors: " errors)))))
- ;; Return output file name.
- pdffile))
- (set-window-configuration wconfig))))
- (defun org-e-html-collect-errors (buffer)
- "Collect some kind of errors from \"pdflatex\" command output.
- BUFFER is the buffer containing output.
- Return collected error types as a string, or nil if there was
- none."
- (with-current-buffer buffer
- (save-excursion
- (goto-char (point-max))
- ;; Find final "pdflatex" run.
- (when (re-search-backward "^[ \t]*This is pdf.*?TeX.*?Version" nil t)
- (let ((case-fold-search t)
- (errors ""))
- (when (save-excursion
- (re-search-forward "Reference.*?undefined" nil t))
- (setq errors (concat errors " [undefined reference]")))
- (when (save-excursion
- (re-search-forward "Citation.*?undefined" nil t))
- (setq errors (concat errors " [undefined citation]")))
- (when (save-excursion
- (re-search-forward "Undefined control sequence" nil t))
- (setq errors (concat errors " [undefined control sequence]")))
- (when (save-excursion
- (re-search-forward "^! HTML.*?Error" nil t))
- (setq errors (concat errors " [HTML error]")))
- (when (save-excursion
- (re-search-forward "^! Package.*?Error" nil t))
- (setq errors (concat errors " [package error]")))
- (and (org-string-nw-p errors) (org-trim errors)))))))
- (provide 'org-e-html)
- ;;; org-e-html.el ends here
|