123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962 |
- (eval-when-compile (require 'cl))
- (require 'org-element)
- (require 'ob-exp)
- (declare-function org-e-publish "org-e-publish" (project &optional force))
- (declare-function org-e-publish-all "org-e-publish" (&optional force))
- (declare-function org-e-publish-current-file "org-e-publish" (&optional force))
- (declare-function org-e-publish-current-project "org-e-publish"
- (&optional force))
- (defvar org-e-publish-project-alist)
- (defvar org-table-number-fraction)
- (defvar org-table-number-regexp)
- (defconst org-export-max-depth 19
- "Maximum nesting depth for headlines, counting from 0.")
- (defconst org-export-options-alist
- '((:author "AUTHOR" nil user-full-name t)
- (:creator "CREATOR" nil org-export-creator-string)
- (:date "DATE" nil nil t)
- (:description "DESCRIPTION" nil nil newline)
- (:email "EMAIL" nil user-mail-address t)
- (:exclude-tags "EXCLUDE_TAGS" nil org-export-exclude-tags split)
- (:headline-levels nil "H" org-export-headline-levels)
- (:keywords "KEYWORDS" nil nil space)
- (:language "LANGUAGE" nil org-export-default-language t)
- (:preserve-breaks nil "\\n" org-export-preserve-breaks)
- (:section-numbers nil "num" org-export-with-section-numbers)
- (:select-tags "SELECT_TAGS" nil org-export-select-tags split)
- (:time-stamp-file nil "timestamp" org-export-time-stamp-file)
- (:title "TITLE" nil nil space)
- (:with-archived-trees nil "arch" org-export-with-archived-trees)
- (:with-author nil "author" org-export-with-author)
- (:with-clocks nil "c" org-export-with-clocks)
- (:with-creator nil "creator" org-export-with-creator)
- (:with-date nil "date" org-export-with-date)
- (:with-drawers nil "d" org-export-with-drawers)
- (:with-email nil "email" org-export-with-email)
- (:with-emphasize nil "*" org-export-with-emphasize)
- (:with-entities nil "e" org-export-with-entities)
- (:with-fixed-width nil ":" org-export-with-fixed-width)
- (:with-footnotes nil "f" org-export-with-footnotes)
- (:with-inlinetasks nil "inline" org-export-with-inlinetasks)
- (:with-plannings nil "p" org-export-with-planning)
- (:with-priority nil "pri" org-export-with-priority)
- (:with-smart-quotes nil "'" org-export-with-smart-quotes)
- (:with-special-strings nil "-" org-export-with-special-strings)
- (:with-statistics-cookies nil "stat" org-export-with-statistics-cookies)
- (:with-sub-superscript nil "^" org-export-with-sub-superscripts)
- (:with-toc nil "toc" org-export-with-toc)
- (:with-tables nil "|" org-export-with-tables)
- (:with-tags nil "tags" org-export-with-tags)
- (:with-tasks nil "tasks" org-export-with-tasks)
- (:with-timestamps nil "<" org-export-with-timestamps)
- (:with-todo-keywords nil "todo" org-export-with-todo-keywords))
- "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. Each
- property defined this way can also be set, during subtree
- export, through an headline property named after the keyword
- with the \"EXPORT_\" prefix (i.e. DATE keyword and EXPORT_DATE
- property).
- 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. Back-end
- specific properties are set through `org-export-define-backend'.
- Properties redefined there have precedence over these.")
- (defconst org-export-special-keywords '("FILETAGS" "SETUP_FILE" "OPTIONS")
- "List of in-buffer keywords that require special treatment.
- These keywords are not directly associated to a property. The
- way they are handled must be hard-coded into
- `org-export--get-inbuffer-options' function.")
- (defconst org-export-filters-alist
- '((:filter-bold . org-export-filter-bold-functions)
- (:filter-babel-call . org-export-filter-babel-call-functions)
- (:filter-center-block . org-export-filter-center-block-functions)
- (:filter-clock . org-export-filter-clock-functions)
- (:filter-code . org-export-filter-code-functions)
- (:filter-comment . org-export-filter-comment-functions)
- (:filter-comment-block . org-export-filter-comment-block-functions)
- (:filter-diary-sexp . org-export-filter-diary-sexp-functions)
- (:filter-drawer . org-export-filter-drawer-functions)
- (:filter-dynamic-block . org-export-filter-dynamic-block-functions)
- (:filter-entity . org-export-filter-entity-functions)
- (:filter-example-block . org-export-filter-example-block-functions)
- (:filter-export-block . org-export-filter-export-block-functions)
- (:filter-export-snippet . org-export-filter-export-snippet-functions)
- (:filter-final-output . org-export-filter-final-output-functions)
- (:filter-fixed-width . org-export-filter-fixed-width-functions)
- (:filter-footnote-definition . org-export-filter-footnote-definition-functions)
- (:filter-footnote-reference . org-export-filter-footnote-reference-functions)
- (:filter-headline . org-export-filter-headline-functions)
- (:filter-horizontal-rule . org-export-filter-horizontal-rule-functions)
- (:filter-inline-babel-call . org-export-filter-inline-babel-call-functions)
- (:filter-inline-src-block . org-export-filter-inline-src-block-functions)
- (:filter-inlinetask . org-export-filter-inlinetask-functions)
- (:filter-italic . org-export-filter-italic-functions)
- (:filter-item . org-export-filter-item-functions)
- (:filter-keyword . org-export-filter-keyword-functions)
- (:filter-latex-environment . org-export-filter-latex-environment-functions)
- (:filter-latex-fragment . org-export-filter-latex-fragment-functions)
- (:filter-line-break . org-export-filter-line-break-functions)
- (:filter-link . org-export-filter-link-functions)
- (:filter-macro . org-export-filter-macro-functions)
- (:filter-node-property . org-export-filter-node-property-functions)
- (:filter-paragraph . org-export-filter-paragraph-functions)
- (:filter-parse-tree . org-export-filter-parse-tree-functions)
- (:filter-plain-list . org-export-filter-plain-list-functions)
- (:filter-plain-text . org-export-filter-plain-text-functions)
- (:filter-planning . org-export-filter-planning-functions)
- (:filter-property-drawer . org-export-filter-property-drawer-functions)
- (:filter-quote-block . org-export-filter-quote-block-functions)
- (:filter-quote-section . org-export-filter-quote-section-functions)
- (:filter-radio-target . org-export-filter-radio-target-functions)
- (:filter-section . org-export-filter-section-functions)
- (:filter-special-block . org-export-filter-special-block-functions)
- (:filter-src-block . org-export-filter-src-block-functions)
- (:filter-statistics-cookie . org-export-filter-statistics-cookie-functions)
- (:filter-strike-through . org-export-filter-strike-through-functions)
- (:filter-subscript . org-export-filter-subscript-functions)
- (:filter-superscript . org-export-filter-superscript-functions)
- (:filter-table . org-export-filter-table-functions)
- (:filter-table-cell . org-export-filter-table-cell-functions)
- (:filter-table-row . org-export-filter-table-row-functions)
- (:filter-target . org-export-filter-target-functions)
- (:filter-timestamp . org-export-filter-timestamp-functions)
- (:filter-underline . org-export-filter-underline-functions)
- (:filter-verbatim . org-export-filter-verbatim-functions)
- (:filter-verse-block . org-export-filter-verse-block-functions))
- "Alist between filters properties and initial values.
- The key of each association is a property name accessible through
- the communication channel. Its value is a configurable global
- variable defining initial filters.
- This list is meant to install user specified filters. Back-end
- developers may install their own filters using
- `org-export-define-backend'. Filters defined there will always
- be prepended to the current list, so they always get applied
- first.")
- (defconst org-export-default-inline-image-rule
- `(("file" .
- ,(format "\\.%s\\'"
- (regexp-opt
- '("png" "jpeg" "jpg" "gif" "tiff" "tif" "xbm"
- "xpm" "pbm" "pgm" "ppm") t))))
- "Default rule for link matching an inline image.
- This rule applies to links with no description. By default, it
- will be considered as an inline image if it targets a local file
- whose extension is either \"png\", \"jpeg\", \"jpg\", \"gif\",
- \"tiff\", \"tif\", \"xbm\", \"xpm\", \"pbm\", \"pgm\" or \"ppm\".
- See `org-export-inline-image-p' for more information about
- rules.")
- (defvar org-export-registered-backends nil
- "List of backends currently available in the exporter.
- A backend is stored as a list where CAR is its name, as a symbol,
- and CDR is a plist with the following properties:
- `:filters-alist', `:menu-entry', `:options-alist' and
- `:translate-alist'.
- This variable is set with `org-export-define-backend' and
- `org-export-define-derived-backend' functions.")
- (defgroup org-export nil
- "Options for exporting Org mode files."
- :tag "Org Export"
- :group 'org)
- (defgroup org-export-general nil
- "General options for export engine."
- :tag "Org Export General"
- :group 'org-export)
- (defcustom org-export-with-archived-trees 'headline
- "Whether sub-trees with the ARCHIVE tag should be exported.
- This can have three different values:
- nil Do not export, pretend this tree is not present.
- t Do export the entire tree.
- `headline' Only export the headline, but skip the tree below it.
- This option can also be set with the #+OPTIONS line,
- e.g. \"arch:nil\"."
- :group 'org-export-general
- :type '(choice
- (const :tag "Not at all" nil)
- (const :tag "Headline only" 'headline)
- (const :tag "Entirely" t)))
- (defcustom org-export-with-author t
- "Non-nil means insert author name into the exported file.
- This option can also be set with the #+OPTIONS line,
- e.g. \"author:nil\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-clocks nil
- "Non-nil means export CLOCK keywords.
- This option can also be set with the #+OPTIONS line,
- e.g. \"c:t\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-creator 'comment
- "Non-nil means the postamble should contain a creator sentence.
- The sentence can be set in `org-export-creator-string' and
- defaults to \"Generated by Org mode XX in Emacs XXX.\".
- If the value is `comment' insert it as a comment."
- :group 'org-export-general
- :type '(choice
- (const :tag "No creator sentence" nil)
- (const :tag "Sentence as a comment" 'comment)
- (const :tag "Insert the sentence" t)))
- (defcustom org-export-with-date t
- "Non-nil means insert date in the exported document.
- This options can also be set with the OPTIONS keyword,
- e.g. \"date:nil\".")
- (defcustom org-export-creator-string
- (format "Generated by Org mode %s in Emacs %s."
- (if (fboundp 'org-version) (org-version) "(Unknown)")
- emacs-version)
- "String to insert at the end of the generated document."
- :group 'org-export-general
- :type '(string :tag "Creator string"))
- (defcustom org-export-with-drawers t
- "Non-nil means export contents of standard drawers.
- When t, all drawers are exported. This may also be a list of
- drawer names to export. This variable doesn't apply to
- properties drawers.
- This option can also be set with the #+OPTIONS line,
- e.g. \"d:nil\"."
- :group 'org-export-general
- :type '(choice
- (const :tag "All drawers" t)
- (const :tag "None" nil)
- (repeat :tag "Selected drawers"
- (string :tag "Drawer name"))))
- (defcustom org-export-with-email nil
- "Non-nil means insert author email into the exported file.
- This option can also be set with the #+OPTIONS line,
- e.g. \"email:t\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-emphasize t
- "Non-nil means interpret *word*, /word/, and _word_ as emphasized text.
- If the export target supports emphasizing text, the word will be
- typeset in bold, italic, or underlined, respectively. Not all
- export backends support this.
- This option can also be set with the #+OPTIONS line, e.g. \"*:nil\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-exclude-tags '("noexport")
- "Tags that exclude a tree from export.
- All trees carrying any of these tags will be excluded from
- export. This is without condition, so even subtrees inside that
- carry one of the `org-export-select-tags' will be removed.
- This option can also be set with the #+EXCLUDE_TAGS: keyword."
- :group 'org-export-general
- :type '(repeat (string :tag "Tag")))
- (defcustom org-export-with-fixed-width t
- "Non-nil means lines starting with \":\" will be in fixed width font.
- This can be used to have pre-formatted text, fragments of code
- etc. For example:
- : ;; Some Lisp examples
- : (while (defc cnt)
- : (ding))
- will be looking just like this in also HTML. See also the QUOTE
- keyword. Not all export backends support this.
- This option can also be set with the #+OPTIONS line, e.g. \"::nil\"."
- :group 'org-export-translation
- :type 'boolean)
- (defcustom org-export-with-footnotes t
- "Non-nil means Org footnotes should be exported.
- This option can also be set with the #+OPTIONS line,
- e.g. \"f:nil\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-headline-levels 3
- "The last level which is still exported as a headline.
- Inferior levels will produce itemize lists when exported.
- This option can also be set with the #+OPTIONS line, e.g. \"H:2\"."
- :group 'org-export-general
- :type 'integer)
- (defcustom org-export-default-language "en"
- "The default language for export and clocktable translations, as a string.
- This may have an association in
- `org-clock-clocktable-language-setup'."
- :group 'org-export-general
- :type '(string :tag "Language"))
- (defcustom org-export-preserve-breaks nil
- "Non-nil means preserve all line breaks when exporting.
- Normally, in HTML output paragraphs will be reformatted.
- This option can also be set with the #+OPTIONS line,
- e.g. \"\\n:t\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-entities t
- "Non-nil means interpret entities when exporting.
- For example, HTML export converts \\alpha to α and \\AA to
- Å.
- For a list of supported names, see the constant `org-entities'
- and the user option `org-entities-user'.
- This option can also be set with the #+OPTIONS line,
- e.g. \"e:nil\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-inlinetasks t
- "Non-nil means inlinetasks should be exported.
- This option can also be set with the #+OPTIONS line,
- e.g. \"inline:nil\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-planning nil
- "Non-nil means include planning info in export.
- This option can also be set with the #+OPTIONS: line,
- e.g. \"p:t\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-priority nil
- "Non-nil means include priority cookies in export.
- This option can also be set with the #+OPTIONS line,
- e.g. \"pri:t\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-section-numbers t
- "Non-nil means add section numbers to headlines when exporting.
- When set to an integer n, numbering will only happen for
- headlines whose relative level is higher or equal to n.
- This option can also be set with the #+OPTIONS line,
- e.g. \"num:t\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-select-tags '("export")
- "Tags that select a tree for export.
- If any such tag is found in a buffer, all trees that do not carry
- one of these tags will be ignored during export. Inside trees
- that are selected like this, you can still deselect a subtree by
- tagging it with one of the `org-export-exclude-tags'.
- This option can also be set with the #+SELECT_TAGS: keyword."
- :group 'org-export-general
- :type '(repeat (string :tag "Tag")))
- (defcustom org-export-with-smart-quotes nil
- "Non-nil means activate smart quotes during export.
- This option can also be set with the #+OPTIONS: line,
- e.g. \"':t\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-special-strings t
- "Non-nil means interpret \"\\-\", \"--\" and \"---\" for export.
- When this option is turned on, these strings will be exported as:
- Org HTML LaTeX UTF-8
- -----+----------+--------+-------
- \\- ­ \\-
- -- – -- –
- --- — --- —
- ... … \\ldots …
- This option can also be set with the #+OPTIONS line,
- e.g. \"-:nil\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-statistics-cookies t
- "Non-nil means include statistics cookies in export.
- This option can also be set with the #+OPTIONS: line,
- e.g. \"stat:nil\""
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-sub-superscripts t
- "Non-nil means interpret \"_\" and \"^\" for export.
- When this option is turned on, you can use TeX-like syntax for
- sub- and superscripts. Several characters after \"_\" or \"^\"
- will be considered as a single item - so grouping with {} is
- normally not needed. For example, the following things will be
- parsed as single sub- or superscripts.
- 10^24 or 10^tau several digits will be considered 1 item.
- 10^-12 or 10^-tau a leading sign with digits or a word
- x^2-y^3 will be read as x^2 - y^3, because items are
- terminated by almost any nonword/nondigit char.
- x_{i^2} or x^(2-i) braces or parenthesis do grouping.
- Still, ambiguity is possible - so when in doubt use {} to enclose
- the sub/superscript. If you set this variable to the symbol
- `{}', the braces are *required* in order to trigger
- interpretations as sub/superscript. This can be helpful in
- documents that need \"_\" frequently in plain text.
- This option can also be set with the #+OPTIONS line,
- e.g. \"^:nil\"."
- :group 'org-export-general
- :type '(choice
- (const :tag "Interpret them" t)
- (const :tag "Curly brackets only" {})
- (const :tag "Do not interpret them" nil)))
- (defcustom org-export-with-toc t
- "Non-nil means create a table of contents in exported files.
- The TOC contains headlines with levels up
- to`org-export-headline-levels'. When an integer, include levels
- up to N in the toc, this may then be different from
- `org-export-headline-levels', but it will not be allowed to be
- larger than the number of headline levels. When nil, no table of
- contents is made.
- This option can also be set with the #+OPTIONS line,
- e.g. \"toc:nil\" or \"toc:3\"."
- :group 'org-export-general
- :type '(choice
- (const :tag "No Table of Contents" nil)
- (const :tag "Full Table of Contents" t)
- (integer :tag "TOC to level")))
- (defcustom org-export-with-tables t
- "If non-nil, lines starting with \"|\" define a table.
- For example:
- | Name | Address | Birthday |
- |-------------+----------+-----------|
- | Arthur Dent | England | 29.2.2100 |
- This option can also be set with the #+OPTIONS line, e.g. \"|:nil\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-tags t
- "If nil, do not export tags, just remove them from headlines.
- If this is the symbol `not-in-toc', tags will be removed from
- table of contents entries, but still be shown in the headlines of
- the document.
- This option can also be set with the #+OPTIONS line,
- e.g. \"tags:nil\"."
- :group 'org-export-general
- :type '(choice
- (const :tag "Off" nil)
- (const :tag "Not in TOC" not-in-toc)
- (const :tag "On" t)))
- (defcustom org-export-with-tasks t
- "Non-nil means include TODO items for export.
- This may have the following values:
- t include tasks independent of state.
- `todo' include only tasks that are not yet done.
- `done' include only tasks that are already done.
- nil ignore all tasks.
- list of keywords include tasks with these keywords.
- This option can also be set with the #+OPTIONS line,
- e.g. \"tasks:nil\"."
- :group 'org-export-general
- :type '(choice
- (const :tag "All tasks" t)
- (const :tag "No tasks" nil)
- (const :tag "Not-done tasks" todo)
- (const :tag "Only done tasks" done)
- (repeat :tag "Specific TODO keywords"
- (string :tag "Keyword"))))
- (defcustom org-export-time-stamp-file t
- "Non-nil means insert a time stamp into the exported file.
- The time stamp shows when the file was created.
- This option can also be set with the #+OPTIONS line,
- e.g. \"timestamp:nil\"."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-with-timestamps t
- "Non nil means allow timestamps in export.
- It can be set to `active', `inactive', t or nil, in order to
- export, respectively, only active timestamps, only inactive ones,
- all of them or none.
- This option can also be set with the #+OPTIONS line, e.g.
- \"<:nil\"."
- :group 'org-export-general
- :type '(choice
- (const :tag "All timestamps" t)
- (const :tag "Only active timestamps" active)
- (const :tag "Only inactive timestamps" inactive)
- (const :tag "No timestamp" nil)))
- (defcustom org-export-with-todo-keywords t
- "Non-nil means include TODO keywords in export.
- When nil, remove all these keywords from the export."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-allow-BIND 'confirm
- "Non-nil means allow #+BIND to define local variable values for export.
- This is a potential security risk, which is why the user must
- confirm the use of these lines."
- :group 'org-export-general
- :type '(choice
- (const :tag "Never" nil)
- (const :tag "Always" t)
- (const :tag "Ask a confirmation for each file" confirm)))
- (defcustom org-export-snippet-translation-alist nil
- "Alist between export snippets back-ends and exporter back-ends.
- This variable allows to provide shortcuts for export snippets.
- For example, with a value of '\(\(\"h\" . \"e-html\"\)\), the
- HTML back-end will recognize the contents of \"@@h:<b>@@\" as
- HTML code while every other back-end will ignore it."
- :group 'org-export-general
- :type '(repeat
- (cons
- (string :tag "Shortcut")
- (string :tag "Back-end"))))
- (defcustom org-export-coding-system nil
- "Coding system for the exported file."
- :group 'org-export-general
- :type 'coding-system)
- (defcustom org-export-copy-to-kill-ring t
- "Non-nil means exported stuff will also be pushed onto the kill ring."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-initial-scope 'buffer
- "The initial scope when exporting with `org-export-dispatch'.
- This variable can be either set to `buffer' or `subtree'."
- :group 'org-export-general
- :type '(choice
- (const :tag "Export current buffer" 'buffer)
- (const :tag "Export current subtree" 'subtree)))
- (defcustom org-export-show-temporary-export-buffer t
- "Non-nil means show buffer after exporting to temp buffer.
- When Org exports to a file, the buffer visiting that file is ever
- shown, but remains buried. However, when exporting to
- a temporary buffer, that buffer is popped up in a second window.
- When this variable is nil, the buffer remains buried also in
- these cases."
- :group 'org-export-general
- :type 'boolean)
- (defcustom org-export-dispatch-use-expert-ui nil
- "Non-nil means using a non-intrusive `org-export-dispatch'.
- In that case, no help buffer is displayed. Though, an indicator
- for current export scope is added to the prompt (\"b\" when
- output is restricted to body only, \"s\" when it is restricted to
- the current subtree, \"v\" when only visible elements are
- considered for export and \"f\" when publishing functions should
- be passed the FORCE argument). Also, \[?] allows to switch back
- to standard mode."
- :group 'org-export-general
- :type 'boolean)
- (defmacro org-export-define-backend (backend translators &rest body)
- "Define a new back-end BACKEND.
- TRANSLATORS is an alist between object or element types and
- functions handling them.
- These functions should return a string without any trailing
- space, or nil. They must accept three arguments: the object or
- element itself, its contents or nil when it isn't recursive and
- the property list used as a communication channel.
- Contents, when not nil, are stripped from any global indentation
- \(although the relative one is preserved). They also always end
- with a single newline character.
- If, for a given type, no function is found, that element or
- object type will simply be ignored, along with any blank line or
- white space at its end. The same will happen if the function
- returns the nil value. If that function returns the empty
- string, the type will be ignored, but the blank lines or white
- spaces will be kept.
- In addition to element and object types, one function can be
- associated to the `template' symbol and another one to the
- `plain-text' symbol.
- The former returns the final transcoded string, and can be used
- to add a preamble and a postamble to document's body. It must
- accept two arguments: the transcoded string and the property list
- containing export options.
- The latter, when defined, is to be called on every text not
- recognized as an element or an object. It must accept two
- arguments: the text string and the information channel. It is an
- appropriate place to protect special chars relative to the
- back-end.
- BODY can start with pre-defined keyword arguments. The following
- keywords are understood:
- :export-block
- String, or list of strings, representing block names that
- will not be parsed. This is used to specify blocks that will
- contain raw code specific to the back-end. These blocks
- still have to be handled by the relative `export-block' type
- translator.
- :filters-alist
- Alist between filters and function, or list of functions,
- specific to the back-end. See `org-export-filters-alist' for
- a list of all allowed filters. Filters defined here
- shouldn't make a back-end test, as it may prevent back-ends
- derived from this one to behave properly.
- :menu-entry
- Menu entry for the export dispatcher. It should be a list
- like:
- \(KEY DESCRIPTION-OR-ORDINAL ACTION-OR-MENU)
- where :
- KEY is a free character selecting the back-end.
- DESCRIPTION-OR-ORDINAL is either a string or a number.
- If it is a string, is will be used to name the back-end in
- its menu entry. If it is a number, the following menu will
- be displayed as a sub-menu of the back-end with the same
- KEY. Also, the number will be used to determine in which
- order such sub-menus will appear (lowest first).
- ACTION-OR-MENU is either a function or an alist.
- If it is an action, it will be called with three arguments:
- SUBTREEP, VISIBLE-ONLY and BODY-ONLY. See `org-export-as'
- for further explanations.
- If it is an alist, associations should follow the
- pattern:
- \(KEY DESCRIPTION ACTION)
- where KEY, DESCRIPTION and ACTION are described above.
- Valid values include:
- \(?m \"My Special Back-end\" my-special-export-function)
- or
- \(?l \"Export to LaTeX\"
- \((?b \"TEX (buffer)\" org-e-latex-export-as-latex)
- \(?l \"TEX (file)\" org-e-latex-export-to-latex)
- \(?p \"PDF file\" org-e-latex-export-to-pdf)
- \(?o \"PDF file and open\"
- \(lambda (subtree visible body-only)
- \(org-open-file
- \(org-e-latex-export-to-pdf subtree visible body-only))))))
- :options-alist
- Alist between back-end specific properties introduced in
- communication channel and how their value are acquired. See
- `org-export-options-alist' for more information about
- structure of the values."
- (declare (debug (&define name sexp [&rest [keywordp sexp]] defbody))
- (indent 1))
- (let (export-block filters menu-entry options contents)
- (while (keywordp (car body))
- (case (pop body)
- (:export-block (let ((names (pop body)))
- (setq export-block
- (if (consp names) (mapcar 'upcase names)
- (list (upcase names))))))
- (:filters-alist (setq filters (pop body)))
- (:menu-entry (setq menu-entry (pop body)))
- (:options-alist (setq options (pop body)))
- (t (pop body))))
- (setq contents (append (list :translate-alist translators)
- (and filters (list :filters-alist filters))
- (and options (list :options-alist options))
- (and menu-entry (list :menu-entry menu-entry))))
- `(progn
-
- (let ((registeredp (assq ',backend org-export-registered-backends)))
- (if registeredp (setcdr registeredp ',contents)
- (push (cons ',backend ',contents) org-export-registered-backends)))
-
- ,(when export-block
- `(mapc
- (lambda (name)
- (add-to-list 'org-element-block-name-alist
- `(,name . org-element-export-block-parser)))
- ',export-block))
-
- ,@body)))
- (defmacro org-export-define-derived-backend (child parent &rest body)
- "Create a new back-end as a variant of an existing one.
- CHILD is the name of the derived back-end. PARENT is the name of
- the parent back-end.
- BODY can start with pre-defined keyword arguments. The following
- keywords are understood:
- :export-block
- String, or list of strings, representing block names that
- will not be parsed. This is used to specify blocks that will
- contain raw code specific to the back-end. These blocks
- still have to be handled by the relative `export-block' type
- translator.
- :filters-alist
- Alist of filters that will overwrite or complete filters
- defined in PARENT back-end. See `org-export-filters-alist'
- for a list of allowed filters.
- :menu-entry
- Menu entry for the export dispatcher. See
- `org-export-define-backend' for more information about the
- expected value.
- :options-alist
- Alist of back-end specific properties that will overwrite or
- complete those defined in PARENT back-end. Refer to
- `org-export-options-alist' for more information about
- structure of the values.
- :translate-alist
- Alist of element and object types and transcoders that will
- overwrite or complete transcode table from PARENT back-end.
- Refer to `org-export-define-backend' for detailed information
- about transcoders.
- As an example, here is how one could define \"my-latex\" back-end
- as a variant of `e-latex' back-end with a custom template
- function:
- \(org-export-define-derived-backend my-latex e-latex
- :translate-alist ((template . my-latex-template-fun)))
- The back-end could then be called with, for example:
- \(org-export-to-buffer 'my-latex \"*Test my-latex*\")"
- (declare (debug (&define name sexp [&rest [keywordp sexp]] def-body))
- (indent 2))
- (let (export-block filters menu-entry options translators contents)
- (while (keywordp (car body))
- (case (pop body)
- (:export-block (let ((names (pop body)))
- (setq export-block
- (if (consp names) (mapcar 'upcase names)
- (list (upcase names))))))
- (:filters-alist (setq filters (pop body)))
- (:menu-entry (setq menu-entry (pop body)))
- (:options-alist (setq options (pop body)))
- (:translate-alist (setq translators (pop body)))
- (t (pop body))))
- (setq contents (append
- (let ((p-table (org-export-backend-translate-table parent)))
- (list :translate-alist (append translators p-table)))
- (let ((p-filters (org-export-backend-filters parent)))
- (list :filters-alist (append filters p-filters)))
- (let ((p-options (org-export-backend-options parent)))
- (list :options-alist (append options p-options)))
- (and menu-entry (list :menu-entry menu-entry))))
- `(progn
-
- (let ((registeredp (assq ',child org-export-registered-backends)))
- (if registeredp (setcdr registeredp ',contents)
- (push (cons ',child ',contents) org-export-registered-backends)))
-
- ,(when export-block
- `(mapc
- (lambda (name)
- (add-to-list 'org-element-block-name-alist
- `(,name . org-element-export-block-parser)))
- ',export-block))
-
- ,@body)))
- (defun org-export-backend-filters (backend)
- "Return filters for BACKEND."
- (plist-get (cdr (assq backend org-export-registered-backends))
- :filters-alist))
- (defun org-export-backend-menu (backend)
- "Return menu entry for BACKEND."
- (plist-get (cdr (assq backend org-export-registered-backends))
- :menu-entry))
- (defun org-export-backend-options (backend)
- "Return export options for BACKEND."
- (plist-get (cdr (assq backend org-export-registered-backends))
- :options-alist))
- (defun org-export-backend-translate-table (backend)
- "Return translate table for BACKEND."
- (plist-get (cdr (assq backend org-export-registered-backends))
- :translate-alist))
- (defun org-export-barf-if-invalid-backend (backend)
- "Signal an error if BACKEND isn't defined."
- (unless (org-export-backend-translate-table backend)
- (error "Unknown \"%s\" back-end: Aborting export" backend)))
- (defun org-export-get-environment (&optional backend subtreep ext-plist)
- "Collect export options from the current buffer.
- Optional argument BACKEND is a symbol specifying which back-end
- specific options to read, if any.
- When optional argument SUBTREEP is non-nil, assume the export is
- done against the current sub-tree.
- Third optional argument EXT-PLIST is a property list with
- external parameters overriding Org default settings, but still
- inferior to file-local settings."
-
- (org-export--install-letbind-maybe)
-
- (org-combine-plists
-
- (org-export--get-global-options backend)
-
- ext-plist
-
- (org-export--get-inbuffer-options
- backend
- (and buffer-file-name (org-remove-double-quotes buffer-file-name)))
-
- (and subtreep (org-export--get-subtree-options backend))
-
- (list
- :back-end
- backend
- :translate-alist
- (org-export-backend-translate-table backend)
- :footnote-definition-alist
-
-
-
- (let (alist)
- (org-with-wide-buffer
- (goto-char (point-min))
- (while (re-search-forward org-footnote-definition-re nil t)
- (let ((def (save-match-data (org-element-at-point))))
- (when (eq (org-element-type def) 'footnote-definition)
- (push
- (cons (org-element-property :label def)
- (let ((cbeg (org-element-property :contents-begin def)))
- (when cbeg
- (org-element--parse-elements
- cbeg (org-element-property :contents-end def)
- nil nil nil nil (list 'org-data nil)))))
- alist))))
- alist))
- :id-alist
-
- (let (alist)
- (org-with-wide-buffer
- (goto-char (point-min))
- (while (re-search-forward "\\[\\[id:\\S-+?\\]" nil t)
- (let ((link (org-element-context)))
- (when (eq (org-element-type link) 'link)
- (let* ((id (org-element-property :path link))
- (file (org-id-find-id-file id)))
- (when file
- (push (cons id (file-relative-name file)) alist)))))))
- alist))))
- (defun org-export--parse-option-keyword (options &optional backend)
- "Parse an OPTIONS line and return values as a plist.
- Optional argument BACKEND is a symbol specifying which back-end
- specific items to read, if any."
- (let* ((all (append org-export-options-alist
- (and backend (org-export-backend-options backend))))
-
- (alist (delq nil
- (mapcar (lambda (e)
- (when (nth 2 e) (cons (regexp-quote (nth 2 e))
- (car e))))
- all)))
- plist)
- (mapc (lambda (e)
- (when (string-match (concat "\\(\\`\\|[ \t]\\)"
- (car e)
- ":\\(([^)\n]+)\\|[^ \t\n\r;,.]*\\)")
- options)
- (setq plist (plist-put plist
- (cdr e)
- (car (read-from-string
- (match-string 2 options)))))))
- alist)
- plist))
- (defun org-export--get-subtree-options (&optional backend)
- "Get export options in subtree at point.
- Optional argument BACKEND is a symbol specifying back-end used
- for export. Return options as a plist."
-
-
-
- (org-with-wide-buffer
- (let (prop plist)
-
- (unless (org-at-heading-p) (org-back-to-heading t))
-
-
- (when (setq prop (progn (looking-at org-todo-line-regexp)
- (or (save-match-data
- (org-entry-get (point) "EXPORT_TITLE"))
- (org-match-string-no-properties 3))))
- (setq plist
- (plist-put
- plist :title
- (org-element-parse-secondary-string
- prop (org-element-restriction 'keyword)))))
-
- (when (setq prop (org-entry-get (point) "EXPORT_OPTIONS"))
- (setq plist
- (nconc plist (org-export--parse-option-keyword prop backend))))
-
-
- (let ((seen '("TITLE")))
- (mapc
- (lambda (option)
- (let ((property (nth 1 option)))
- (when (and property (not (member property seen)))
- (let* ((subtree-prop (concat "EXPORT_" property))
-
- (value (let ((case-fold-search t))
- (org-entry-get (point) subtree-prop))))
- (push property seen)
- (when value
- (setq plist
- (plist-put
- plist
- (car option)
-
- (if (member property org-element-document-properties)
- (org-element-parse-secondary-string
- value (org-element-restriction 'keyword))
- value))))))))
-
-
- (append (and backend (org-export-backend-options backend))
- org-export-options-alist)))
-
- plist)))
- (defun org-export--get-inbuffer-options (&optional backend files)
- "Return current buffer export options, as a plist.
- Optional argument BACKEND, when non-nil, is a symbol specifying
- which back-end specific options should also be read in the
- process.
- Optional argument FILES is a list of setup files names read so
- far, used to avoid circular dependencies.
- Assume buffer is in Org mode. Narrowing, if any, is ignored."
- (org-with-wide-buffer
- (goto-char (point-min))
- (let ((case-fold-search t) plist)
-
- (let ((special-re
- (format "^[ \t]*#\\+%s:" (regexp-opt org-export-special-keywords))))
- (while (re-search-forward special-re nil t)
- (let ((element (org-element-at-point)))
- (when (eq (org-element-type element) 'keyword)
- (let* ((key (org-element-property :key element))
- (val (org-element-property :value element))
- (prop
- (cond
- ((equal key "SETUP_FILE")
- (let ((file
- (expand-file-name
- (org-remove-double-quotes (org-trim val)))))
-
- (unless (member file files)
- (with-temp-buffer
- (insert (org-file-contents file 'noerror))
- (org-mode)
- (org-export--get-inbuffer-options
- backend (cons file files))))))
- ((equal key "OPTIONS")
- (org-export--parse-option-keyword val backend))
- ((equal key "FILETAGS")
- (list :filetags
- (org-uniquify
- (append (org-split-string val ":")
- (plist-get plist :filetags))))))))
- (setq plist (org-combine-plists plist prop)))))))
-
- (let* ((all (append org-export-options-alist
-
-
- (and backend (org-export-backend-options backend))))
-
- (alist
- (delq nil (mapcar
- (lambda (e) (when (nth 1 e) (cons (nth 1 e) (car e))))
- all)))
-
-
- (opt-re (format "^[ \t]*#\\+%s:"
- (regexp-opt
- (delq nil (mapcar (lambda (e) (nth 1 e)) all))))))
- (goto-char (point-min))
- (while (re-search-forward opt-re nil t)
- (let ((element (org-element-at-point)))
- (when (eq (org-element-type element) 'keyword)
- (let* ((key (org-element-property :key element))
- (val (org-element-property :value element))
- (prop (cdr (assoc key alist)))
- (behaviour (nth 4 (assq prop all))))
- (setq plist
- (plist-put
- plist prop
-
- (case behaviour
- (space
- (if (not (plist-get plist prop)) (org-trim val)
- (concat (plist-get plist prop) " " (org-trim val))))
- (newline
- (org-trim
- (concat (plist-get plist prop) "\n" (org-trim val))))
- (split
- `(,@(plist-get plist prop) ,@(org-split-string val)))
- ('t val)
- (otherwise (if (not (plist-member plist prop)) val
- (plist-get plist prop))))))))))
-
-
- (mapc
- (lambda (key)
- (let* ((prop (cdr (assoc key alist)))
- (value (and prop (plist-get plist prop))))
- (when (stringp value)
- (setq plist
- (plist-put
- plist prop
- (org-element-parse-secondary-string
- value (org-element-restriction 'keyword)))))))
- org-element-document-properties))
-
- plist)))
- (defun org-export--get-buffer-attributes ()
- "Return properties related to buffer attributes, as a plist."
- (let ((visited-file (buffer-file-name (buffer-base-buffer))))
- (list
-
- :input-file visited-file
- :title (or (and visited-file
- (file-name-sans-extension
- (file-name-nondirectory visited-file)))
- (buffer-name (buffer-base-buffer))))))
- (defun org-export--get-global-options (&optional backend)
- "Return global export options as a plist.
- Optional argument BACKEND, if non-nil, is a symbol specifying
- which back-end specific export options should also be read in the
- process."
- (let ((all (append org-export-options-alist
- (and backend (org-export-backend-options backend))))
-
- plist)
- (mapc
- (lambda (cell)
- (setq plist
- (plist-put
- plist
- (car cell)
-
-
-
- (let ((value (eval (nth 3 cell))))
- (if (not (stringp value)) value
- (let ((keyword (nth 1 cell)))
- (if (not (member keyword org-element-document-properties))
- value
- (org-element-parse-secondary-string
- value (org-element-restriction 'keyword)))))))))
- all)
-
- plist))
- (defvar org-export--allow-BIND-local nil)
- (defun org-export--confirm-letbind ()
- "Can we use #+BIND values during export?
- By default this will ask for confirmation by the user, to divert
- possible security risks."
- (cond
- ((not org-export-allow-BIND) nil)
- ((eq org-export-allow-BIND t) t)
- ((local-variable-p 'org-export--allow-BIND-local)
- org-export--allow-BIND-local)
- (t (org-set-local 'org-export--allow-BIND-local
- (yes-or-no-p "Allow BIND values in this buffer? ")))))
- (defun org-export--install-letbind-maybe ()
- "Install the values from #+BIND lines as local variables.
- Variables must be installed before in-buffer options are
- retrieved."
- (let ((case-fold-search t) letbind pair)
- (org-with-wide-buffer
- (goto-char (point-min))
- (while (re-search-forward "^[ \t]*#\\+BIND:" nil t)
- (let* ((element (org-element-at-point))
- (value (org-element-property :value element)))
- (when (and (eq (org-element-type element) 'keyword)
- (not (equal value ""))
- (org-export--confirm-letbind))
- (push (read (format "(%s)" value)) letbind)))))
- (dolist (pair (nreverse letbind))
- (org-set-local (car pair) (nth 1 pair)))))
- (defun org-export-collect-tree-properties (data info)
- "Extract tree properties from parse tree.
- DATA is the parse tree from which information is retrieved. INFO
- is a list holding export options.
- Following tree properties are set or updated:
- `:exported-data' Hash table used to memoize results from
- `org-export-data'.
- `:footnote-definition-alist' List of footnotes definitions in
- original buffer and current parse tree.
- `:headline-offset' Offset between true level of headlines and
- local level. An offset of -1 means an headline
- of level 2 should be considered as a level
- 1 headline in the context.
- `:headline-numbering' Alist of all headlines as key an the
- associated numbering as value.
- `:ignore-list' List of elements that should be ignored during
- export.
- `:target-list' List of all targets in the parse tree.
- Return updated plist."
-
-
- (setq info (plist-put info :parse-tree data))
-
-
-
- (setq info
- (plist-put info
- :ignore-list
- (append (org-export--populate-ignore-list data info)
- (plist-get info :ignore-list))))
-
-
- (setq info
- (plist-put info
- :headline-offset
- (- 1 (org-export--get-min-level data info))))
-
-
-
-
-
- (let ((defs (plist-get info :footnote-definition-alist)))
- (org-element-map
- data 'footnote-definition
- (lambda (fn)
- (push (cons (org-element-property :label fn)
- `(org-data nil ,@(org-element-contents fn)))
- defs)))
- (setq info (plist-put info :footnote-definition-alist defs)))
-
-
- (nconc
- `(:target-list
- ,(org-element-map
- data '(keyword target)
- (lambda (blob)
- (when (or (eq (org-element-type blob) 'target)
- (string= (org-element-property :key blob) "TARGET"))
- blob)) info)
- :headline-numbering ,(org-export--collect-headline-numbering data info)
- :exported-data ,(make-hash-table :test 'eq :size 4001))
- info))
- (defun org-export--get-min-level (data options)
- "Return minimum exportable headline's level in DATA.
- DATA is parsed tree as returned by `org-element-parse-buffer'.
- OPTIONS is a plist holding export options."
- (catch 'exit
- (let ((min-level 10000))
- (mapc
- (lambda (blob)
- (when (and (eq (org-element-type blob) 'headline)
- (not (memq blob (plist-get options :ignore-list))))
- (setq min-level
- (min (org-element-property :level blob) min-level)))
- (when (= min-level 1) (throw 'exit 1)))
- (org-element-contents data))
-
-
- (if (= min-level 10000) 1 min-level))))
- (defun org-export--collect-headline-numbering (data options)
- "Return numbering of all exportable headlines in a parse tree.
- DATA is the parse tree. OPTIONS is the plist holding export
- options.
- Return an alist whose key is an headline and value is its
- associated numbering \(in the shape of a list of numbers\)."
- (let ((numbering (make-vector org-export-max-depth 0)))
- (org-element-map
- data
- 'headline
- (lambda (headline)
- (let ((relative-level
- (1- (org-export-get-relative-level headline options))))
- (cons
- headline
- (loop for n across numbering
- for idx from 0 to org-export-max-depth
- when (< idx relative-level) collect n
- when (= idx relative-level) collect (aset numbering idx (1+ n))
- when (> idx relative-level) do (aset numbering idx 0)))))
- options)))
- (defun org-export--populate-ignore-list (data options)
- "Return list of elements and objects to ignore during export.
- DATA is the parse tree to traverse. OPTIONS is the plist holding
- export options."
- (let* (ignore
- walk-data
-
- (selected (org-export--selected-trees data options))
- (walk-data
- (lambda (data)
-
- (let ((type (org-element-type data)))
- (if (org-export--skip-p data options selected) (push data ignore)
- (if (and (eq type 'headline)
- (eq (plist-get options :with-archived-trees) 'headline)
- (org-element-property :archivedp data))
-
-
- (mapc (lambda (e) (push e ignore))
- (org-element-contents data))
-
- (let ((sec-prop
- (cdr (assq type org-element-secondary-value-alist))))
- (when sec-prop
- (mapc walk-data (org-element-property sec-prop data))))
-
- (mapc walk-data (org-element-contents data))))))))
-
- (funcall walk-data data)
-
- ignore))
- (defun org-export--selected-trees (data info)
- "Return list of headlines containing a select tag in their tree.
- DATA is parsed data as returned by `org-element-parse-buffer'.
- INFO is a plist holding export options."
- (let* (selected-trees
- walk-data
- (walk-data
- (function
- (lambda (data genealogy)
- (case (org-element-type data)
- (org-data (mapc (lambda (el) (funcall walk-data el genealogy))
- (org-element-contents data)))
- (headline
- (let ((tags (org-element-property :tags data)))
- (if (loop for tag in (plist-get info :select-tags)
- thereis (member tag tags))
-
-
-
- (setq selected-trees
- (append
- genealogy
- (org-element-map data 'headline 'identity)
- selected-trees))
-
- (mapc
- (lambda (el) (funcall walk-data el (cons data genealogy)))
- (org-element-contents data))))))))))
- (funcall walk-data data nil) selected-trees))
- (defun org-export--skip-p (blob options selected)
- "Non-nil when element or object BLOB should be skipped during export.
- OPTIONS is the plist holding export options. SELECTED, when
- non-nil, is a list of headlines belonging to a tree with a select
- tag."
- (case (org-element-type blob)
- (clock (not (plist-get options :with-clocks)))
- (drawer
- (or (not (plist-get options :with-drawers))
- (and (consp (plist-get options :with-drawers))
- (not (member (org-element-property :drawer-name blob)
- (plist-get options :with-drawers))))))
- (headline
- (let ((with-tasks (plist-get options :with-tasks))
- (todo (org-element-property :todo-keyword blob))
- (todo-type (org-element-property :todo-type blob))
- (archived (plist-get options :with-archived-trees))
- (tags (org-element-property :tags blob)))
- (or
-
- (loop for k in (plist-get options :exclude-tags)
- thereis (member k tags))
-
-
- (and selected (not (memq blob selected)))
-
- (org-element-property :commentedp blob)
-
- (and (not archived) (org-element-property :archivedp blob))
-
- (and todo
- (or (not with-tasks)
- (and (memq with-tasks '(todo done))
- (not (eq todo-type with-tasks)))
- (and (consp with-tasks) (not (member todo with-tasks))))))))
- (inlinetask (not (plist-get options :with-inlinetasks)))
- (planning (not (plist-get options :with-plannings)))
- (statistics-cookie (not (plist-get options :with-statistics-cookies)))
- (table-cell
- (and (org-export-table-has-special-column-p
- (org-export-get-parent-table blob))
- (not (org-export-get-previous-element blob options))))
- (table-row (org-export-table-row-is-special-p blob options))
- (timestamp
- (case (plist-get options :with-timestamps)
-
- ('nil t)
-
-
- (active
- (not (memq (org-element-property :type blob)
- '(active active-range))))
-
-
- (inactive
- (not (memq (org-element-property :type blob)
- '(inactive inactive-range))))))))
- (defun org-export-transcoder (blob info)
- "Return appropriate transcoder for BLOB.
- INFO is a plist containing export directives."
- (let ((type (org-element-type blob)))
-
- (if (eq type 'org-data) (lambda (blob contents info) contents)
- (let ((transcoder (cdr (assq type (plist-get info :translate-alist)))))
- (and (functionp transcoder) transcoder)))))
- (defun org-export-data (data info)
- "Convert DATA into current back-end format.
- DATA is a parse tree, an element or an object or a secondary
- string. INFO is a plist holding export options.
- Return transcoded string."
- (let ((memo (gethash data (plist-get info :exported-data) 'no-memo)))
- (if (not (eq memo 'no-memo)) memo
- (let* ((type (org-element-type data))
- (results
- (cond
-
- ((memq data (plist-get info :ignore-list)) nil)
-
-
- ((eq type 'plain-text)
- (org-no-properties
- (org-export-filter-apply-functions
- (plist-get info :filter-plain-text)
- (let ((transcoder (org-export-transcoder data info)))
- (if transcoder (funcall transcoder data info) data))
- info)))
-
-
- ((not (org-export--interpret-p data info))
- (org-export-data
- (org-export-expand
- data
- (mapconcat (lambda (blob) (org-export-data blob info))
- (org-element-contents data)
- ""))
- info))
-
- ((not type)
- (mapconcat (lambda (obj) (org-export-data obj info)) data ""))
-
-
-
- ((or (not (org-element-contents data))
- (and (eq type 'headline)
- (eq (plist-get info :with-archived-trees) 'headline)
- (org-element-property :archivedp data)))
- (let ((transcoder (org-export-transcoder data info)))
- (and (functionp transcoder)
- (funcall transcoder data nil info))))
-
- (t
- (let ((transcoder (org-export-transcoder data info)))
- (when transcoder
- (let* ((greaterp (memq type org-element-greater-elements))
- (objectp
- (and (not greaterp)
- (memq type org-element-recursive-objects)))
- (contents
- (mapconcat
- (lambda (element) (org-export-data element info))
- (org-element-contents
- (if (or greaterp objectp) data
-
-
-
- (org-element-normalize-contents
- data
-
-
-
-
-
- (when (eq type 'paragraph)
- (let ((parent (org-export-get-parent data)))
- (and
- (eq (car (org-element-contents parent))
- data)
- (memq (org-element-type parent)
- '(footnote-definition item))))))))
- "")))
- (funcall transcoder data
- (if (not greaterp) contents
- (org-element-normalize-string contents))
- info))))))))
-
- (puthash
- data
- (cond
- ((not results) nil)
- ((memq type '(org-data plain-text nil)) results)
-
-
- (t
- (let ((results
- (org-export-filter-apply-functions
- (plist-get info (intern (format ":filter-%s" type)))
- (let ((post-blank (or (org-element-property :post-blank data)
- 0)))
- (if (memq type org-element-all-elements)
- (concat (org-element-normalize-string results)
- (make-string post-blank ?\n))
- (concat results (make-string post-blank ? ))))
- info)))
- results)))
- (plist-get info :exported-data))))))
- (defun org-export--interpret-p (blob info)
- "Non-nil if element or object BLOB should be interpreted as Org syntax.
- Check is done according to export options INFO, stored as
- a plist."
- (case (org-element-type blob)
-
- (entity (plist-get info :with-entities))
-
- (emphasis (plist-get info :with-emphasize))
-
- (fixed-width (plist-get info :with-fixed-width))
-
- ((footnote-definition footnote-reference)
- (plist-get info :with-footnotes))
-
- ((subscript superscript)
- (let ((sub/super-p (plist-get info :with-sub-superscript)))
- (if (eq sub/super-p '{})
- (org-element-property :use-brackets-p blob)
- sub/super-p)))
-
- (table (plist-get info :with-tables))
- (otherwise t)))
- (defun org-export-expand (blob contents)
- "Expand a parsed element or object to its original state.
- BLOB is either an element or an object. CONTENTS is its
- contents, as a string or nil."
- (funcall
- (intern (format "org-element-%s-interpreter" (org-element-type blob)))
- blob contents))
- (defun org-export-ignore-element (element info)
- "Add ELEMENT to `:ignore-list' in INFO.
- Any element in `:ignore-list' will be skipped when using
- `org-element-map'. INFO is modified by side effects."
- (plist-put info :ignore-list (cons element (plist-get info :ignore-list))))
- (defvar org-export-before-processing-hook nil
- "Hook run at the beginning of the export process.
- This is run before include keywords and macros are expanded and
- Babel code blocks executed, on a copy of the original buffer
- being exported. Visibility and narrowing are preserved. Point
- is at the beginning of the buffer.
- Every function in this hook will be called with one argument: the
- back-end currently used, as a symbol.")
- (defvar org-export-before-parsing-hook nil
- "Hook run before parsing an export buffer.
- This is run after include keywords and macros have been expanded
- and Babel code blocks executed, on a copy of the original buffer
- being exported. Visibility and narrowing are preserved. Point
- is at the beginning of the buffer.
- Every function in this hook will be called with one argument: the
- back-end currently used, as a symbol.")
- (defvar org-export-filter-parse-tree-functions nil
- "List of functions applied to the parsed tree.
- Each filter is called with three arguments: the parse tree, as
- returned by `org-element-parse-buffer', the back-end, as
- a symbol, and the communication channel, as a plist. It must
- return the modified parse tree to transcode.")
- (defvar org-export-filter-final-output-functions nil
- "List of functions applied to the transcoded string.
- Each filter is called with three arguments: the full transcoded
- string, the back-end, as a symbol, and the communication channel,
- as a plist. It must return a string that will be used as the
- final export output.")
- (defvar org-export-filter-plain-text-functions nil
- "List of functions applied to plain text.
- Each filter is called with three arguments: a string which
- contains no Org syntax, the back-end, as a symbol, and the
- communication channel, as a plist. It must return a string or
- nil.")
- (defvar org-export-filter-babel-call-functions nil
- "List of functions applied to a transcoded babel-call.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-center-block-functions nil
- "List of functions applied to a transcoded center block.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-clock-functions nil
- "List of functions applied to a transcoded clock.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-comment-functions nil
- "List of functions applied to a transcoded comment.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-comment-block-functions nil
- "List of functions applied to a transcoded comment-block.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-diary-sexp-functions nil
- "List of functions applied to a transcoded diary-sexp.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-drawer-functions nil
- "List of functions applied to a transcoded drawer.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-dynamic-block-functions nil
- "List of functions applied to a transcoded dynamic-block.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-example-block-functions nil
- "List of functions applied to a transcoded example-block.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-export-block-functions nil
- "List of functions applied to a transcoded export-block.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-fixed-width-functions nil
- "List of functions applied to a transcoded fixed-width.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-footnote-definition-functions nil
- "List of functions applied to a transcoded footnote-definition.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-headline-functions nil
- "List of functions applied to a transcoded headline.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-horizontal-rule-functions nil
- "List of functions applied to a transcoded horizontal-rule.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-inlinetask-functions nil
- "List of functions applied to a transcoded inlinetask.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-item-functions nil
- "List of functions applied to a transcoded item.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-keyword-functions nil
- "List of functions applied to a transcoded keyword.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-latex-environment-functions nil
- "List of functions applied to a transcoded latex-environment.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-node-property-functions nil
- "List of functions applied to a transcoded node-property.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-paragraph-functions nil
- "List of functions applied to a transcoded paragraph.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-plain-list-functions nil
- "List of functions applied to a transcoded plain-list.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-planning-functions nil
- "List of functions applied to a transcoded planning.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-property-drawer-functions nil
- "List of functions applied to a transcoded property-drawer.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-quote-block-functions nil
- "List of functions applied to a transcoded quote block.
- Each filter is called with three arguments: the transcoded quote
- data, as a string, the back-end, as a symbol, and the
- communication channel, as a plist. It must return a string or
- nil.")
- (defvar org-export-filter-quote-section-functions nil
- "List of functions applied to a transcoded quote-section.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-section-functions nil
- "List of functions applied to a transcoded section.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-special-block-functions nil
- "List of functions applied to a transcoded special block.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-src-block-functions nil
- "List of functions applied to a transcoded src-block.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-table-functions nil
- "List of functions applied to a transcoded table.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-table-cell-functions nil
- "List of functions applied to a transcoded table-cell.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-table-row-functions nil
- "List of functions applied to a transcoded table-row.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-verse-block-functions nil
- "List of functions applied to a transcoded verse block.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-bold-functions nil
- "List of functions applied to transcoded bold text.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-code-functions nil
- "List of functions applied to transcoded code text.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-entity-functions nil
- "List of functions applied to a transcoded entity.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-export-snippet-functions nil
- "List of functions applied to a transcoded export-snippet.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-footnote-reference-functions nil
- "List of functions applied to a transcoded footnote-reference.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-inline-babel-call-functions nil
- "List of functions applied to a transcoded inline-babel-call.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-inline-src-block-functions nil
- "List of functions applied to a transcoded inline-src-block.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-italic-functions nil
- "List of functions applied to transcoded italic text.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-latex-fragment-functions nil
- "List of functions applied to a transcoded latex-fragment.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-line-break-functions nil
- "List of functions applied to a transcoded line-break.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-link-functions nil
- "List of functions applied to a transcoded link.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-macro-functions nil
- "List of functions applied to a transcoded macro.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-radio-target-functions nil
- "List of functions applied to a transcoded radio-target.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-statistics-cookie-functions nil
- "List of functions applied to a transcoded statistics-cookie.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-strike-through-functions nil
- "List of functions applied to transcoded strike-through text.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-subscript-functions nil
- "List of functions applied to a transcoded subscript.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-superscript-functions nil
- "List of functions applied to a transcoded superscript.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-target-functions nil
- "List of functions applied to a transcoded target.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-timestamp-functions nil
- "List of functions applied to a transcoded timestamp.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-underline-functions nil
- "List of functions applied to transcoded underline text.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defvar org-export-filter-verbatim-functions nil
- "List of functions applied to transcoded verbatim text.
- Each filter is called with three arguments: the transcoded data,
- as a string, the back-end, as a symbol, and the communication
- channel, as a plist. It must return a string or nil.")
- (defun org-export-filter-apply-functions (filters value info)
- "Call every function in FILTERS.
- Functions are called with arguments VALUE, current export
- back-end and INFO. A function returning a nil value will be
- skipped. If it returns the empty string, the process ends and
- VALUE is ignored.
- Call is done in a LIFO fashion, to be sure that developer
- specified filters, if any, are called first."
- (catch 'exit
- (dolist (filter filters value)
- (let ((result (funcall filter value (plist-get info :back-end) info)))
- (cond ((not result) value)
- ((equal value "") (throw 'exit nil))
- (t (setq value result)))))))
- (defun org-export-install-filters (info)
- "Install filters properties in communication channel.
- INFO is a plist containing the current communication channel.
- Return the updated communication channel."
- (let (plist)
-
- (mapc (lambda (p)
- (setq plist (plist-put plist (car p) (eval (cdr p)))))
- org-export-filters-alist)
-
- (mapc (lambda (p)
-
- (let ((key (car p)) (value (cdr p)))
- (when value
- (setq plist
- (plist-put
- plist key
- (if (atom value) (cons value (plist-get plist key))
- (append value (plist-get plist key))))))))
- (org-export-backend-filters (plist-get info :back-end)))
-
- (org-combine-plists info plist)))
- (defun org-export-as
- (backend &optional subtreep visible-only body-only ext-plist noexpand)
- "Transcode current Org buffer into BACKEND code.
- If narrowing is active in the current buffer, only transcode its
- narrowed part.
- If a region is active, transcode that region.
- When optional argument SUBTREEP is non-nil, transcode 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 return body
- code, without preamble nor postamble.
- Optional argument EXT-PLIST, when provided, is a property list
- with external parameters overriding Org default settings, but
- still inferior to file-local settings.
- Optional argument NOEXPAND, when non-nil, prevents included files
- to be expanded and Babel code to be executed.
- Return code as a string."
-
- (org-export-barf-if-invalid-backend backend)
- (save-excursion
- (save-restriction
-
-
-
- (cond ((org-region-active-p)
- (narrow-to-region (region-beginning) (region-end)))
- (subtreep
- (org-narrow-to-subtree)
- (goto-char (point-min))
- (forward-line)
- (narrow-to-region (point) (point-max))))
-
-
- (let ((info (org-export--get-buffer-attributes)) tree)
- (org-export-with-current-buffer-copy
-
- (run-hook-with-args 'org-export-before-processing-hook backend)
-
-
-
-
- (unless noexpand
- (org-export-expand-include-keyword)
-
-
- (org-macro-initialize-templates)
- (org-macro-replace-all org-macro-templates)
-
-
-
-
-
- (let ((org-current-export-file (current-buffer)))
- (org-export-blocks-preprocess)))
-
-
- (org-update-radio-target-regexp)
-
- (goto-char (point-min))
- (run-hook-with-args 'org-export-before-parsing-hook backend)
-
-
- (setq info
- (org-export-install-filters
- (org-combine-plists
- info (org-export-get-environment backend subtreep ext-plist))))
-
-
-
-
- (unless noexpand
- (org-macro-replace-all
- (list (cons "author"
- (org-element-interpret-data (plist-get info :author)))
- (cons "date"
- (org-element-interpret-data (plist-get info :date)))
-
- (cons "email" (or (plist-get info :email) ""))
- (cons "title"
- (org-element-interpret-data (plist-get info :title))))))
-
-
- (setq tree
- (org-export-filter-apply-functions
- (plist-get info :filter-parse-tree)
- (org-element-parse-buffer nil visible-only) info)))
-
-
- (setq info
- (org-combine-plists
- info (org-export-collect-tree-properties tree info)))
-
-
- (let* ((body (org-element-normalize-string
- (or (org-export-data tree info) "")))
- (template (cdr (assq 'template
- (plist-get info :translate-alist))))
- (output (org-export-filter-apply-functions
- (plist-get info :filter-final-output)
- (if (or (not (functionp template)) body-only) body
- (funcall template body info))
- info)))
-
- (when (and org-export-copy-to-kill-ring (org-string-nw-p output))
- (org-kill-new output))
- output)))))
- (defun org-export-to-buffer
- (backend buffer &optional subtreep visible-only body-only ext-plist noexpand)
- "Call `org-export-as' with output to a specified buffer.
- BACKEND is the back-end used for transcoding, as a symbol.
- BUFFER is the output buffer. If it already exists, it will be
- erased first, otherwise, it will be created.
- Optional arguments SUBTREEP, VISIBLE-ONLY, BODY-ONLY, EXT-PLIST
- and NOEXPAND are similar to those used in `org-export-as', which
- see.
- Return buffer."
- (let ((out (org-export-as
- backend subtreep visible-only body-only ext-plist noexpand))
- (buffer (get-buffer-create buffer)))
- (with-current-buffer buffer
- (erase-buffer)
- (insert out)
- (goto-char (point-min)))
- buffer))
- (defun org-export-to-file
- (backend file &optional subtreep visible-only body-only ext-plist noexpand)
- "Call `org-export-as' with output to a specified file.
- BACKEND is the back-end used for transcoding, as a symbol. FILE
- is the name of the output file, as a string.
- Optional arguments SUBTREEP, VISIBLE-ONLY, BODY-ONLY, EXT-PLIST
- and NOEXPAND are similar to those used in `org-export-as', which
- see.
- Return output file's name."
-
-
- (unless (file-writable-p file) (error "Output file not writable"))
-
- (let ((out (org-export-as
- backend subtreep visible-only body-only ext-plist noexpand)))
- (with-temp-buffer
- (insert out)
- (let ((coding-system-for-write org-export-coding-system))
- (write-file file))))
-
- file)
- (defun org-export-output-file-name (extension &optional subtreep pub-dir)
- "Return output file's name according to buffer specifications.
- EXTENSION is a string representing the output file extension,
- with the leading dot.
- With a non-nil optional argument SUBTREEP, try to determine
- output file's name by looking for \"EXPORT_FILE_NAME\" property
- of subtree at point.
- When optional argument PUB-DIR is set, use it as the publishing
- directory.
- When optional argument VISIBLE-ONLY is non-nil, don't export
- contents of hidden elements.
- Return file name as a string, or nil if it couldn't be
- determined."
- (let ((base-name
-
-
- (file-name-sans-extension
- (or (and subtreep
- (org-entry-get
- (save-excursion
- (ignore-errors (org-back-to-heading) (point)))
- "EXPORT_FILE_NAME" t))
-
-
- (let ((visited-file (buffer-file-name (buffer-base-buffer))))
- (and visited-file (file-name-nondirectory visited-file)))
-
- (let ((read-file-name-function
- (and org-completion-use-ido 'ido-read-file-name)))
- (read-file-name
- "Output file: " pub-dir nil nil nil
- (lambda (name)
- (string= (file-name-extension name t) extension))))))))
-
-
-
- (cond
- (pub-dir
- (concat (file-name-as-directory pub-dir)
- (file-name-nondirectory base-name)
- extension))
- ((file-name-absolute-p base-name) (concat base-name extension))
- (t (concat (file-name-as-directory ".") base-name extension)))))
- (defmacro org-export-with-current-buffer-copy (&rest body)
- "Apply BODY in a copy of the current buffer.
- The copy preserves local variables and visibility of the original
- buffer.
- Point is at buffer's beginning when BODY is applied."
- (declare (debug (body)))
- (org-with-gensyms (original-buffer offset buffer-string overlays region)
- `(let* ((,original-buffer (current-buffer))
- (,region (list (point-min) (point-max)))
- (,buffer-string (org-with-wide-buffer (buffer-string)))
- (,overlays (mapcar 'copy-overlay (apply 'overlays-in ,region))))
- (with-temp-buffer
- (let ((buffer-invisibility-spec nil))
- (org-clone-local-variables
- ,original-buffer
- "^\\(org-\\|orgtbl-\\|major-mode$\\|outline-\\(regexp\\|level\\)$\\)")
- (insert ,buffer-string)
- (apply 'narrow-to-region ,region)
- (mapc (lambda (ov)
- (move-overlay
- ov (overlay-start ov) (overlay-end ov) (current-buffer)))
- ,overlays)
- (goto-char (point-min))
- (progn ,@body))))))
- (defun org-export-expand-include-keyword (&optional included dir)
- "Expand every include keyword in buffer.
- Optional argument INCLUDED is a list of included file names along
- with their line restriction, when appropriate. It is used to
- avoid infinite recursion. Optional argument DIR is the current
- working directory. It is used to properly resolve relative
- paths."
- (let ((case-fold-search t))
- (goto-char (point-min))
- (while (re-search-forward "^[ \t]*#\\+INCLUDE: +\\(.*\\)[ \t]*$" nil t)
- (when (eq (org-element-type (save-match-data (org-element-at-point)))
- 'keyword)
- (beginning-of-line)
-
- (let* ((value (match-string 1))
- (ind (org-get-indentation))
- (file (and (string-match "^\"\\(\\S-+\\)\"" value)
- (prog1 (expand-file-name (match-string 1 value) dir)
- (setq value (replace-match "" nil nil value)))))
- (lines
- (and (string-match
- ":lines +\"\\(\\(?:[0-9]+\\)?-\\(?:[0-9]+\\)?\\)\"" value)
- (prog1 (match-string 1 value)
- (setq value (replace-match "" nil nil value)))))
- (env (cond ((string-match "\\<example\\>" value) 'example)
- ((string-match "\\<src\\(?: +\\(.*\\)\\)?" value)
- (match-string 1 value))))
-
-
-
-
- (minlevel
- (and (not env)
- (if (string-match ":minlevel +\\([0-9]+\\)" value)
- (prog1 (string-to-number (match-string 1 value))
- (setq value (replace-match "" nil nil value)))
- (let ((cur (org-current-level)))
- (if cur (1+ (org-reduced-level cur)) 1))))))
-
- (delete-region (point) (progn (forward-line) (point)))
- (cond
- ((not file) (error "Invalid syntax in INCLUDE keyword"))
- ((not (file-readable-p file)) (error "Cannot include file %s" file))
-
-
-
- ((member (list file lines) included)
- (error "Recursive file inclusion: %s" file))
- (t
- (cond
- ((eq env 'example)
- (insert
- (let ((ind-str (make-string ind ? ))
- (contents
- (org-escape-code-in-string
- (org-export--prepare-file-contents file lines))))
- (format "%s#+BEGIN_EXAMPLE\n%s%s#+END_EXAMPLE\n"
- ind-str contents ind-str))))
- ((stringp env)
- (insert
- (let ((ind-str (make-string ind ? ))
- (contents
- (org-escape-code-in-string
- (org-export--prepare-file-contents file lines))))
- (format "%s#+BEGIN_SRC %s\n%s%s#+END_SRC\n"
- ind-str env contents ind-str))))
- (t
- (insert
- (with-temp-buffer
- (org-mode)
- (insert
- (org-export--prepare-file-contents file lines ind minlevel))
- (org-export-expand-include-keyword
- (cons (list file lines) included)
- (file-name-directory file))
- (buffer-string))))))))))))
- (defun org-export--prepare-file-contents (file &optional lines ind minlevel)
- "Prepare the contents of FILE for inclusion and return them as a string.
- When optional argument LINES is a string specifying a range of
- lines, include only those lines.
- Optional argument IND, when non-nil, is an integer specifying the
- global indentation of returned contents. Since its purpose is to
- allow an included file to stay in the same environment it was
- created \(i.e. a list item), it doesn't apply past the first
- headline encountered.
- Optional argument MINLEVEL, when non-nil, is an integer
- specifying the level that any top-level headline in the included
- file should have."
- (with-temp-buffer
- (insert-file-contents file)
- (when lines
- (let* ((lines (split-string lines "-"))
- (lbeg (string-to-number (car lines)))
- (lend (string-to-number (cadr lines)))
- (beg (if (zerop lbeg) (point-min)
- (goto-char (point-min))
- (forward-line (1- lbeg))
- (point)))
- (end (if (zerop lend) (point-max)
- (goto-char (point-min))
- (forward-line (1- lend))
- (point))))
- (narrow-to-region beg end)))
-
-
-
- (goto-char (point-min))
- (org-skip-whitespace)
- (beginning-of-line)
- (delete-region (point-min) (point))
- (goto-char (point-max))
- (skip-chars-backward " \r\t\n")
- (forward-line)
- (delete-region (point) (point-max))
-
-
- (when ind
- (unless (eq major-mode 'org-mode) (org-mode))
- (goto-char (point-min))
- (let ((ind-str (make-string ind ? )))
- (while (not (or (eobp) (looking-at org-outline-regexp-bol)))
-
- (unless (and (looking-at org-footnote-definition-re)
- (eq (org-element-type (org-element-at-point))
- 'footnote-definition))
- (insert ind-str))
- (forward-line))))
-
-
-
- (when minlevel
- (unless (eq major-mode 'org-mode) (org-mode))
- (org-with-limited-levels
- (let ((levels (org-map-entries
- (lambda () (org-reduced-level (org-current-level))))))
- (when levels
- (let ((offset (- minlevel (apply 'min levels))))
- (unless (zerop offset)
- (when org-odd-levels-only (setq offset (* offset 2)))
-
-
- (org-map-entries
- (lambda () (if (< offset 0) (delete-char (abs offset))
- (insert (make-string offset ?*)))))))))))
- (org-element-normalize-string (buffer-string))))
- (defun org-export-read-attribute (attribute element &optional property)
- "Turn ATTRIBUTE property from ELEMENT into a plist.
- When optional argument PROPERTY is non-nil, return the value of
- that property within attributes.
- This function assumes attributes are defined as \":keyword
- value\" pairs. It is appropriate for `:attr_html' like
- properties."
- (let ((attributes
- (let ((value (org-element-property attribute element)))
- (and value
- (read (format "(%s)" (mapconcat 'identity value " ")))))))
- (if property (plist-get attributes property) attributes)))
- (defun org-export-get-caption (element &optional shortp)
- "Return caption from ELEMENT as a secondary string.
- When optional argument SHORTP is non-nil, return short caption,
- as a secondary string, instead.
- Caption lines are separated by a white space."
- (let ((full-caption (org-element-property :caption element)) caption)
- (dolist (line full-caption (cdr caption))
- (let ((cap (funcall (if shortp 'cdr 'car) line)))
- (when cap
- (setq caption (nconc (list " ") (copy-sequence cap) caption)))))))
- (defun org-export-with-backend (back-end data &rest args)
- "Call a transcoder from BACK-END on DATA."
- (org-export-barf-if-invalid-backend back-end)
- (let ((type (org-element-type data)))
- (if (or (memq type '(nil org-data)))
- (error "No foreign transcoder available")
- (let ((transcoder
- (cdr (assq type (org-export-backend-translate-table back-end)))))
- (if (functionp transcoder) (apply transcoder data args)
- (error "No foreign transcoder available"))))))
- (defun org-export-snippet-backend (export-snippet)
- "Return EXPORT-SNIPPET targeted back-end as a symbol.
- Translation, with `org-export-snippet-translation-alist', is
- applied."
- (let ((back-end (org-element-property :back-end export-snippet)))
- (intern
- (or (cdr (assoc back-end org-export-snippet-translation-alist))
- back-end))))
- (defun org-export-collect-footnote-definitions (data info)
- "Return an alist between footnote numbers, labels and definitions.
- DATA is the parse tree from which definitions are collected.
- INFO is the plist used as a communication channel.
- Definitions are sorted by order of references. They either
- appear as Org data or as a secondary string for inlined
- footnotes. Unreferenced definitions are ignored."
- (let* (num-alist
- collect-fn
- (collect-fn
- (function
- (lambda (data)
-
- (org-element-map
- data 'footnote-reference
- (lambda (fn)
- (when (org-export-footnote-first-reference-p fn info)
- (let ((def (org-export-get-footnote-definition fn info)))
- (push
- (list (org-export-get-footnote-number fn info)
- (org-element-property :label fn)
- def)
- num-alist)
-
- (when (eq (org-element-property :type fn) 'standard)
- (funcall collect-fn def)))))
-
-
- info nil 'footnote-definition)))))
- (funcall collect-fn (plist-get info :parse-tree))
- (reverse num-alist)))
- (defun org-export-footnote-first-reference-p (footnote-reference info)
- "Non-nil when a footnote reference is the first one for its label.
- FOOTNOTE-REFERENCE is the footnote reference being considered.
- INFO is the plist used as a communication channel."
- (let ((label (org-element-property :label footnote-reference)))
-
- (if (not label) t
-
-
- (let* (search-refs
- (search-refs
- (function
- (lambda (data)
- (org-element-map
- data 'footnote-reference
- (lambda (fn)
- (cond
- ((string= (org-element-property :label fn) label)
- (throw 'exit fn))
-
-
-
-
- ((eq (org-element-property :type fn) 'standard)
- (funcall search-refs
- (org-export-get-footnote-definition fn info)))))
-
-
- info 'first-match 'footnote-definition)))))
- (eq (catch 'exit (funcall search-refs (plist-get info :parse-tree)))
- footnote-reference)))))
- (defun org-export-get-footnote-definition (footnote-reference info)
- "Return definition of FOOTNOTE-REFERENCE as parsed data.
- INFO is the plist used as a communication channel."
- (let ((label (org-element-property :label footnote-reference)))
- (or (org-element-property :inline-definition footnote-reference)
- (cdr (assoc label (plist-get info :footnote-definition-alist))))))
- (defun org-export-get-footnote-number (footnote info)
- "Return number associated to a footnote.
- FOOTNOTE is either a footnote reference or a footnote definition.
- INFO is the plist used as a communication channel."
- (let* ((label (org-element-property :label footnote))
- seen-refs
- search-ref
- (search-ref
- (function
- (lambda (data)
-
-
- (org-element-map
- data 'footnote-reference
- (lambda (fn)
- (let ((fn-lbl (org-element-property :label fn)))
- (cond
-
- ((and (not fn-lbl) (eq fn footnote))
- (throw 'exit (1+ (length seen-refs))))
-
- ((and label (string= label fn-lbl))
- (throw 'exit (1+ (length seen-refs))))
-
-
-
- ((not fn-lbl) (push 'inline seen-refs) nil)
-
-
-
-
-
-
-
-
-
- ((not (member fn-lbl seen-refs))
- (push fn-lbl seen-refs)
- (funcall search-ref
- (org-export-get-footnote-definition fn info))
- nil))))
-
-
- info 'first-match 'footnote-definition)))))
- (catch 'exit (funcall search-ref (plist-get info :parse-tree)))))
- (defun org-export-get-relative-level (headline info)
- "Return HEADLINE relative level within current parsed tree.
- INFO is a plist holding contextual information."
- (+ (org-element-property :level headline)
- (or (plist-get info :headline-offset) 0)))
- (defun org-export-low-level-p (headline info)
- "Non-nil when HEADLINE is considered as low level.
- INFO is a plist used as a communication channel.
- A low level headlines has a relative level greater than
- `:headline-levels' property value.
- Return value is the difference between HEADLINE relative level
- and the last level being considered as high enough, or nil."
- (let ((limit (plist-get info :headline-levels)))
- (when (wholenump limit)
- (let ((level (org-export-get-relative-level headline info)))
- (and (> level limit) (- level limit))))))
- (defun org-export-get-headline-number (headline info)
- "Return HEADLINE numbering as a list of numbers.
- INFO is a plist holding contextual information."
- (cdr (assoc headline (plist-get info :headline-numbering))))
- (defun org-export-numbered-headline-p (headline info)
- "Return a non-nil value if HEADLINE element should be numbered.
- INFO is a plist used as a communication channel."
- (let ((sec-num (plist-get info :section-numbers))
- (level (org-export-get-relative-level headline info)))
- (if (wholenump sec-num) (<= level sec-num) sec-num)))
- (defun org-export-number-to-roman (n)
- "Convert integer N into a roman numeral."
- (let ((roman '((1000 . "M") (900 . "CM") (500 . "D") (400 . "CD")
- ( 100 . "C") ( 90 . "XC") ( 50 . "L") ( 40 . "XL")
- ( 10 . "X") ( 9 . "IX") ( 5 . "V") ( 4 . "IV")
- ( 1 . "I")))
- (res ""))
- (if (<= n 0)
- (number-to-string n)
- (while roman
- (if (>= n (caar roman))
- (setq n (- n (caar roman))
- res (concat res (cdar roman)))
- (pop roman)))
- res)))
- (defun org-export-get-tags (element info &optional tags inherited)
- "Return list of tags associated to ELEMENT.
- ELEMENT has either an `headline' or an `inlinetask' type. INFO
- is a plist used as a communication channel.
- Select tags (see `org-export-select-tags') and exclude tags (see
- `org-export-exclude-tags') are removed from the list.
- When non-nil, optional argument TAGS should be a list of strings.
- Any tag belonging to this list will also be removed.
- When optional argument INHERITED is non-nil, tags can also be
- inherited from parent headlines and FILETAGS keywords."
- (org-remove-if
- (lambda (tag) (or (member tag (plist-get info :select-tags))
- (member tag (plist-get info :exclude-tags))
- (member tag tags)))
- (if (not inherited) (org-element-property :tags element)
-
- (let ((current-tag-list (org-element-property :tags element)))
- (mapc
- (lambda (parent)
- (mapc
- (lambda (tag)
- (when (and (memq (org-element-type parent) '(headline inlinetask))
- (not (member tag current-tag-list)))
- (push tag current-tag-list)))
- (org-element-property :tags parent)))
- (org-export-get-genealogy element))
-
- (org-uniquify (append (plist-get info :filetags) current-tag-list))))))
- (defun org-export-get-node-property (property blob &optional inherited)
- "Return node PROPERTY value for BLOB.
- PROPERTY is normalized symbol (i.e. `:cookie-data'). BLOB is an
- element or object.
- If optional argument INHERITED is non-nil, the value can be
- inherited from a parent headline.
- Return value is a string or nil."
- (let ((headline (if (eq (org-element-type blob) 'headline) blob
- (org-export-get-parent-headline blob))))
- (if (not inherited) (org-element-property property blob)
- (let ((parent headline) value)
- (catch 'found
- (while parent
- (when (plist-member (nth 1 parent) property)
- (throw 'found (org-element-property property parent)))
- (setq parent (org-element-property :parent parent))))))))
- (defun org-export-get-category (blob info)
- "Return category for element or object BLOB.
- INFO is a plist used as a communication channel.
- CATEGORY is automatically inherited from a parent headline, from
- #+CATEGORY: keyword or created out of original file name. If all
- fail, the fall-back value is \"???\"."
- (or (let ((headline (if (eq (org-element-type blob) 'headline) blob
- (org-export-get-parent-headline blob))))
-
-
-
-
- (let ((parent headline) value)
- (catch 'found
- (while parent
- (let ((category (org-element-property :category parent)))
- (and category (not (equal "???" category))
- (throw 'found category)))
- (setq parent (org-element-property :parent parent))))))
- (org-element-map
- (plist-get info :parse-tree) 'keyword
- (lambda (kwd)
- (when (equal (org-element-property :key kwd) "CATEGORY")
- (org-element-property :value kwd)))
- info 'first-match)
- (let ((file (plist-get info :input-file)))
- (and file (file-name-sans-extension (file-name-nondirectory file))))
- "???"))
- (defun org-export-first-sibling-p (headline info)
- "Non-nil when HEADLINE is the first sibling in its sub-tree.
- INFO is a plist used as a communication channel."
- (not (eq (org-element-type (org-export-get-previous-element headline info))
- 'headline)))
- (defun org-export-last-sibling-p (headline info)
- "Non-nil when HEADLINE is the last sibling in its sub-tree.
- INFO is a plist used as a communication channel."
- (not (org-export-get-next-element headline info)))
- (defun org-export-solidify-link-text (s)
- "Take link text S and make a safe target out of it."
- (save-match-data
- (mapconcat 'identity (org-split-string s "[^a-zA-Z0-9_.-:]+") "-")))
- (defun org-export-get-coderef-format (path desc)
- "Return format string for code reference link.
- PATH is the link path. DESC is its description."
- (save-match-data
- (cond ((not desc) "%s")
- ((string-match (regexp-quote (concat "(" path ")")) desc)
- (replace-match "%s" t t desc))
- (t desc))))
- (defun org-export-inline-image-p (link &optional rules)
- "Non-nil if LINK object points to an inline image.
- Optional argument is a set of RULES defining inline images. It
- is an alist where associations have the following shape:
- \(TYPE . REGEXP)
- Applying a rule means apply REGEXP against LINK's path when its
- type is TYPE. The function will return a non-nil value if any of
- the provided rules is non-nil. The default rule is
- `org-export-default-inline-image-rule'.
- This only applies to links without a description."
- (and (not (org-element-contents link))
- (let ((case-fold-search t)
- (rules (or rules org-export-default-inline-image-rule)))
- (catch 'exit
- (mapc
- (lambda (rule)
- (and (string= (org-element-property :type link) (car rule))
- (string-match (cdr rule)
- (org-element-property :path link))
- (throw 'exit t)))
- rules)
-
- nil))))
- (defun org-export-resolve-coderef (ref info)
- "Resolve a code reference REF.
- INFO is a plist used as a communication channel.
- Return associated line number in source code, or REF itself,
- depending on src-block or example element's switches."
- (org-element-map
- (plist-get info :parse-tree) '(example-block src-block)
- (lambda (el)
- (with-temp-buffer
- (insert (org-trim (org-element-property :value el)))
- (let* ((label-fmt (regexp-quote
- (or (org-element-property :label-fmt el)
- org-coderef-label-format)))
- (ref-re
- (format "^.*?\\S-.*?\\([ \t]*\\(%s\\)\\)[ \t]*$"
- (replace-regexp-in-string "%s" ref label-fmt nil t))))
-
-
- (when (re-search-backward ref-re nil t)
- (cond
- ((org-element-property :use-labels el) ref)
- ((eq (org-element-property :number-lines el) 'continued)
- (+ (org-export-get-loc el info) (line-number-at-pos)))
- (t (line-number-at-pos)))))))
- info 'first-match))
- (defun org-export-resolve-fuzzy-link (link info)
- "Return LINK destination.
- INFO is a plist holding contextual information.
- Return value can be an object, an element, or nil:
- - If LINK path matches a target object (i.e. <<path>>) or
- element (i.e. \"#+TARGET: path\"), return it.
- - If LINK path exactly matches the name affiliated keyword
- \(i.e. #+NAME: path) of an element, return that element.
- - If LINK path exactly matches any headline name, return that
- element. If more than one headline share that name, priority
- will be given to the one with the closest common ancestor, if
- any, or the first one in the parse tree otherwise.
- - Otherwise, return nil.
- Assume LINK type is \"fuzzy\"."
- (let* ((path (org-element-property :path link))
- (match-title-p (eq (aref path 0) ?*)))
- (cond
-
-
-
- ((and (not match-title-p)
- (loop for target in (plist-get info :target-list)
- when (string= (org-element-property :value target) path)
- return target)))
-
-
- ((and (not match-title-p)
- (org-element-map
- (plist-get info :parse-tree) org-element-all-elements
- (lambda (el)
- (when (string= (org-element-property :name el) path) el))
- info 'first-match)))
-
-
-
-
- (t
- (let ((find-headline
- (function
-
-
- (lambda (name data)
- (org-element-map
- data 'headline
- (lambda (headline)
- (when (string=
- (org-element-property :raw-value headline)
- name)
- headline))
- info 'first-match)))))
-
-
- (or (catch 'exit
- (mapc
- (lambda (parent)
- (when (eq (org-element-type parent) 'headline)
- (let ((foundp (funcall find-headline path parent)))
- (when foundp (throw 'exit foundp)))))
- (org-export-get-genealogy link)) nil)
-
- (funcall find-headline
- (if match-title-p (substring path 1) path)
- (plist-get info :parse-tree))))))))
- (defun org-export-resolve-id-link (link info)
- "Return headline referenced as LINK destination.
- INFO is a plist used as a communication channel.
- Return value can be the headline element matched in current parse
- tree, a file name or nil. Assume LINK type is either \"id\" or
- \"custom-id\"."
- (let ((id (org-element-property :path link)))
-
- (or (org-element-map
- (plist-get info :parse-tree) 'headline
- (lambda (headline)
- (when (or (string= (org-element-property :id headline) id)
- (string= (org-element-property :custom-id headline) id))
- headline))
- info 'first-match)
-
- (cdr (assoc id (plist-get info :id-alist))))))
- (defun org-export-resolve-radio-link (link info)
- "Return radio-target object referenced as LINK destination.
- INFO is a plist used as a communication channel.
- Return value can be a radio-target object or nil. Assume LINK
- has type \"radio\"."
- (let ((path (org-element-property :path link)))
- (org-element-map
- (plist-get info :parse-tree) 'radio-target
- (lambda (radio)
- (when (equal (org-element-property :value radio) path) radio))
- info 'first-match)))
- (defun org-export-get-ordinal (element info &optional types predicate)
- "Return ordinal number of an element or object.
- ELEMENT is the element or object considered. INFO is the plist
- used as a communication channel.
- Optional argument TYPES, when non-nil, is a list of element or
- object types, as symbols, that should also be counted in.
- Otherwise, only provided element's type is considered.
- Optional argument PREDICATE is a function returning a non-nil
- value if the current element or object should be counted in. It
- accepts two arguments: the element or object being considered and
- the plist used as a communication channel. This allows to count
- only a certain type of objects (i.e. inline images).
- Return value is a list of numbers if ELEMENT is an headline or an
- item. It is nil for keywords. It represents the footnote number
- for footnote definitions and footnote references. If ELEMENT is
- a target, return the same value as if ELEMENT was the closest
- table, item or headline containing the target. In any other
- case, return the sequence number of ELEMENT among elements or
- objects of the same type."
-
-
- (unless (eq (org-element-type element) 'keyword)
-
-
- (when (eq (org-element-type element) 'target)
- (setq element
- (loop for parent in (org-export-get-genealogy element)
- when
- (memq
- (org-element-type parent)
- '(footnote-definition footnote-reference headline item
- table))
- return parent)))
- (case (org-element-type element)
-
- (headline (org-export-get-headline-number element info))
-
- (item (let ((struct (org-element-property :structure element)))
- (org-list-get-item-number
- (org-element-property :begin element)
- struct
- (org-list-prevs-alist struct)
- (org-list-parents-alist struct))))
- ((footnote-definition footnote-reference)
- (org-export-get-footnote-number element info))
- (otherwise
- (let ((counter 0))
-
- (org-element-map
- (plist-get info :parse-tree) (or types (org-element-type element))
- (lambda (el)
- (cond
- ((eq element el) (1+ counter))
- ((not predicate) (incf counter) nil)
- ((funcall predicate el info) (incf counter) nil)))
- info 'first-match))))))
- (defun org-export-get-loc (element info)
- "Return accumulated lines of code up to ELEMENT.
- INFO is the plist used as a communication channel.
- ELEMENT is excluded from count."
- (let ((loc 0))
- (org-element-map
- (plist-get info :parse-tree)
- `(src-block example-block ,(org-element-type element))
- (lambda (el)
- (cond
-
- ((eq el element))
-
-
- ((not (memq (org-element-type el) '(src-block example-block))) nil)
- ((let ((linums (org-element-property :number-lines el)))
- (when linums
-
- (let ((lines (org-count-lines
- (org-trim (org-element-property :value el)))))
- (setq loc (if (eq linums 'new) lines (+ loc lines))))))
-
- nil)))
- info 'first-match)
-
- loc))
- (defun org-export-unravel-code (element)
- "Clean source code and extract references out of it.
- ELEMENT has either a `src-block' an `example-block' type.
- Return a cons cell whose CAR is the source code, cleaned from any
- reference and protective comma and CDR is an alist between
- relative line number (integer) and name of code reference on that
- line (string)."
- (let* ((line 0) refs
-
-
- (code (let ((c (replace-regexp-in-string
- "\\`\\([ \t]*\n\\)+" ""
- (replace-regexp-in-string
- "\\(:?[ \t]*\n\\)*[ \t]*\\'" "\n"
- (org-element-property :value element)))))
-
- (if (or org-src-preserve-indentation
- (org-element-property :preserve-indent element))
- c
- (org-remove-indentation c))))
-
- (label-fmt (regexp-quote
- (or (org-element-property :label-fmt element)
- org-coderef-label-format)))
-
- (with-ref-re
- (format "^.*?\\S-.*?\\([ \t]*\\(%s\\)[ \t]*\\)$"
- (replace-regexp-in-string
- "%s" "\\([-a-zA-Z0-9_ ]+\\)" label-fmt nil t))))
-
- (cons
-
- (org-element-normalize-string
- (mapconcat
- (lambda (loc)
- (incf line)
- (if (not (string-match with-ref-re loc)) loc
-
- (push (cons line (match-string 3 loc)) refs)
- (replace-match "" nil nil loc 1)))
- (org-split-string code "\n") "\n"))
-
- refs)))
- (defun org-export-format-code (code fun &optional num-lines ref-alist)
- "Format CODE by applying FUN line-wise and return it.
- CODE is a string representing the code to format. FUN is
- a function. It must accept three arguments: a line of
- code (string), the current line number (integer) or nil and the
- reference associated to the current line (string) or nil.
- Optional argument NUM-LINES can be an integer representing the
- number of code lines accumulated until the current code. Line
- numbers passed to FUN will take it into account. If it is nil,
- FUN's second argument will always be nil. This number can be
- obtained with `org-export-get-loc' function.
- Optional argument REF-ALIST can be an alist between relative line
- number (i.e. ignoring NUM-LINES) and the name of the code
- reference on it. If it is nil, FUN's third argument will always
- be nil. It can be obtained through the use of
- `org-export-unravel-code' function."
- (let ((--locs (org-split-string code "\n"))
- (--line 0))
- (org-element-normalize-string
- (mapconcat
- (lambda (--loc)
- (incf --line)
- (let ((--ref (cdr (assq --line ref-alist))))
- (funcall fun --loc (and num-lines (+ num-lines --line)) --ref)))
- --locs "\n"))))
- (defun org-export-format-code-default (element info)
- "Return source code from ELEMENT, formatted in a standard way.
- ELEMENT is either a `src-block' or `example-block' element. INFO
- is a plist used as a communication channel.
- This function takes care of line numbering and code references
- inclusion. Line numbers, when applicable, appear at the
- beginning of the line, separated from the code by two white
- spaces. Code references, on the other hand, appear flushed to
- the right, separated by six white spaces from the widest line of
- code."
-
- (let* ((code-info (org-export-unravel-code element))
- (code (car code-info))
- (code-lines (org-split-string code "\n"))
- (refs (and (org-element-property :retain-labels element)
- (cdr code-info)))
-
- (num-start (case (org-element-property :number-lines element)
- (continued (org-export-get-loc element info))
- (new 0)))
- (num-fmt
- (and num-start
- (format "%%%ds "
- (length (number-to-string
- (+ (length code-lines) num-start))))))
-
-
-
- (max-width
- (+ (apply 'max (mapcar 'length code-lines))
- (if (not num-start) 0 (length (format num-fmt num-start))))))
- (org-export-format-code
- code
- (lambda (loc line-num ref)
- (let ((number-str (and num-fmt (format num-fmt line-num))))
- (concat
- number-str
- loc
- (and ref
- (concat (make-string
- (- (+ 6 max-width)
- (+ (length loc) (length number-str))) ? )
- (format "(%s)" ref))))))
- num-start refs)))
- (defun org-export-table-has-special-column-p (table)
- "Non-nil when TABLE has a special column.
- All special columns will be ignored during export."
-
-
-
-
- (let ((special-column-p 'empty))
- (catch 'exit
- (mapc
- (lambda (row)
- (when (eq (org-element-property :type row) 'standard)
- (let ((value (org-element-contents
- (car (org-element-contents row)))))
- (cond ((member value '(("/") ("#") ("!") ("$") ("*") ("_") ("^")))
- (setq special-column-p 'special))
- ((not value))
- (t (throw 'exit nil))))))
- (org-element-contents table))
- (eq special-column-p 'special))))
- (defun org-export-table-has-header-p (table info)
- "Non-nil when TABLE has an header.
- INFO is a plist used as a communication channel.
- A table has an header when it contains at least two row groups."
- (let ((rowgroup 1) row-flag)
- (org-element-map
- table 'table-row
- (lambda (row)
- (cond
- ((> rowgroup 1) t)
- ((and row-flag (eq (org-element-property :type row) 'rule))
- (incf rowgroup) (setq row-flag nil))
- ((and (not row-flag) (eq (org-element-property :type row) 'standard))
- (setq row-flag t) nil)))
- info)))
- (defun org-export-table-row-is-special-p (table-row info)
- "Non-nil if TABLE-ROW is considered special.
- INFO is a plist used as the communication channel.
- All special rows will be ignored during export."
- (when (eq (org-element-property :type table-row) 'standard)
- (let ((first-cell (org-element-contents
- (car (org-element-contents table-row)))))
-
- (or
-
- (equal first-cell '("/"))
-
-
- (and (org-export-table-has-special-column-p
- (org-export-get-parent table-row))
- (member first-cell '(("^") ("_") ("$") ("!"))))
-
- (let ((special-row-p 'empty))
- (catch 'exit
- (mapc
- (lambda (cell)
- (let ((value (org-element-contents cell)))
-
-
- (cond ((not value))
- ((and (not (cdr value))
- (stringp (car value))
- (string-match "\\`<[lrc]?\\([0-9]+\\)?>\\'"
- (car value)))
- (setq special-row-p 'cookie))
- (t (throw 'exit nil)))))
- (org-element-contents table-row))
- (eq special-row-p 'cookie)))))))
- (defun org-export-table-row-group (table-row info)
- "Return TABLE-ROW's group.
- INFO is a plist used as the communication channel.
- Return value is the group number, as an integer, or nil special
- rows and table rules. Group 1 is also table's header."
- (unless (or (eq (org-element-property :type table-row) 'rule)
- (org-export-table-row-is-special-p table-row info))
- (let ((group 0) row-flag)
- (catch 'found
- (mapc
- (lambda (row)
- (cond
- ((and (eq (org-element-property :type row) 'standard)
- (not (org-export-table-row-is-special-p row info)))
- (unless row-flag (incf group) (setq row-flag t)))
- ((eq (org-element-property :type row) 'rule)
- (setq row-flag nil)))
- (when (eq table-row row) (throw 'found group)))
- (org-element-contents (org-export-get-parent table-row)))))))
- (defun org-export-table-cell-width (table-cell info)
- "Return TABLE-CELL contents width.
- INFO is a plist used as the communication channel.
- Return value is the width given by the last width cookie in the
- same column as TABLE-CELL, or nil."
- (let* ((row (org-export-get-parent table-cell))
- (column (let ((cells (org-element-contents row)))
- (- (length cells) (length (memq table-cell cells)))))
- (table (org-export-get-parent-table table-cell))
- cookie-width)
- (mapc
- (lambda (row)
- (cond
-
- ((org-export-table-row-is-special-p row info)
- (let ((value (org-element-contents
- (elt (org-element-contents row) column))))
-
-
- (when (and value
- (not (cdr value))
- (stringp (car value))
- (string-match "\\`<[lrc]?\\([0-9]+\\)?>\\'" (car value))
- (match-string 1 (car value)))
- (setq cookie-width
- (string-to-number (match-string 1 (car value)))))))
-
- ((eq (org-element-property :type row) 'rule))))
- (org-element-contents table))
-
- cookie-width))
- (defun org-export-table-cell-alignment (table-cell info)
- "Return TABLE-CELL contents alignment.
- INFO is a plist used as the communication channel.
- Return alignment as specified by the last alignment cookie in the
- same column as TABLE-CELL. If no such cookie is found, a default
- alignment value will be deduced from fraction of numbers in the
- column (see `org-table-number-fraction' for more information).
- Possible values are `left', `right' and `center'."
- (let* ((row (org-export-get-parent table-cell))
- (column (let ((cells (org-element-contents row)))
- (- (length cells) (length (memq table-cell cells)))))
- (table (org-export-get-parent-table table-cell))
- (number-cells 0)
- (total-cells 0)
- cookie-align)
- (mapc
- (lambda (row)
- (cond
-
-
- ((org-export-table-row-is-special-p row info)
- (let ((value (org-element-contents
- (elt (org-element-contents row) column))))
-
-
- (when (and value
- (not (cdr value))
- (stringp (car value))
- (string-match "\\`<\\([lrc]\\)?\\([0-9]+\\)?>\\'"
- (car value))
- (match-string 1 (car value)))
- (setq cookie-align (match-string 1 (car value))))))
-
- ((eq (org-element-property :type row) 'rule))
-
-
-
-
- ((not cookie-align)
- (let ((value (org-export-data
- (org-element-contents
- (elt (org-element-contents row) column))
- info)))
- (incf total-cells)
- (when (string-match org-table-number-regexp value)
- (incf number-cells))))))
- (org-element-contents table))
-
-
- (cond ((equal cookie-align "l") 'left)
- ((equal cookie-align "r") 'right)
- ((equal cookie-align "c") 'center)
- ((>= (/ (float number-cells) total-cells) org-table-number-fraction)
- 'right)
- (t 'left))))
- (defun org-export-table-cell-borders (table-cell info)
- "Return TABLE-CELL borders.
- INFO is a plist used as a communication channel.
- Return value is a list of symbols, or nil. Possible values are:
- `top', `bottom', `above', `below', `left' and `right'. Note:
- `top' (resp. `bottom') only happen for a cell in the first
- row (resp. last row) of the table, ignoring table rules, if any.
- Returned borders ignore special rows."
- (let* ((row (org-export-get-parent table-cell))
- (table (org-export-get-parent-table table-cell))
- borders)
-
-
-
-
- (let (rule-flag)
- (catch 'exit
- (mapc (lambda (row)
- (cond ((eq (org-element-property :type row) 'rule)
- (setq rule-flag t))
- ((not (org-export-table-row-is-special-p row info))
- (if rule-flag (throw 'exit (push 'above borders))
- (throw 'exit nil)))))
-
- (cdr (memq row (reverse (org-element-contents table)))))
-
-
- (when rule-flag (push 'above borders))
- (push 'top borders)))
-
-
- (let (rule-flag)
- (catch 'exit
- (mapc (lambda (row)
- (cond ((eq (org-element-property :type row) 'rule)
- (setq rule-flag t))
- ((not (org-export-table-row-is-special-p row info))
- (if rule-flag (throw 'exit (push 'below borders))
- (throw 'exit nil)))))
-
- (cdr (memq row (org-element-contents table))))
-
-
- (when rule-flag (push 'below borders))
- (push 'bottom borders)))
-
-
-
-
- (catch 'exit
- (let ((column (let ((cells (org-element-contents row)))
- (- (length cells) (length (memq table-cell cells))))))
- (mapc
- (lambda (row)
- (unless (eq (org-element-property :type row) 'rule)
- (when (equal (org-element-contents
- (car (org-element-contents row)))
- '("/"))
- (let ((column-groups
- (mapcar
- (lambda (cell)
- (let ((value (org-element-contents cell)))
- (when (member value '(("<") ("<>") (">") nil))
- (car value))))
- (org-element-contents row))))
-
-
- (when (or (and (not (zerop column))
- (member (elt column-groups (1- column))
- '(">" "<>")))
- (member (elt column-groups column) '("<" "<>")))
- (push 'left borders))
-
-
- (when (or (and (/= (1+ column) (length column-groups))
- (member (elt column-groups (1+ column))
- '("<" "<>")))
- (member (elt column-groups column) '(">" "<>")))
- (push 'right borders))
- (throw 'exit nil)))))
-
-
- (reverse (org-element-contents table)))))
-
- borders))
- (defun org-export-table-cell-starts-colgroup-p (table-cell info)
- "Non-nil when TABLE-CELL is at the beginning of a row group.
- INFO is a plist used as a communication channel."
-
-
-
- (or (eq (org-element-map
- (org-export-get-parent table-cell)
- 'table-cell 'identity info 'first-match)
- table-cell)
- (memq 'left (org-export-table-cell-borders table-cell info))))
- (defun org-export-table-cell-ends-colgroup-p (table-cell info)
- "Non-nil when TABLE-CELL is at the end of a row group.
- INFO is a plist used as a communication channel."
-
-
- (or (eq (car (last (org-element-contents
- (org-export-get-parent table-cell))))
- table-cell)
- (memq 'right (org-export-table-cell-borders table-cell info))))
- (defun org-export-table-row-starts-rowgroup-p (table-row info)
- "Non-nil when TABLE-ROW is at the beginning of a column group.
- INFO is a plist used as a communication channel."
- (unless (or (eq (org-element-property :type table-row) 'rule)
- (org-export-table-row-is-special-p table-row info))
- (let ((borders (org-export-table-cell-borders
- (car (org-element-contents table-row)) info)))
- (or (memq 'top borders) (memq 'above borders)))))
- (defun org-export-table-row-ends-rowgroup-p (table-row info)
- "Non-nil when TABLE-ROW is at the end of a column group.
- INFO is a plist used as a communication channel."
- (unless (or (eq (org-element-property :type table-row) 'rule)
- (org-export-table-row-is-special-p table-row info))
- (let ((borders (org-export-table-cell-borders
- (car (org-element-contents table-row)) info)))
- (or (memq 'bottom borders) (memq 'below borders)))))
- (defun org-export-table-row-starts-header-p (table-row info)
- "Non-nil when TABLE-ROW is the first table header's row.
- INFO is a plist used as a communication channel."
- (and (org-export-table-has-header-p
- (org-export-get-parent-table table-row) info)
- (org-export-table-row-starts-rowgroup-p table-row info)
- (= (org-export-table-row-group table-row info) 1)))
- (defun org-export-table-row-ends-header-p (table-row info)
- "Non-nil when TABLE-ROW is the last table header's row.
- INFO is a plist used as a communication channel."
- (and (org-export-table-has-header-p
- (org-export-get-parent-table table-row) info)
- (org-export-table-row-ends-rowgroup-p table-row info)
- (= (org-export-table-row-group table-row info) 1)))
- (defun org-export-table-dimensions (table info)
- "Return TABLE dimensions.
- INFO is a plist used as a communication channel.
- Return value is a CONS like (ROWS . COLUMNS) where
- ROWS (resp. COLUMNS) is the number of exportable
- rows (resp. columns)."
- (let (first-row (columns 0) (rows 0))
-
- (org-element-map
- table 'table-row
- (lambda (row)
- (when (eq (org-element-property :type row) 'standard)
- (incf rows)
- (unless first-row (setq first-row row)))) info)
-
- (org-element-map first-row 'table-cell (lambda (cell) (incf columns)) info)
-
- (cons rows columns)))
- (defun org-export-table-cell-address (table-cell info)
- "Return address of a regular TABLE-CELL object.
- TABLE-CELL is the cell considered. INFO is a plist used as
- a communication channel.
- Address is a CONS cell (ROW . COLUMN), where ROW and COLUMN are
- zero-based index. Only exportable cells are considered. The
- function returns nil for other cells."
- (let* ((table-row (org-export-get-parent table-cell))
- (table (org-export-get-parent-table table-cell)))
-
- (unless (or (org-export-table-row-is-special-p table-row info)
- (and (org-export-table-has-special-column-p table)
- (eq (car (org-element-contents table-row)) table-cell)))
- (cons
-
- (let ((row-count 0))
- (org-element-map
- table 'table-row
- (lambda (row)
- (cond ((eq (org-element-property :type row) 'rule) nil)
- ((eq row table-row) row-count)
- (t (incf row-count) nil)))
- info 'first-match))
-
- (let ((col-count 0))
- (org-element-map
- table-row 'table-cell
- (lambda (cell)
- (if (eq cell table-cell) col-count (incf col-count) nil))
- info 'first-match))))))
- (defun org-export-get-table-cell-at (address table info)
- "Return regular table-cell object at ADDRESS in TABLE.
- Address is a CONS cell (ROW . COLUMN), where ROW and COLUMN are
- zero-based index. TABLE is a table type element. INFO is
- a plist used as a communication channel.
- If no table-cell, among exportable cells, is found at ADDRESS,
- return nil."
- (let ((column-pos (cdr address)) (column-count 0))
- (org-element-map
-
- (let ((row-pos (car address)) (row-count 0))
- (org-element-map
- table 'table-row
- (lambda (row)
- (cond ((eq (org-element-property :type row) 'rule) nil)
- ((= row-count row-pos) row)
- (t (incf row-count) nil)))
- info 'first-match))
- 'table-cell
- (lambda (cell)
- (if (= column-count column-pos) cell
- (incf column-count) nil))
- info 'first-match)))
- (defun org-export-collect-headlines (info &optional n)
- "Collect headlines in order to build a table of contents.
- INFO is a plist used as a communication channel.
- When optional argument N is an integer, it specifies the depth of
- the table of contents. Otherwise, it is set to the value of the
- last headline level. See `org-export-headline-levels' for more
- information.
- Return a list of all exportable headlines as parsed elements."
- (unless (wholenump n) (setq n (plist-get info :headline-levels)))
- (org-element-map
- (plist-get info :parse-tree)
- 'headline
- (lambda (headline)
-
- (let ((relative-level (org-export-get-relative-level headline info)))
- (unless (> relative-level n) headline)))
- info))
- (defun org-export-collect-elements (type info &optional predicate)
- "Collect referenceable elements of a determined type.
- TYPE can be a symbol or a list of symbols specifying element
- types to search. Only elements with a caption are collected.
- INFO is a plist used as a communication channel.
- When non-nil, optional argument PREDICATE is a function accepting
- one argument, an element of type TYPE. It returns a non-nil
- value when that element should be collected.
- Return a list of all elements found, in order of appearance."
- (org-element-map
- (plist-get info :parse-tree) type
- (lambda (element)
- (and (org-element-property :caption element)
- (or (not predicate) (funcall predicate element))
- element))
- info))
- (defun org-export-collect-tables (info)
- "Build a list of tables.
- INFO is a plist used as a communication channel.
- Return a list of table elements with a caption."
- (org-export-collect-elements 'table info))
- (defun org-export-collect-figures (info predicate)
- "Build a list of figures.
- INFO is a plist used as a communication channel. PREDICATE is
- a function which accepts one argument: a paragraph element and
- whose return value is non-nil when that element should be
- collected.
- A figure is a paragraph type element, with a caption, verifying
- PREDICATE. The latter has to be provided since a \"figure\" is
- a vague concept that may depend on back-end.
- Return a list of elements recognized as figures."
- (org-export-collect-elements 'paragraph info predicate))
- (defun org-export-collect-listings (info)
- "Build a list of src blocks.
- INFO is a plist used as a communication channel.
- Return a list of src-block elements with a caption."
- (org-export-collect-elements 'src-block info))
- (defconst org-export-smart-quotes-alist
- '(("de"
- (opening-double-quote :utf-8 "„" :html "„" :latex "\"`"
- :texinfo "@quotedblbase{}")
- (closing-double-quote :utf-8 "“" :html "“" :latex "\"'"
- :texinfo "@quotedblleft{}")
- (opening-single-quote :utf-8 "‚" :html "‚" :latex "\\glq{}"
- :texinfo "@quotesinglbase{}")
- (closing-single-quote :utf-8 "‘" :html "‘" :latex "\\grq{}"
- :texinfo "@quoteleft{}")
- (apostrophe :utf-8 "’" :html "’"))
- ("en"
- (opening-double-quote :utf-8 "“" :html "“" :latex "``" :texinfo "``")
- (closing-double-quote :utf-8 "”" :html "”" :latex "''" :texinfo "''")
- (opening-single-quote :utf-8 "‘" :html "‘" :latex "`" :texinfo "`")
- (closing-single-quote :utf-8 "’" :html "’" :latex "'" :texinfo "'")
- (apostrophe :utf-8 "’" :html "’"))
- ("es"
- (opening-double-quote :utf-8 "«" :html "«" :latex "\\guillemotleft{}"
- :texinfo "@guillemetleft{}")
- (closing-double-quote :utf-8 "»" :html "»" :latex "\\guillemotright{}"
- :texinfo "@guillemetright{}")
- (opening-single-quote :utf-8 "“" :html "“" :latex "``" :texinfo "``")
- (closing-single-quote :utf-8 "”" :html "”" :latex "''" :texinfo "''")
- (apostrophe :utf-8 "’" :html "’"))
- ("fr"
- (opening-double-quote :utf-8 "« " :html "« " :latex "\\og "
- :texinfo "@guillemetleft{}@tie{}")
- (closing-double-quote :utf-8 " »" :html " »" :latex "\\fg{}"
- :texinfo "@tie{}@guillemetright{}")
- (opening-single-quote :utf-8 "« " :html "« " :latex "\\og "
- :texinfo "@guillemetleft{}@tie{}")
- (closing-single-quote :utf-8 " »" :html " »" :latex "\\fg{}"
- :texinfo "@tie{}@guillemetright{}")
- (apostrophe :utf-8 "’" :html "’")))
- "Smart quotes translations.
- Alist whose CAR is a language string and CDR is an alist with
- quote type as key and a plist associating various encodings to
- their translation as value.
- A quote type can be any symbol among `opening-double-quote',
- `closing-double-quote', `opening-single-quote',
- `closing-single-quote' and `apostrophe'.
- Valid encodings include `:utf-8', `:html', `:latex' and
- `:texinfo'.
- If no translation is found, the quote character is left as-is.")
- (defconst org-export-smart-quotes-regexps
- (list
-
- "\\`\\([\"']\\)\\(\\w\\|\\s.\\|\\s_\\)"
-
- "\\`\\([\"']\\)\\(\\s-\\|\\s)\\|\\s.\\)"
-
- "\\`\\('\\)\\S-"
-
- "\\(?:\\s-\\|\\s(\\)\\([\"']\\)\\(?:\\w\\|\\s.\\|\\s_\\)"
-
- "\\(?:\\w\\|\\s.\\|\\s_\\)\\([\"']\\)\\(?:\\s-\\|\\s)\\|\\s.\\)"
-
- "\\S-\\('\\)\\S-"
-
- "\\(?:\\s-\\|\\s(\\)\\([\"']\\)\\'"
-
- "\\(?:\\w\\|\\s.\\|\\s_\\)\\([\"']\\)\\'"
-
- "\\S-\\('\\)\\'")
- "List of regexps matching a quote or an apostrophe.
- In every regexp, quote or apostrophe matched is put in group 1.")
- (defun org-export-activate-smart-quotes (s encoding info &optional original)
- "Replace regular quotes with \"smart\" quotes in string S.
- ENCODING is a symbol among `:html', `:latex' and `:utf-8'. INFO
- is a plist used as a communication channel.
- The function has to retrieve information about string
- surroundings in parse tree. It can only happen with an
- unmodified string. Thus, if S has already been through another
- process, a non-nil ORIGINAL optional argument will provide that
- original string.
- Return the new string."
- (if (equal s "") ""
- (let* ((prev (org-export-get-previous-element (or original s) info))
- (pre-blank (and prev (org-element-property :post-blank prev)))
- (next (org-export-get-next-element (or original s) info))
- (get-smart-quote
- (lambda (q type)
-
-
-
- (let ((key (case type
- (apostrophe 'apostrophe)
- (open (if (equal "'" q) 'opening-single-quote
- 'opening-double-quote))
- (otherwise (if (equal "'" q) 'closing-single-quote
- 'closing-double-quote)))))
- (or (plist-get
- (cdr (assq key
- (cdr (assoc (plist-get info :language)
- org-export-smart-quotes-alist))))
- encoding)
- q)))))
- (if (or (equal "\"" s) (equal "'" s))
-
-
- (cond ((and (not prev) (not next)) s)
- ((not prev) (funcall get-smart-quote s 'open))
- ((and (not next) (zerop pre-blank))
- (funcall get-smart-quote s 'close))
- ((not next) s)
- ((zerop pre-blank) (funcall get-smart-quote s 'apostrophe))
- (t (funcall get-smart-quote 'open)))
-
- (cond
-
- ((and prev (zerop pre-blank)
- (string-match (nth 2 org-export-smart-quotes-regexps) s))
- (setq s (replace-match
- (funcall get-smart-quote (match-string 1 s) 'apostrophe)
- nil t s 1)))
-
- ((and prev (zerop pre-blank)
- (string-match (nth 1 org-export-smart-quotes-regexps) s))
- (setq s (replace-match
- (funcall get-smart-quote (match-string 1 s) 'close)
- nil t s 1)))
-
- ((and (or (not prev) (> pre-blank 0))
- (string-match (nth 0 org-export-smart-quotes-regexps) s))
- (setq s (replace-match
- (funcall get-smart-quote (match-string 1 s) 'open)
- nil t s 1))))
-
- (setq s (replace-regexp-in-string
-
- (nth 3 org-export-smart-quotes-regexps)
- (lambda (text)
- (funcall get-smart-quote (match-string 1 text) 'open))
- s nil t 1))
- (setq s (replace-regexp-in-string
-
- (nth 4 org-export-smart-quotes-regexps)
- (lambda (text)
- (funcall get-smart-quote (match-string 1 text) 'close))
- s nil t 1))
- (setq s (replace-regexp-in-string
-
- (nth 5 org-export-smart-quotes-regexps)
- (lambda (text)
- (funcall get-smart-quote (match-string 1 text) 'apostrophe))
- s nil t 1))
-
- (cond
-
- ((and next (string-match (nth 8 org-export-smart-quotes-regexps) s))
- (setq s (replace-match
- (funcall get-smart-quote (match-string 1 s) 'apostrophe)
- nil t s 1)))
-
- ((and (not next)
- (string-match (nth 7 org-export-smart-quotes-regexps) s))
- (setq s (replace-match
- (funcall get-smart-quote (match-string 1 s) 'close)
- nil t s 1)))
-
- ((and next (string-match (nth 6 org-export-smart-quotes-regexps) s))
- (setq s (replace-match
- (funcall get-smart-quote (match-string 1 s) 'open)
- nil t s 1))))
-
- s))))
- (defun org-export-get-parent (blob)
- "Return BLOB parent or nil.
- BLOB is the element or object considered."
- (org-element-property :parent blob))
- (defun org-export-get-genealogy (blob)
- "Return full genealogy relative to a given element or object.
- BLOB is the element or object being considered.
- Ancestors are returned from closest to farthest, the last one
- being the full parse tree."
- (let (genealogy (parent blob))
- (while (setq parent (org-element-property :parent parent))
- (push parent genealogy))
- (nreverse genealogy)))
- (defun org-export-get-parent-headline (blob)
- "Return BLOB parent headline or nil.
- BLOB is the element or object being considered."
- (let ((parent blob))
- (while (and (setq parent (org-element-property :parent parent))
- (not (eq (org-element-type parent) 'headline))))
- parent))
- (defun org-export-get-parent-element (object)
- "Return first element containing OBJECT or nil.
- OBJECT is the object to consider."
- (let ((parent object))
- (while (and (setq parent (org-element-property :parent parent))
- (memq (org-element-type parent) org-element-all-objects)))
- parent))
- (defun org-export-get-parent-table (object)
- "Return OBJECT parent table or nil.
- OBJECT is either a `table-cell' or `table-element' type object."
- (let ((parent object))
- (while (and (setq parent (org-element-property :parent parent))
- (not (eq (org-element-type parent) 'table))))
- parent))
- (defun org-export-get-previous-element (blob info)
- "Return previous element or object.
- BLOB is an element or object. INFO is a plist used as
- a communication channel. Return previous exportable element or
- object, a string, or nil."
- (let (prev)
- (catch 'exit
- (mapc (lambda (obj)
- (cond ((eq obj blob) (throw 'exit prev))
- ((memq obj (plist-get info :ignore-list)))
- (t (setq prev obj))))
-
-
-
- (let ((parent (org-export-get-parent blob)))
- (or (and (not (memq (org-element-type blob)
- org-element-all-elements))
- (let ((sec-value
- (org-element-property
- (cdr (assq (org-element-type parent)
- org-element-secondary-value-alist))
- parent)))
- (and (memq blob sec-value) sec-value)))
- (org-element-contents parent)))))))
- (defun org-export-get-next-element (blob info)
- "Return next element or object.
- BLOB is an element or object. INFO is a plist used as
- a communication channel. Return next exportable element or
- object, a string, or nil."
- (catch 'found
- (mapc (lambda (obj)
- (unless (memq obj (plist-get info :ignore-list))
- (throw 'found obj)))
-
-
- (let ((parent (org-export-get-parent blob)))
- (or (and (not (memq (org-element-type blob)
- org-element-all-objects))
- (let ((sec-value
- (org-element-property
- (cdr (assq (org-element-type parent)
- org-element-secondary-value-alist))
- parent)))
- (cdr (memq blob sec-value))))
- (cdr (memq blob (org-element-contents parent))))))
- nil))
- (defconst org-export-dictionary
- '(("Author"
- ("ca" :default "Autor")
- ("cs" :default "Autor")
- ("da" :default "Ophavsmand")
- ("de" :default "Autor")
- ("eo" :html "Aŭtoro")
- ("es" :default "Autor")
- ("fi" :html "Tekijä")
- ("fr" :default "Auteur")
- ("hu" :default "Szerzõ")
- ("is" :html "Höfundur")
- ("it" :default "Autore")
- ("ja" :html "著者" :utf-8 "著者")
- ("nl" :default "Auteur")
- ("no" :default "Forfatter")
- ("nb" :default "Forfatter")
- ("nn" :default "Forfattar")
- ("pl" :default "Autor")
- ("ru" :html "Автор" :utf-8 "Автор")
- ("sv" :html "Författare")
- ("uk" :html "Автор" :utf-8 "Автор")
- ("zh-CN" :html "作者" :utf-8 "作者")
- ("zh-TW" :html "作者" :utf-8 "作者"))
- ("Date"
- ("ca" :default "Data")
- ("cs" :default "Datum")
- ("da" :default "Dato")
- ("de" :default "Datum")
- ("eo" :default "Dato")
- ("es" :default "Fecha")
- ("fi" :html "Päivämäärä")
- ("hu" :html "Dátum")
- ("is" :default "Dagsetning")
- ("it" :default "Data")
- ("ja" :html "日付" :utf-8 "日付")
- ("nl" :default "Datum")
- ("no" :default "Dato")
- ("nb" :default "Dato")
- ("nn" :default "Dato")
- ("pl" :default "Data")
- ("ru" :html "Дата" :utf-8 "Дата")
- ("sv" :default "Datum")
- ("uk" :html "Дата" :utf-8 "Дата")
- ("zh-CN" :html "日期" :utf-8 "日期")
- ("zh-TW" :html "日期" :utf-8 "日期"))
- ("Equation"
- ("fr" :ascii "Equation" :default "Équation"))
- ("Figure")
- ("Footnotes"
- ("ca" :html "Peus de pàgina")
- ("cs" :default "Pozn\xe1mky pod carou")
- ("da" :default "Fodnoter")
- ("de" :html "Fußnoten")
- ("eo" :default "Piednotoj")
- ("es" :html "Pies de página")
- ("fi" :default "Alaviitteet")
- ("fr" :default "Notes de bas de page")
- ("hu" :html "Lábjegyzet")
- ("is" :html "Aftanmálsgreinar")
- ("it" :html "Note a piè di pagina")
- ("ja" :html "脚注" :utf-8 "脚注")
- ("nl" :default "Voetnoten")
- ("no" :default "Fotnoter")
- ("nb" :default "Fotnoter")
- ("nn" :default "Fotnotar")
- ("pl" :default "Przypis")
- ("ru" :html "Сноски" :utf-8 "Сноски")
- ("sv" :default "Fotnoter")
- ("uk" :html "Примітки"
- :utf-8 "Примітки")
- ("zh-CN" :html "脚注" :utf-8 "脚注")
- ("zh-TW" :html "腳註" :utf-8 "腳註"))
- ("List of Listings"
- ("fr" :default "Liste des programmes"))
- ("List of Tables"
- ("fr" :default "Liste des tableaux"))
- ("Listing %d:"
- ("fr"
- :ascii "Programme %d :" :default "Programme nº %d :"
- :latin1 "Programme %d :"))
- ("Listing %d: %s"
- ("fr"
- :ascii "Programme %d : %s" :default "Programme nº %d : %s"
- :latin1 "Programme %d : %s"))
- ("See section %s"
- ("fr" :default "cf. section %s"))
- ("Table %d:"
- ("fr"
- :ascii "Tableau %d :" :default "Tableau nº %d :" :latin1 "Tableau %d :"))
- ("Table %d: %s"
- ("fr"
- :ascii "Tableau %d : %s" :default "Tableau nº %d : %s"
- :latin1 "Tableau %d : %s"))
- ("Table of Contents"
- ("ca" :html "Índex")
- ("cs" :default "Obsah")
- ("da" :default "Indhold")
- ("de" :default "Inhaltsverzeichnis")
- ("eo" :default "Enhavo")
- ("es" :html "Índice")
- ("fi" :html "Sisällysluettelo")
- ("fr" :ascii "Sommaire" :default "Table des matières")
- ("hu" :html "Tartalomjegyzék")
- ("is" :default "Efnisyfirlit")
- ("it" :default "Indice")
- ("ja" :html "目次" :utf-8 "目次")
- ("nl" :default "Inhoudsopgave")
- ("no" :default "Innhold")
- ("nb" :default "Innhold")
- ("nn" :default "Innhald")
- ("pl" :html "Spis treści")
- ("ru" :html "Содержание"
- :utf-8 "Содержание")
- ("sv" :html "Innehåll")
- ("uk" :html "Зміст" :utf-8 "Зміст")
- ("zh-CN" :html "目录" :utf-8 "目录")
- ("zh-TW" :html "目錄" :utf-8 "目錄"))
- ("Unknown reference"
- ("fr" :ascii "Destination inconnue" :default "Référence inconnue")))
- "Dictionary for export engine.
- Alist whose CAR is the string to translate and CDR is an alist
- whose CAR is the language string and CDR is a plist whose
- properties are possible charsets and values translated terms.
- It is used as a database for `org-export-translate'. Since this
- function returns the string as-is if no translation was found,
- the variable only needs to record values different from the
- entry.")
- (defun org-export-translate (s encoding info)
- "Translate string S according to language specification.
- ENCODING is a symbol among `:ascii', `:html', `:latex', `:latin1'
- and `:utf-8'. INFO is a plist used as a communication channel.
- Translation depends on `:language' property. Return the
- translated string. If no translation is found, try to fall back
- to `:default' encoding. If it fails, return S."
- (let* ((lang (plist-get info :language))
- (translations (cdr (assoc lang
- (cdr (assoc s org-export-dictionary))))))
- (or (plist-get translations encoding)
- (plist-get translations :default)
- s)))
- (defun org-export-dispatch ()
- "Export dispatcher for Org mode.
- It provides an access to common export related tasks in a buffer.
- Its interface comes in two flavours: standard and expert. While
- both share the same set of bindings, only the former displays the
- valid keys associations. Set `org-export-dispatch-use-expert-ui'
- to switch to one or the other."
- (interactive)
- (let* ((input (save-window-excursion
- (unwind-protect
- (org-export-dispatch-ui (list org-export-initial-scope)
- nil
- org-export-dispatch-use-expert-ui)
- (and (get-buffer "*Org Export Dispatcher*")
- (kill-buffer "*Org Export Dispatcher*")))))
- (action (car input))
- (optns (cdr input)))
- (case action
-
- (publish-current-file (org-e-publish-current-file (memq 'force optns)))
- (publish-current-project
- (org-e-publish-current-project (memq 'force optns)))
- (publish-choose-project
- (org-e-publish (assoc (org-icompleting-read
- "Publish project: "
- org-e-publish-project-alist nil t)
- org-e-publish-project-alist)
- (memq 'force optns)))
- (publish-all (org-e-publish-all (memq 'force optns)))
- (otherwise
- (funcall action
- (memq 'subtree optns)
- (memq 'visible optns)
- (memq 'body optns))))))
- (defun org-export-dispatch-ui (options first-key expertp)
- "Handle interface for `org-export-dispatch'.
- OPTIONS is a list containing current interactive options set for
- export. It can contain any of the following symbols:
- `body' toggles a body-only export
- `subtree' restricts export to current subtree
- `visible' restricts export to visible part of buffer.
- `force' force publishing files.
- FIRST-KEY is the key pressed to select the first level menu. It
- is nil when this menu hasn't been selected yet.
- EXPERTP, when non-nil, triggers expert UI. In that case, no help
- buffer is provided, but indications about currently active
- options are given in the prompt. Moreover, \[?] allows to switch
- back to standard interface."
- (let* ((fontify-key
- (lambda (key &optional access-key)
-
-
-
-
-
- (if (or (eq access-key t) (eq access-key first-key))
- (org-add-props key nil 'face 'org-warning)
- (org-no-properties key))))
-
-
-
- (backends (sort
- (sort
- (delq nil
- (mapcar (lambda (b)
- (org-export-backend-menu (car b)))
- org-export-registered-backends))
- (lambda (a b)
- (let ((key-a (nth 1 a))
- (key-b (nth 1 b)))
- (cond ((and (numberp key-a) (numberp key-b))
- (< key-a key-b))
- ((numberp key-b) t)))))
- (lambda (a b) (< (car a) (car b)))))
-
-
-
- (allowed-keys
- (nconc (list ?1 ?2 ?3 ?4)
- (if (not first-key) (mapcar 'car backends)
- (let (sub-menu)
- (dolist (backend backends (mapcar 'car sub-menu))
- (when (eq (car backend) first-key)
- (setq sub-menu (append (nth 2 backend) sub-menu))))))
- (cond ((eq first-key ?P) (list ?f ?p ?x ?a))
- ((not first-key) (list ?P)))
- (when expertp (list ??))
- (list ?q)))
-
- (help
- (unless expertp
- (concat
-
- (format "Options
- [%s] Body only: %s [%s] Visible only: %s
- [%s] Export scope: %s [%s] Force publishing: %s\n"
- (funcall fontify-key "1" t)
- (if (memq 'body options) "On " "Off")
- (funcall fontify-key "2" t)
- (if (memq 'visible options) "On " "Off")
- (funcall fontify-key "3" t)
- (if (memq 'subtree options) "Subtree" "Buffer ")
- (funcall fontify-key "4" t)
- (if (memq 'force options) "On " "Off"))
-
-
-
- (let (last-key)
- (mapconcat
- (lambda (entry)
- (let ((top-key (car entry)))
- (concat
- (unless (eq top-key last-key)
- (setq last-key top-key)
- (format "\n[%s] %s\n"
- (funcall fontify-key (char-to-string top-key))
- (nth 1 entry)))
- (let ((sub-menu (nth 2 entry)))
- (unless (functionp sub-menu)
-
- (let ((index -1))
- (concat
- (mapconcat
- (lambda (sub-entry)
- (incf index)
- (format
- (if (zerop (mod index 2)) " [%s] %-24s"
- "[%s] %s\n")
- (funcall fontify-key
- (char-to-string (car sub-entry))
- top-key)
- (nth 1 sub-entry)))
- sub-menu "")
- (when (zerop (mod index 2)) "\n"))))))))
- backends ""))
-
- (format "\n[%s] Publish
- [%s] Current file [%s] Current project
- [%s] Choose project [%s] All projects\n\n"
- (funcall fontify-key "P")
- (funcall fontify-key "f" ?P)
- (funcall fontify-key "p" ?P)
- (funcall fontify-key "x" ?P)
- (funcall fontify-key "a" ?P))
- (format "\[%s] %s"
- (funcall fontify-key "q" t)
- (if first-key "Main menu" "Exit")))))
-
- (standard-prompt (unless expertp "Export command: "))
- (expert-prompt
- (when expertp
- (format
- "Export command (Options: %s%s%s%s) [%s]: "
- (if (memq 'body options) (funcall fontify-key "b" t) "-")
- (if (memq 'visible options) (funcall fontify-key "v" t) "-")
- (if (memq 'subtree options) (funcall fontify-key "s" t) "-")
- (if (memq 'force options) (funcall fontify-key "f" t) "-")
- (concat allowed-keys)))))
-
-
- (if expertp
- (org-export-dispatch-action
- expert-prompt allowed-keys backends options first-key expertp)
-
- (unless (get-buffer "*Org Export Dispatcher*")
- (delete-other-windows)
- (org-switch-to-buffer-other-window
- (get-buffer-create "*Org Export Dispatcher*"))
- (setq cursor-type nil))
-
-
- (with-current-buffer "*Org Export Dispatcher*"
- (erase-buffer)
- (insert help))
- (org-fit-window-to-buffer)
- (org-export-dispatch-action
- standard-prompt allowed-keys backends options first-key expertp))))
- (defun org-export-dispatch-action
- (prompt allowed-keys backends options first-key expertp)
- "Read a character from command input and act accordingly.
- PROMPT is the displayed prompt, as a string. ALLOWED-KEYS is
- a list of characters available at a given step in the process.
- BACKENDS is a list of menu entries. OPTIONS, FIRST-KEY and
- EXPERTP are the same as defined in `org-export-dispatch-ui',
- which see.
- Toggle export options when required. Otherwise, return value is
- a list with action as CAR and a list of interactive export
- options as CDR."
- (let ((key (let ((k (read-char-exclusive prompt)))
-
-
- (if (< k 27) (+ k 96) k))))
- (cond
-
-
- ((not (memq key allowed-keys))
- (ding)
- (unless expertp (message "Invalid key") (sit-for 1))
- (org-export-dispatch-ui options first-key expertp))
-
-
- ((eq key ?q) (if (not first-key) (error "Export aborted")
- (org-export-dispatch-ui options nil expertp)))
-
-
- ((eq key ??) (org-export-dispatch-ui options first-key nil))
-
- ((memq key '(?1 ?2 ?3 ?4))
- (org-export-dispatch-ui
- (let ((option (case key (?1 'body) (?2 'visible) (?3 'subtree)
- (?4 'force))))
- (if (memq option options) (remq option options)
- (cons option options)))
- first-key expertp))
-
-
- ((or first-key (functionp (nth 2 (assq key backends))))
- (cons (cond
- ((not first-key) (nth 2 (assq key backends)))
-
-
- ((eq first-key ?P)
- (case key
- (?f 'publish-current-file)
- (?p 'publish-current-project)
- (?x 'publish-choose-project)
- (?a 'publish-all)))
-
-
-
- (t (catch 'found
- (mapc (lambda (backend)
- (let ((match (assq key (nth 2 backend))))
- (when match (throw 'found (nth 2 match)))))
- (member (assq first-key backends) backends)))))
- options))
-
- (t (org-export-dispatch-ui options key expertp)))))
- (provide 'org-export)
|