ylAy5zUb8v1_$=o)d|1
zo_)address@hidden|>As${(dK3H*34c-&JpRXg2FX?5jAVbyN#H5(Q$)eeoe+)UC
zZjDkEF5Jfy>ho{n8=JWUJHOu?(jdD%eA+NtYv~3pUfOOrdArwsZO-3Z2`jly4nn+)
address@hidden(ZvP(bw3tm{_-jVb^1z1g;(w$$tvuJ;6EQzFmaG4ap$9w!Dhx%
z_4R9pcP~ZtE_{Lg_+Q^#)thAvzV(%2%G!j>LeDq_U$1AE-{}3vj$Jx2CJmu?Y8t(3
z6zE?2zM%rIx{eAz)W!|s=m7KP^Mkskz36$|CvYqJFgR|address@hidden
zVUnwB8>@Sly`In%m)No9t}*=#N(9T)*i5EW>)address@hiddenQhU|t=JWyfY6{-BK|jAteu)Vi~P`;ZxS66RN`5K
z=^ePD9=b~ET|E2p)@)*DH|Ljt|6F|vWvu26dey7w)f1!pUuX5NBZ^*kNwT)rQ-NDi
zlY?3ZO96c!Mb(`o!^0gXp`!a3bR^0kM8ZDcLoKshiv4U!?x~DA|7;?(FQASHw2m?#
zxQ)fF6>GSO8a~gMQfVI^7vkxmpp;@address@hiddent~5yFNulr7F;gql50{m$&T$XMKEd;&Fbrj}&1SWo=fQCA{{oO#gc4n+N;;
z^GuzSeER4NLM3K=;address@hidden;Y}?X~o6p#>3139EKMf3DV)uEm|Fo`4?yfnjs}GA+
zf~XhLEX-gO%9+P3>cg-3Wek)3eUE4qX6`Ptfx=a|7}#Yw~RN*;xeD``w?6l=K-J7$X;
zc(address@hidden;Qmf=)91bsY0<3
zDQ5UNJ$iN*!NA!DuaNrNeql=5{_E4=FxrIxSyuuNphk3bf&l)Z5z&8OQ
z{>QgLR!JWwWxv&AXig5WkX8+>4kEGHrzwwr4*OHoc3BB4Guk^etgveYoqYV;$+2-=m`NVxPy>-T%=UWy|a|DdX
zd%x#`e~c&cdQc8OC)89RVy!GBbj6LtnDQ>k4vKe(C6C
zj~_6_i7DHN_B<_n)P<5%VN
address@hidden)R+jn}K*IpUBpWm$2>J!R%bkLO6VG)p=1-Rt+(%N0#(&FrU)U-YLrmN|vZYM5jEbPmcPu
zEsQjkSj_3g-YxBS=3{8r01Y)%l<3Tzb$AmwQ$>~ogp`78RQru|V;re0)5
zGD#_sU;o>5N#~P+YE_E4D)iIzN9edrba9Xme8H*%;18wX5A!HG+EG0<-6Eq*KOM55
zSC34kfV;#OT(1gg)HNFcF&g9x^$^K3(address@hidden@MBnPi#io==gh73h0KKL
zbV^{I6IpA}$0EZil(!qOB3c~9<||zG0#{3nGdOrKl`S6|address@hidden(
z|84-$bkx>d3GI*==7#4NDPz3%gXvks?f|!zU*Xx2G0jD8bns|Zv$b#RhXcV?Nkq<<
zB=Riy`w-V5;?{SEQqDSxZ=a=bNhsRbk(PB;k)d6
z(address@hidden>nRNYkuMAy#eZ&;J*|)RRE&4pnlLZ)iaplgp
z;address@hidden|Pct%c?_GG(7`k9P#j!GH}Dpgrq-=h4gYKFs-sb7Iy1a)-Krb
zgB5FHsU3eAIbuJ0+)O5YR`I2T9L(VeemmG2VB`q?V#$|address@hidden
zXDUyOB0ZlF1)qolP{pYAYth7z*OG^O^eDPlqkBxK9!qU+fp{O9NL-){bn?D833&x&
z6!6#qx%{Y5y=Y-hGOT^77)-(address@hidden>5|gA&hBR91A6DJ}bBw9|@d?&f?Jq`=$(F
zVjT(5GAN$P6oum~m4NX`f`=jU7=F}9X5~d;address@hidden;6owMJpg}^MC4YW
z3Kn7akTVhU&sCA|;&sCR9vgsBaw*|>EJ&lK+_eosgU
z$4f~AtH9L+~g`Q}m-lZ;-gh;5L;5jR~H^O)Rmv_Qi
z3kGy=4NNloy&8&Tq8z+6<0F(address@hidden)cKlyJ(s;
zY?2G;p#3^jV9?zz_u=?im7ZP*$R4aRZH1yosl5;_hnJ~Qfax6rXWPU_UEPafitn;u&$p;Gu&D`;ZUaL|tniDADY
zJlhRFrq&address@hidden(>?War}LuUT5z~nS~r*r;j{cWk9U+rC22owaL3HAHJubLO#n_
zyT&U1*eBj(address@hidden>F=6ntl;Nn8kxr;?3e+n2P)h-}%gG8`|R-
zjV|DnFcUFtumfX%h%F;zb7V8hZKW*Ri#Sp~5o2Ylh+1uO{BZtGXc7-63Z?address@hidden>0%ee
z&WwgtO^}zs1F?lNc`<%bUAl&>1%q@|QcUjA=nWg3VMm7T)@s~zKXpWM+}neF;gf?YEy6q&ou)<
zV}i!HfmQhr7?*A}XkUeZU*${mS$rcf|GMgOHrmzG6OQR
z)fBL{A%NNJrrfgK0Gc_`aeUjWUHToyJ6t*NG9L!pKIS>Q2~4xdvi!%P422#HzEuSn
z7u$+P0fdGM6yF=m{2hO=23^=Mi}5Zp8>D5kzwJABKNx*_-vNU(Eh^+TC8dBi68A2y
zYmZTJo1Hjlv#7zUb&address@hidden>~J`|BDAx6$7GSb!iEuMPGB9H(J<@
zehOQtZp!%HhuLe5_4^N7qUf?vFLSu6TA!ptNR7O3#S^`vYl_NW6~xDwRH_#UgR^l@
z5AXnqN#!&qy5;vB!1UQ%pDZdVwqCr3f3E=2j2ZZ?vTsGIuvP%TB6yR=ixb9qEqEOg
z_d1A{#2z;XwwspH`xS*xTznXn?2Z98`Kg*MgiP7=giXFo54;SH>2tW8$L2T$vSQH4I`tK)2pR9XapOeSnqpX)
z7;BgG%H10_Ta`CA;vO>{+}+TST}}<%V(address@hidden)I$%Ghq+J+F}ggD^uh
z#R{-3+iVaCna*41`hpWlnart1-G)~1af)5_%Y$lf$LE#GL#*EpqPHivUNs*tQqp`m
zT<3KhFQy=h*FMmF7NdJHSP3})6g7|=SFKi7HjKTD0C9Esi!0e^+devR>+RwN^Q^0f
address@hidden|O>fP=IkFl$zrp#>+R)o`_V^eN09d310I1Qm
z;eXXT+BOikU&T(fsfGKjBxy)X2+rh`!4zK2Ua`1*)&wtH+zo3jdTM%47NEJwGH9y!mK0cPQ%s$BLE%452a
zT{dfG)?!YUrL&szelXck*7mWTNjjYXDCloHIWXU>zdq=JP>^&lW_+$vRKT`9!7ccX
zdG$b~^bJU8Z
zoEPe$MVPqga8NsWk9*B;|7yITbui%jsSfU1BB+AGHxDN4^;mXMr+1
z{pvW+TN2amz<_>Fx5btY-%yi>!MRTfOM>?T6}r}b)^=MU&4i`-vi`rvHn165;gis)0?ZdJT>g66TxZY`l}uC3$sKz=4=uXdCH-3eQ0Gkh0D~=|address@hidden&address@hidden
zMB7HDW)address@hidden&>4ta3jfVPV5It8h$h=y6p1joy$O-
z!jo)wjnCFHSK;dv!?&CRt>address@hidden>U0EoxfN)J
zd&qnao;3;Vex|5%avnWY7RkiuXK-itS<7ChsTl}ze^Le;8i^uF7UWIK1mk*^VOr0(
z4-BvAbVuvW-YgYXB;F{%)OaqW!{kkh<;0Z(bv;6c;-Fg9sHN07n48>DJl`|2yLlA+
zW0;address@hidden)E`i{eX=JFE3HN&*qw#IoQyNBXByD8w~XG?d;yJ!fIq(_R%OUo}R
zMD9I$$KC7g3)G_{Y$-QpDcj_Rm_9kDb1no|Hr!gGdNzw;&$6Lb7Gh!bKmF%$5XkOqILWgzr7eiLa(C
address@hidden|8$2;QgD0CFx}L_g^Zwb
z8*5egu9bDeELAdFDivIZZkAYIp80gW>qR=;1a1`fC6e;>cH6#=Kq*&address@hidden
zH10Ts`je2(qQs=pu~$(r$FAD!V*Xy6IZbg;F!x=4$+4pdrFKm572YAHL+V=l$EB*P
zE(z&t9B^zQu?)xiPR$MtnB7o4^4AY%1*=SkZ9{wSiPGTU*HQ0GoMmADDdJDRgU!
z6tY31yAD>$4=6}P
zf-ri=9lt9M>address@hidden(Jj
zM1`l>1#K5H!L`mh(URa3g2qdTBF-TBWGlQ(E=g{|L<UUp<8SxJ{&T
z=+rC|DSID@<@vqen2&Y3
z={ZwrJmHfwY+K-rDCkQ5!j`(mS{qnjZTnMti(cF2r%(address@hidden
z+JA|address@hidden;Vh(F%|@f_ejP^&>#Qq4LyU%z(sIS1aL)qJ5*xaGnOkpX9tJGLn*p
zlS&4KsT)sNCzX0|qI+0;2X&E#wTvb7njp3WgOVpLRd~Fr3#ZdMy8t~DY6~g;8mZ=2
znUs^3_|np3o92TBcPpulF>i!>sLXkP
zZ64kC>=O4;%o9wd(Ds6fn}=X&$+$rQ)X%UD1_vE;74p`BN^G^wW4r5DBy)pz$NM=FVd
zC_address@hidden)^Aq$kPmsYHwVyuWcsuZx~yr*5i=EpMo?wSD$!V<9D
zM1$OujywBc-B0_&dMeE$XPpVbH8DW1Dem3A&RbP^-*ddl=e%hV=#txUnpe3UcVz<$
zH6b*;+rrY;a+p|{aCN(Wo8~y4*0>g{jT0`n^6fUZ*3GLV8u(2K^znKxLD~`N>Knzi
z)NWX>cJ8J)WNGfxV7SHwIENvj!oVZo0i3)8zO7%PQ(9{IRp
zHX*zuk1ceJq1ZF*X7|ZJDc`b%`BMMJ4&h%%0{~b;%VFrC{Hx)jM-V%AHyHo_wgIAT
zbR8Wbb`JbT>i>@&2yN%(address@hidden)fSw)Ba`pPZbVIr(oBHHlajs$S+6*dwcY}e13L5
address@hidden
zerro@(|U#U#yfiOiU%gHtvO|OqB+V}a0De>address@hidden;address@hidden<
zdZOmYgsP1`X+{siw@(%p;9{OW?)lK!D*E8wi*YZO=hn&@2Q`HPdThca`16`BkQtjgGVglwD*s#=1h;T+;l_)p(%%fNe=kmLL+*W|JMFe8~;vr{1fR<
address@hidden@{ptLttn%A=4(o4c7gV-&x`}(BISOHxMy8;r>OczYfTM
z`~2d-?S^NqN(KNz^zRe;fH?h9
H$^rie=t~1D
literal 0
HcmV?d00001
diff --git a/contrib/odt/BasicODConverter/Filters.bas b/contrib/odt/BasicODConverter/Filters.bas
new file mode 100644
index 0000000..5912f65
--- /dev/null
+++ b/contrib/odt/BasicODConverter/Filters.bas
@@ -0,0 +1,213 @@
+REM ***** BASIC *****
+
+Dim DocTypes
+
+Private DocTypeToFiltersMap As New Collection
+Private WriterExportFilters As New Collection
+Private WriterWebExportFilters As New Collection
+Private CalcExportFilters As New Collection
+Private ImpressExportFilters As New Collection
+Private DrawExportFilters As New Collection
+
+
+Private ExportFiltersInited As Boolean
+
+Sub InitExportFilters
+ If ExportFiltersInited Then
+ Exit Sub
+ End If
+
+ DocTypes = Array(_
+ "com.sun.star.text.TextDocument", _
+ "com.sun.star.sheet.SpreadsheetDocument", _
+ "com.sun.star.presentation.PresentationDocument", _
+ "com.sun.star.drawing.DrawingDocument",_
+ "com.sun.star.text.WebDocument"_
+ )
+ With WriterExportFilters
+ .Add Key := "bib" , Item :=Array("bib" , "BibTeX" , "BibTeX_Writer ")
+ .Add Key := "doc" , Item :=Array("doc" , "Microsoft Word 97/2000/XP" , "MS Word 97 ")
+ .Add Key := "doc6" , Item :=Array("doc" , "Microsoft Word 6.0" , "MS WinWord 6.0 ")
+ .Add Key := "doc95" , Item :=Array("doc" , "Microsoft Word 95" , "MS Word 95 ")
+ .Add Key := "docbook" , Item :=Array("xml" , "DocBook" , "DocBook File ")
+ .Add Key := "html" , Item :=Array("html" , "HTML Document (OpenOffice.org Writer)" , "HTML (StarWriter) ")
+ .Add Key := "latex" , Item :=Array("ltx" , "LaTeX 2e" , "LaTeX_Writer ")
+ .Add Key := "mediawiki" , Item :=Array("txt" , "MediaWiki" , "MediaWiki ")
+ .Add Key := "odt" , Item :=Array("odt" , "ODF Text Document" , "writer8 ")
+ .Add Key := "ooxml" , Item :=Array("xml" , "Microsoft Office Open XML" , "MS Word 2003 XML ")
+ .Add Key := "ott" , Item :=Array("ott" , "Open Document Text" , "writer8_template ")
+ .Add Key := "pdf" , Item :=Array("pdf" , "Portable Document Format" , "writer_pdf_Export ")
+ .Add Key := "rtf" , Item :=Array("rtf" , "Rich Text Format" , "Rich Text Format ")
+ .Add Key := "sdw" , Item :=Array("sdw" , "StarWriter 5.0" , "StarWriter 5.0 ")
+ .Add Key := "sdw3" , Item :=Array("sdw" , "StarWriter 3.0" , "StarWriter 3.0 ")
+ .Add Key := "sdw4" , Item :=Array("sdw" , "StarWriter 4.0" , "StarWriter 4.0 ")
+ .Add Key := "stw" , Item :=Array("stw" , "Open Office.org 1.0 Text Document Template" , "writer_StarOffice_XML_Writer_Template ")
+ .Add Key := "sxw" , Item :=Array("sxw" , "Open Office.org 1.0 Text Document" , "StarOffice XML (Writer) ")
+ .Add Key := "text" , Item :=Array("txt" , "Text Encoded" , "Text (encoded) ")
+ .Add Key := "txt" , Item :=Array("txt" , "Text" , "Text ")
+ .Add Key := "uot" , Item :=Array("uot" , "Unified Office Format text" , "UOF text ")
+ .Add Key := "vor" , Item :=Array("vor" , "StarWriter 5.0 Template" , "StarWriter 5.0 Vorlage/Template ")
+ .Add Key := "vor3" , Item :=Array("vor" , "StarWriter 3.0 Template" , "StarWriter 3.0 Vorlage/Template ")
+ .Add Key := "vor4" , Item :=Array("vor" , "StarWriter 4.0 Template" , "StarWriter 4.0 Vorlage/Template ")
+ .Add Key := "xhtml" , Item :=Array("html" , "XHTML Document" , "XHTML Writer File ")
+ End With
+
+ With DrawExportFilters
+ .Add Key := "bmp" , Item :=Array("bmp" , "Windows Bitmap" , "draw_bmp_Export ")
+ .Add Key := "emf" , Item :=Array("emf" , "Enhanced Metafile" , "draw_emf_Export ")
+ .Add Key := "eps" , Item :=Array("eps" , "Encapsulated PostScript" , "draw_eps_Export ")
+ .Add Key := "gif" , Item :=Array("gif" , "Graphics Interchange Format" , "draw_gif_Export ")
+ .Add Key := "html" , Item :=Array("html" , "HTML Document (OpenOffice.org Draw)" , "draw_html_Export ")
+ .Add Key := "jpg" , Item :=Array("jpg" , "Joint Photographic Experts Group" , "draw_jpg_Export ")
+ .Add Key := "met" , Item :=Array("met" , "OS/2 Metafile" , "draw_met_Export ")
+ .Add Key := "odd" , Item :=Array("odd" , "OpenDocument Drawing" , "draw8 ")
+ .Add Key := "otg" , Item :=Array("otg" , "OpenDocument Drawing Template" , "draw8_template ")
+ .Add Key := "pbm" , Item :=Array("pbm" , "Portable Bitmap" , "draw_pbm_Export ")
+ .Add Key := "pct" , Item :=Array("pct" , "Mac Pict" , "draw_pct_Export ")
+ .Add Key := "pdf" , Item :=Array("pdf" , "Portable Document Format" , "draw_pdf_Export ")
+ .Add Key := "pgm" , Item :=Array("pgm" , "Portable Graymap" , "draw_pgm_Export ")
+ .Add Key := "png" , Item :=Array("png" , "Portable Network Graphic" , "draw_png_Export ")
+ .Add Key := "ppm" , Item :=Array("ppm" , "Portable Pixelmap" , "draw_ppm_Export ")
+ .Add Key := "ras" , Item :=Array("ras" , "Sun Raster Image" , "draw_ras_Export ")
+ .Add Key := "std" , Item :=Array("std" , "OpenOffice.org 1.0 Drawing Template" , "draw_StarOffice_XML_Draw_Template ")
+ .Add Key := "svg" , Item :=Array("svg" , "Scalable Vector Graphics" , "draw_svg_Export ")
+ .Add Key := "svm" , Item :=Array("svm" , "StarView Metafile" , "draw_svm_Export ")
+ .Add Key := "swf" , Item :=Array("swf" , "Macromedia Flash (SWF)" , "draw_flash_Export ")
+ .Add Key := "sxd" , Item :=Array("sxd" , "OpenOffice.org 1.0 Drawing" , "StarOffice XML (Draw) ")
+ .Add Key := "sxd3" , Item :=Array("sxd" , "StarDraw 3.0" , "StarDraw 3.0 ")
+ .Add Key := "sxd5" , Item :=Array("sxd" , "StarDraw 5.0" , "StarDraw 5.0 ")
+ .Add Key := "tiff" , Item :=Array("tiff" , "Tagged Image File Format" , "draw_tif_Export ")
+ .Add Key := "vor" , Item :=Array("vor" , "StarDraw 5.0 Template" , "StarDraw 5.0 Vorlage ")
+ .Add Key := "vor3" , Item :=Array("vor" , "StarDraw 3.0 Template" , "StarDraw 3.0 Vorlage ")
+ .Add Key := "wmf" , Item :=Array("wmf" , "Windows Metafile" , "draw_wmf_Export ")
+ .Add Key := "xhtml" , Item :=Array("xhtml" , "XHTML" , "XHTML Draw File ")
+ .Add Key := "xpm" , Item :=Array("xpm" , "X PixMap" , "draw_xpm_Export ")
+
+
+ End With
+
+ With ImpressExportFilters
+ .Add Key := "bmp" , Item :=Array("bmp" , "Windows Bitmap" , "impress_bmp_Export ")
+ .Add Key := "emf" , Item :=Array("emf" , "Enhanced Metafile" , "impress_emf_Export ")
+ .Add Key := "eps" , Item :=Array("eps" , "Encapsulated PostScript" , "impress_eps_Export ")
+ .Add Key := "gif" , Item :=Array("gif" , "Graphics Interchange Format" , "impress_gif_Export ")
+ .Add Key := "html" , Item :=Array("html" , "HTML Document (OpenOffice.org Impress)" , "impress_html_Export ")
+ .Add Key := "jpg" , Item :=Array("jpg" , "Joint Photographic Experts Group" , "impress_jpg_Export ")
+ .Add Key := "met" , Item :=Array("met" , "OS/2 Metafile" , "impress_met_Export ")
+ .Add Key := "odg" , Item :=Array("odg" , "ODF Drawing (Impress)" , "impress8_draw ")
+ .Add Key := "odp" , Item :=Array("odp" , "ODF Presentation" , "impress8 ")
+ .Add Key := "otp" , Item :=Array("otp" , "ODF Presentation Template" , "impress8_template ")
+ .Add Key := "pbm" , Item :=Array("pbm" , "Portable Bitmap" , "impress_pbm_Export ")
+ .Add Key := "pct" , Item :=Array("pct" , "Mac Pict" , "impress_pct_Export ")
+ .Add Key := "pdf" , Item :=Array("pdf" , "Portable Document Format" , "impress_pdf_Export ")
+ .Add Key := "pgm" , Item :=Array("pgm" , "Portable Graymap" , "impress_pgm_Export ")
+ .Add Key := "png" , Item :=Array("png" , "Portable Network Graphic" , "impress_png_Export ")
+ .Add Key := "pot" , Item :=Array("pot" , "Microsoft PowerPoint 97/2000/XP Template" , "MS PowerPoint 97 Vorlage ")
+ .Add Key := "ppm" , Item :=Array("ppm" , "Portable Pixelmap" , "impress_ppm_Export ")
+ .Add Key := "ppt" , Item :=Array("ppt" , "Microsoft PowerPoint 97/2000/XP" , "MS PowerPoint 97 ")
+ .Add Key := "pwp" , Item :=Array("pwp" , "PlaceWare" , "placeware_Export ")
+ .Add Key := "ras" , Item :=Array("ras" , "Sun Raster Image" , "impress_ras_Export ")
+ .Add Key := "sda" , Item :=Array("sda" , "StarDraw 5.0 (OpenOffice.org Impress)" , "StarDraw 5.0 (StarImpress) ")
+ .Add Key := "sdd" , Item :=Array("sdd" , "StarImpress 5.0" , "StarImpress 5.0 ")
+ .Add Key := "sdd3" , Item :=Array("sdd" , "StarDraw 3.0 (OpenOffice.org Impress)" , "StarDraw 3.0 (StarImpress) ")
+ .Add Key := "sdd4" , Item :=Array("sdd" , "StarImpress 4.0" , "StarImpress 4.0 ")
+ .Add Key := "sti" , Item :=Array("sti" , "OpenOffice.org 1.0 Presentation Template" , "impress_StarOffice_XML_Impress_Template ")
+ .Add Key := "svg" , Item :=Array("svg" , "Scalable Vector Graphics" , "impress_svg_Export ")
+ .Add Key := "svm" , Item :=Array("svm" , "StarView Metafile" , "impress_svm_Export ")
+ .Add Key := "swf" , Item :=Array("swf" , "Macromedia Flash (SWF)" , "impress_flash_Export ")
+ .Add Key := "sxd" , Item :=Array("sxd" , "OpenOffice.org 1.0 Drawing (OpenOffice.org Impress)" , "impress_StarOffice_XML_Draw ")
+ .Add Key := "sxi" , Item :=Array("sxi" , "OpenOffice.org 1.0 Presentation" , "StarOffice XML (Impress) ")
+ .Add Key := "tiff" , Item :=Array("tiff" , "Tagged Image File Format" , "impress_tif_Export ")
+ .Add Key := "uop" , Item :=Array("uop" , "Unified Office Format presentation" , "UOF presentation ")
+ .Add Key := "vor" , Item :=Array("vor" , "StarImpress 5.0 Template" , "StarImpress 5.0 Vorlage ")
+ .Add Key := "vor3" , Item :=Array("vor" , "StarDraw 3.0 Template (OpenOffice.org Impress)" , "StarDraw 3.0 Vorlage (StarImpress) ")
+ .Add Key := "vor4" , Item :=Array("vor" , "StarImpress 4.0 Template" , "StarImpress 4.0 Vorlage ")
+ .Add Key := "vor5" , Item :=Array("vor" , "StarDraw 5.0 Template (OpenOffice.org Impress)" , "StarDraw 5.0 Vorlage (StarImpress) ")
+ .Add Key := "wmf" , Item :=Array("wmf" , "Windows Metafile" , "impress_wmf_Export ")
+ .Add Key := "xhtml" , Item :=Array("xml" , "XHTML" , "XHTML Impress File ")
+ .Add Key := "xpm" , Item :=Array("xpm" , "X PixMap" , "impress_xpm_Export ")
+
+ End With
+
+ With CalcExportFilters
+ .Add Key := "csv" , Item :=Array("csv" , "Text CSV" , "Text - txt - csv (StarCalc) ")
+ .Add Key := "dbf" , Item :=Array("dbf" , "dBASE" , "dBase ")
+ .Add Key := "dif" , Item :=Array("dif" , "Data Interchange Format" , "DIF ")
+ .Add Key := "html" , Item :=Array("html" , "HTML Document (OpenOffice.org Calc)" , "HTML (StarCalc) ")
+ .Add Key := "ods" , Item :=Array("ods" , "ODF Spreadsheet" , "calc8 ")
+ .Add Key := "ooxml" , Item :=Array("xml" , "Microsoft Excel 2003 XML" , "MS Excel 2003 XML ")
+ .Add Key := "ots" , Item :=Array("ots" , "ODF Spreadsheet Template" , "calc8_template ")
+ .Add Key := "pdf" , Item :=Array("pdf" , "Portable Document Format" , "calc_pdf_Export ")
+ .Add Key := "sdc" , Item :=Array("sdc" , "StarCalc 5.0" , "StarCalc 5.0 ")
+ .Add Key := "sdc3" , Item :=Array("sdc" , "StarCalc 3.0" , "StarCalc 3.0 ")
+ .Add Key := "sdc4" , Item :=Array("sdc" , "StarCalc 4.0" , "StarCalc 4.0 ")
+ .Add Key := "slk" , Item :=Array("slk" , "SYLK" , "SYLK ")
+ .Add Key := "stc" , Item :=Array("stc" , "OpenOffice.org 1.0 Spreadsheet Template" , "calc_StarOffice_XML_Calc_Template ")
+ .Add Key := "sxc" , Item :=Array("sxc" , "OpenOffice.org 1.0 Spreadsheet" , "StarOffice XML (Calc) ")
+ .Add Key := "uos" , Item :=Array("uos" , "Unified Office Format spreadsheet" , "UOF spreadsheet ")
+ .Add Key := "vor" , Item :=Array("vor" , "StarCalc 5.0 Template" , "StarCalc 5.0 Vorlage/Template ")
+ .Add Key := "vor3" , Item :=Array("vor" , "StarCalc 3.0 Template" , "StarCalc 3.0 Vorlage/Template ")
+ .Add Key := "vor4" , Item :=Array("vor" , "StarCalc 4.0 Template" , "StarCalc 4.0 Vorlage/Template ")
+ .Add Key := "xhtml" , Item :=Array("xhtml" , "XHTML" , "XHTML Calc File ")
+ .Add Key := "xls" , Item :=Array("xls" , "Microsoft Excel 97/2000/XP" , "MS Excel 97 ")
+ .Add Key := "xls5" , Item :=Array("xls" , "Microsoft Excel 5.0" , "MS Excel 5.0/95 ")
+ .Add Key := "xls95" , Item :=Array("xls" , "Microsoft Excel 95" , "MS Excel 95 ")
+ .Add Key := "xlt" , Item :=Array("xlt" , "Microsoft Excel 97/2000/XP Template" , "MS Excel 97 Vorlage/Template ")
+ .Add Key := "xlt5" , Item :=Array("xlt" , "Microsoft Excel 5.0 Template" , "MS Excel 5.0/95 Vorlage/Template ")
+ .Add Key := "xlt95" , Item :=Array("xlt" , "Microsoft Excel 95 Template" , "MS Excel 95 Vorlage/Template ")
+
+ End With
+
+ With WriterWebExportFilters
+ .Add Key := "etext" , Item :=Array("txt" , "Text Encoded (OpenOffice.org Writer/Web)" , "Text (encoded) (StarWriter/Web) ")
+ .Add Key := "html" , Item :=Array("html" , "HTML Document" , "HTML ")
+ '.Add Key := "html" , Item :=Array("html" , "HTML Document Template" , "writerweb8_writer_template ")
+ .Add Key := "html10" , Item :=Array("html" , "OpenOffice.org 1.0 HTML Template" , "writer_web_StarOffice_XML_Writer_Web_Template ")
+ .Add Key := "mediawiki" , Item :=Array("txt" , "MediaWiki" , "MediaWiki_Web ")
+ .Add Key := "pdf" , Item :=Array("pdf" , "PDF - Portable Document Format" , "writer_web_pdf_Export ")
+ .Add Key := "sdw" , Item :=Array("sdw" , "StarWriter 5.0 (OpenOffice.org Writer/Web)" , "StarWriter 5.0 (StarWriter/Web) ")
+ .Add Key := "sdw3" , Item :=Array("sdw" , "StarWriter 3.0 (OpenOffice.org Writer/Web)" , "StarWriter 3.0 (StarWriter/Web) ")
+ .Add Key := "sdw4" , Item :=Array("sdw" , "StarWriter 4.0 (OpenOffice.org Writer/Web)" , "StarWriter 4.0 (StarWriter/Web) ")
+ .Add Key := "text" , Item :=Array("txt" , "Text (OpenOffice.org Writer/Web)" , "Text (StarWriter/Web) ")
+ .Add Key := "text10" , Item :=Array("txt" , "OpenOffice.org 1.0 Text Document (OpenOffice.org Writer/Web)" , "writer_web_StarOffice_XML_Writer ")
+ .Add Key := "odt" , Item :=Array("txt" , "OpenOffice.org Text (OpenOffice.org Writer/Web)" , "writerweb8_writer ")
+ .Add Key := "vor" , Item :=Array("vor" , "StarWriter/Web 5.0 Template" , "StarWriter/Web 5.0 Vorlage/Template ")
+ .Add Key := "vor4" , Item :=Array("vor" , "StarWriter/Web 4.0 Template" , "StarWriter/Web 4.0 Vorlage/Template ")
+
+ End With
+
+ With DocTypeToFiltersMap
+ .Add Key := "com.sun.star.text.TextDocument", Item := WriterExportFilters
+ .Add Key := "com.sun.star.sheet.SpreadsheetDocument", Item := CalcExportFilters
+ .Add Key := "com.sun.star.presentation.PresentationDocument", Item :=ImpressExportFilters
+ .Add Key := "com.sun.star.drawing.DrawingDocument", Item := DrawExportFilters
+ .Add Key := "com.sun.star.text.WebDocument", Item := WriterWebExportFilters
+ End With
+ ExportFiltersInited = True
+End Sub
+
+Function FilterSaveExtension(filterDescriptor ())
+ FilterSaveExtension = Trim(filterDescriptor(0))
+End Function
+
+Function FilterHandler(filterDescriptor ())
+ FilterHandler = Trim(filterDescriptor(2))
+End Function
+
+Function GetFilter(docType, outputFormat)
+ Dim filters
+
+ On Error Goto MissingFilter
+ filters = DocTypeToFiltersMap(docType)
+ LogMessage "output format is " & outputFormat
+ GetFilter = filters(outputFormat)
+
+Done:
+ Exit Function
+
+MissingFilter:
+ LogMessage("No existing filters for exporting " & docType & " to " & outputFormat)
+ GetFilter = Null
+ Resume Done
+End Function
+
diff --git a/contrib/odt/BasicODConverter/Main.bas b/contrib/odt/BasicODConverter/Main.bas
new file mode 100644
index 0000000..44838d3
--- /dev/null
+++ b/contrib/odt/BasicODConverter/Main.bas
@@ -0,0 +1,201 @@
+REM ***** BASIC *****
+
+Dim Interactive As Boolean
+Dim WaitFor
+
+Function Convert(Optional inFileURL, Optional filterSpec, Optional outFileURL)
+ Dim inDoc, inDocType, openParams, closeInDoc, presentationDoc
+
+ ' Set Interactivity i.e., LogMessage pops up a message.
+ Interactive = False
+
+ WaitFor = 10
+
+ ' Init dependencies
+ BasicLibraries.LoadLibrary("Tools")
+ ' BasicLibraries.LoadLibrary("XrayTool")
+
+ ' Setup Export filters
+ InitExportFilters
+
+ ' Export to doc format by default
+ If IsMissing(filterSpec) Then
+ If Interactive Then
+ filterSpec = InputBox("Export to: ")
+ Else
+ filterSpec = "doc"
+ End If
+ End If
+ filterSpec = Trim(filterSpec)
+
+ closeInDoc = False
+ If IsMissing(inFileURL) Then
+ ' Most likely, the Macro is run interactively. Act on
+ ' the current document
+ If Not ThisComponent.HasLocation() Then
+ LogMessage("Document doesn't have a location")
+ Goto Failure
+ End If
+
+ inDoc = ThisComponent
+ inFileURL = inDoc.GetLocation()
+ closeInDoc = False
+
+ Else
+ ' Load the document
+ On Error Goto Failure
+ openParams = Array(MakePropertyValue("Hidden", True),MakePropertyValue("ReadOnly", True),)
+
+ 'openParams = Array()
+ inDoc = StarDesktop.loadComponentFromURL(inFileURL, "_blank", 0, OpenParams())
+ closeInDoc = True
+ End If
+
+ If IsMissing(outFileURL) Then
+ outFileURL = GetURLWithoutExtension(inFileURL)
+ End If
+
+ If ExportDocument(inDoc, filterSpec, outFileURL) Then
+ Goto Success
+ End If
+
+ LogMessage("filterSpec1 is " & filterSpec)
+
+ ' Export didn't go through. Maybe didn't find a valid filter.
+
+ ' Check whether the request is to convert a Text or a Web
+ ' Document to a Presentation Document
+
+ inDocType = GetDocumentType(inDoc)
+ If (inDocType = "com.sun.star.text.TextDocument" Or _
+ inDocType = "com.sun.star.text.WebDocument") Then
+ LogMessage("Filterspec2 is " & filterSpec)
+ filter = GetFilter("com.sun.star.presentation.PresentationDocument", filterSpec)
+ If IsNull(filter) Then
+ LogMessage("We tried our best. Nothing more to do"
+ Goto Failure
+ Else
+ LogMessage("Trying to create presentation document. Found valid filter for " & filterSpec)
+ End If
+ Else
+ Goto Failure
+ End If
+
+ ' Export Outline to Presentation
+ dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
+ dispatcher.executeDispatch(inDoc.CurrentController.Frame, ".uno:SendOutlineToStarImpress", "", 0, Array())
+
+ ' Dispatch event above is aynchronous. Wait for a few seconds for the above event to finish
+ Wait(WaitFor * 1000)
+
+ ' After the dispatch, the current component is a presentation
+ ' document. Note that it doesn't have a location
+
+ presentationDoc = ThisComponent
+ If IsNull(ExportDocument(presentationDoc, filter, outFileURL)) Then
+ Goto Failure
+ Else
+ presentationDoc.Close(True)
+ End If
+
+Success:
+ LogMessage("Successfully exported to " & outFileURL )
+ Goto Done
+
+Failure:
+ LogMessage("Export failed " & outFileURL )
+ Goto Done
+
+Done:
+ If closeInDoc Then
+ inDoc.Close(True)
+ End If
+End Function
+
+' http://codesnippets.services.openoffice.org/Writer/Writer.MergeDocs.snip
+' http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=39983
+' http://user.services.openoffice.org/en/forum/viewtopic.php?f=21&t=23531
+
+' http://wiki.services.openoffice.org/wiki/Documentation/BASIC_Guide/Files_and_Directories_%28Runtime_Library%29
+
+
+Function ExportDocument(inputDoc, filterSpec, outFileURL) As Boolean
+ Dim inputDocType, filter
+ ExportDocument = False
+
+ On Error Goto Failure
+ inputDocType = GetDocumentType(inputDoc)
+
+ If IsArray(filterSpec) Then
+ ' Filter is fully specified
+ filter = filterSpec
+ Else
+ ' Filter is specified by it's name
+ filter = GetFilter(inputDocType, filterSpec)
+ End If
+
+ If InStr(outFileURL, ".") = 0 Then
+ outFileURL = outFileURL & "." & FilterSaveExtension(filter)
+ End If
+
+ LogMessage("outFileURL is " & outFileURL)
+
+ inputDoc.storeToUrl(outFileURL, Array(MakePropertyValue("FilterName", FilterHandler(filter))))
+
+ ExportDocument = True
+ LogMessage("Export to " & outFileURL & " succeeded")
+Done:
+ Exit Function
+
+Failure:
+ LogMessage("Export to " & outFileURL & " failed")
+ Resume Done
+End Function
+
+
+Function GetURLWithoutExtension(s As String)
+ Dim pos
+ pos = Instr(s, ".")
+ If pos = 0 Then
+ GetURLWithoutExtension = s
+ Else
+ GetURLWithoutExtension = Left(s, pos - 1)
+ End If
+End Function
+
+Function GetDocumentType(oDoc)
+ For Each docType in DocTypes
+ If (oDoc.supportsService(docType)) Then
+ GetDocumentType = docType
+ Exit Function
+ End If
+ Next docType
+ GetDocumentType = Nothing
+End Function
+
+Function MakePropertyValue(Optional sName As String, Optional sValue) As com.sun.star.beans.PropertyValue
+ Dim oPropertyValue As New com.sun.star.beans.PropertyValue
+
+ If Not IsMissing(sName) Then
+ oPropertyValue.Name = sName
+ EndIf
+
+ If Not IsMissing(sValue) Then
+ oPropertyValue.Value = sValue
+ EndIf
+
+ MakePropertyValue() = oPropertyValue
+
+End Function
+
+
+Sub LogMessage(message)
+ If Interactive Then
+ If Err <> 0 Then
+ Print "Error " & Err & ": " & Error$ & " (line : " & Erl & ")"
+ End If
+ Print message
+ End If
+End Sub
+
+
diff --git a/lisp/ob-io.el b/lisp/ob-io.el
deleted file mode 100644
index 7742fc6..0000000
--- a/lisp/ob-io.el
+++ /dev/null
@@ -1,122 +0,0 @@
-;;; ob-io.el --- org-babel functions for Io evaluation
-
-;; Copyright (C) 2012 Free Software Foundation, Inc.
-
-;; Author: Andrzej Lichnerowicz
-;; Keywords: literate programming, reproducible research
-;; Homepage: http://orgmode.org
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs. If not, see .
-
-;;; Commentary:
-;; Currently only supports the external execution. No session support yet.
-;; :results output -- runs in scripting mode
-;; :results output repl -- runs in repl mode
-
-;;; Requirements:
-;; - Io language :: http://iolanguage.org/
-;; - Io major mode :: Can be installed from Io sources
-;; https://github.com/stevedekorte/io/blob/master/extras/SyntaxHighlighters/Emacs/io-mode.el
-
-;;; Code:
-(require 'ob)
-(require 'ob-ref)
-(require 'ob-comint)
-(require 'ob-eval)
-(eval-when-compile (require 'cl))
-
-(add-to-list 'org-babel-tangle-lang-exts '("io" . "io"))
-(defvar org-babel-default-header-args:io '())
-(defvar org-babel-io-command "io"
- "Name of the command to use for executing Io code.")
-
-
-(defun org-babel-execute:io (body params)
- "Execute a block of Io code with org-babel. This function is
-called by `org-babel-execute-src-block'"
- (message "executing Io source code block")
- (let* ((processed-params (org-babel-process-params params))
- (session (org-babel-io-initiate-session (nth 0 processed-params)))
- (vars (nth 1 processed-params))
- (result-params (nth 2 processed-params))
- (result-type (cdr (assoc :result-type params)))
- (full-body (org-babel-expand-body:generic
- body params))
- (result (org-babel-io-evaluate
- session full-body result-type result-params)))
-
- (org-babel-reassemble-table
- result
- (org-babel-pick-name
- (cdr (assoc :colname-names params)) (cdr (assoc :colnames params)))
- (org-babel-pick-name
- (cdr (assoc :rowname-names params)) (cdr (assoc :rownames params))))))
-
-
-(defun org-babel-io-table-or-string (results)
- "Convert RESULTS into an appropriate elisp value.
-If RESULTS look like a table, then convert them into an
-Emacs-lisp table, otherwise return the results as a string."
- (org-babel-script-escape results))
-
-
-(defvar org-babel-io-wrapper-method
- "(
-%s
-) asString print
-")
-
-
-(defun org-babel-io-evaluate (session body &optional result-type result-params)
- "Evaluate BODY in external Io process.
-If RESULT-TYPE equals 'output then return standard output as a string.
-If RESULT-TYPE equals 'value then return the value of the last statement
-in BODY as elisp."
- (when session (error "Sessions are not supported for Io. Yet."))
- (case result-type
- (output
- (if (member "repl" result-params)
- (org-babel-eval org-babel-io-command body)
- (let ((src-file (org-babel-temp-file "io-")))
- (progn (with-temp-file src-file (insert body))
- (org-babel-eval
- (concat org-babel-io-command " " src-file) "")))))
- (value (let* ((src-file (org-babel-temp-file "io-"))
- (wrapper (format org-babel-io-wrapper-method body)))
- (with-temp-file src-file (insert wrapper))
- ((lambda (raw)
- (if (member "code" result-params)
- raw
- (org-babel-io-table-or-string raw)))
- (org-babel-eval
- (concat org-babel-io-command " " src-file) ""))))))
-
-
-(defun org-babel-prep-session:io (session params)
- "Prepare SESSION according to the header arguments specified in PARAMS."
- (error "Sessions are not supported for Io. Yet."))
-
-(defun org-babel-io-initiate-session (&optional session)
- "If there is not a current inferior-process-buffer in SESSION
-then create. Return the initialized session. Sessions are not
-supported in Io."
- nil)
-
-(provide 'ob-io)
-
-
-
-;;; ob-io.el ends here
diff --git a/lisp/ob-scala.el b/lisp/ob-scala.el
deleted file mode 100644
index 8af4886..0000000
--- a/lisp/ob-scala.el
+++ /dev/null
@@ -1,120 +0,0 @@
-;;; ob-scala.el --- org-babel functions for Scala evaluation
-
-;; Copyright (C) 2012 Free Software Foundation, Inc.
-
-;; Author: Andrzej Lichnerowicz
-;; Keywords: literate programming, reproducible research
-;; Homepage: http://orgmode.org
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs. If not, see .
-
-;;; Commentary:
-;; Currently only supports the external execution. No session support yet.
-
-;;; Requirements:
-;; - Scala language :: http://www.scala-lang.org/
-;; - Scala major mode :: Can be installed from Scala sources
-;; https://github.com/scala/scala-dist/blob/master/tool-support/src/emacs/scala-mode.el
-
-;;; Code:
-(require 'ob)
-(require 'ob-ref)
-(require 'ob-comint)
-(require 'ob-eval)
-(eval-when-compile (require 'cl))
-
-(add-to-list 'org-babel-tangle-lang-exts '("scala" . "scala"))
-(defvar org-babel-default-header-args:scala '())
-(defvar org-babel-scala-command "scala"
- "Name of the command to use for executing Scala code.")
-
-
-(defun org-babel-execute:scala (body params)
- "Execute a block of Scala code with org-babel. This function is
-called by `org-babel-execute-src-block'"
- (message "executing Scala source code block")
- (let* ((processed-params (org-babel-process-params params))
- (session (org-babel-scala-initiate-session (nth 0 processed-params)))
- (vars (nth 1 processed-params))
- (result-params (nth 2 processed-params))
- (result-type (cdr (assoc :result-type params)))
- (full-body (org-babel-expand-body:generic
- body params))
- (result (org-babel-scala-evaluate
- session full-body result-type result-params)))
-
- (org-babel-reassemble-table
- result
- (org-babel-pick-name
- (cdr (assoc :colname-names params)) (cdr (assoc :colnames params)))
- (org-babel-pick-name
- (cdr (assoc :rowname-names params)) (cdr (assoc :rownames params))))))
-
-
-(defun org-babel-scala-table-or-string (results)
- "Convert RESULTS into an appropriate elisp value.
-If RESULTS look like a table, then convert them into an
-Emacs-lisp table, otherwise return the results as a string."
- (org-babel-script-escape results))
-
-
-(defvar org-babel-scala-wrapper-method
- "(
-%s
-) asString print
-")
-
-
-(defun org-babel-scala-evaluate
- (session body &optional result-type result-params)
- "Evaluate BODY in external Scala process.
-If RESULT-TYPE equals 'output then return standard output as a string.
-If RESULT-TYPE equals 'value then return the value of the last statement
-in BODY as elisp."
- (when session (error "Sessions are not supported for Scala. Yet."))
- (case result-type
- (output
- (let ((src-file (org-babel-temp-file "scala-")))
- (progn (with-temp-file src-file (insert body))
- (org-babel-eval
- (concat org-babel-scala-command " " src-file) ""))))
- (value
- (let* ((src-file (org-babel-temp-file "scala-"))
- (wrapper (format org-babel-scala-wrapper-method body)))
- (with-temp-file src-file (insert wrapper))
- ((lambda (raw)
- (if (member "code" result-params)
- raw
- (org-babel-scala-table-or-string raw)))
- (org-babel-eval
- (concat org-babel-scala-command " " src-file) ""))))))
-
-
-(defun org-babel-prep-session:scala (session params)
- "Prepare SESSION according to the header arguments specified in PARAMS."
- (error "Sessions are not supported for Scala. Yet."))
-
-(defun org-babel-scala-initiate-session (&optional session)
- "If there is not a current inferior-process-buffer in SESSION
-then create. Return the initialized session. Sessions are not
-supported in Scala."
- nil)
-
-(provide 'ob-scala)
-
-
-
-;;; ob-scala.el ends here
diff --git a/testing/README b/testing/README
deleted file mode 100644
index 4a68174..0000000
--- a/testing/README
+++ /dev/null
@@ -1,45 +0,0 @@
-# -*- mode:org -*-
-#+Title: Org-mode Testing
-#+Property: results silent
-
-* dependencies
-The only dependency is [[http://www.emacswiki.org/emacs/ErtTestLibrary][ERT]] the Emacs testing library which ships with
-Emacs24. If you are running an older version of Emacs and don't
-already have ERT installed it can be installed from its old [[https://github.com/ohler/ert][git
-repository]].
-
-* non-interactive batch testing from the command line
-The simplest way to run the Org-mode test suite is from the command
-line with the following invocation. Note that the paths below are
-relative to the base of the Org-mode directory.
-#+BEGIN_SRC sh
- emacs -Q --batch -l lisp/org.el -l testing/org-test.el \
- --eval "(progn (org-reload) (setq org-confirm-babel-evaluate nil))" \
- -f org-test-run-batch-tests
-#+END_SRC
-
-The options in the above command are explained below.
-| -Q | ignores any personal configuration ensuring a vanilla Emacs instance is used |
-| --batch | runs Emacs in "batch" mode with no gui and termination after execution |
-| -l | loads Org-mode and the org mode test suite defined in testing/org-test.el |
-| --eval | reloads Org-mode and allows evaluation of code blocks by the tests |
-| -f | actually runs the tests using the `org-test-run-batch-tests' function |
-
-* interactive testing from within Emacs
-To run the Org-mode test suite from a current Emacs instance simply
-load and run the test suite with the following commands.
-
-1) First load the test suite.
- #+BEGIN_SRC emacs-lisp :var here=(buffer-file-name)
- (add-to-list 'load-path (file-name-directory here))
- (require 'org-test)
- #+END_SRC
-
-2) Then run the test suite.
- #+BEGIN_SRC emacs-lisp
- (org-test-run-all-tests)
- #+END_SRC
-* troubleshooting
-- If the value of the =org-babel-no-eval-on-ctrl-c-ctrl-c= is non-nil
- then it will result in some test failure, as there are tests which
- rely on this behavior.
diff --git a/testing/README.org b/testing/README.org
new file mode 100644
index 0000000..faa0dd5
--- /dev/null
+++ b/testing/README.org
@@ -0,0 +1,115 @@
+#+Title: Org-mode Testing
+#+Babel: results silent
+
+The following instructions describe how to get started using the
+Org-mode test framework.
+
+* To run the tests interactively
+ :PROPERTIES:
+ :tangle: no
+ :END:
+1) Install the jump.el testing dependency which is included as a git
+ submodule in the org-mode repository. To do so run the following
+ git submodule commands from inside the base of the Org-mode
+ directory (or just execute the following code block).
+
+ #+begin_src sh
+ cd ..
+ git submodule init
+ git submodule update
+ #+end_src
+
+2) Load the [[file:org-test.el][org-test.el]] file
+ #+begin_src emacs-lisp
+ (load-file "org-test.el")
+ #+end_src
+
+3) The =org-test-jump= command is now bound to =M-C-j= in all
+ emacs-lisp files. Call this command from any file in the =lisp/=
+ directory of the org-mode repository to jump to the related test
+ file in the =testing/= directory. Call this functions with a
+ prefix argument, and the corresponding test file will be stubbed
+ out if it doesn't already exist.
+
+4) Ingest the library-of-babel.org file since some tests require this.
+ #+begin_src emacs-lisp
+ (org-babel-lob-ingest "../contrib/babel/library-of-babel.org")
+ #+end_src
+
+5) [[info:ert#Top][Review the ERT documentation]]
+
+6) A number of org-mode-specific functions and macros are provided in
+ =org-test.el= see the [[file:org-test.el::%3B%3B%3B%20Functions%20for%20writing%20tests][;;; Functions for Writing Tests]] subsection of
+ that file. Some of these functions make use of example org-mode
+ files located in the [[file:examples][examples/]] directory.
+
+7) Functions for loading and running the Org-mode tests are provided
+ in the [[file:org-test.el::%3B%3B%3B%20Load%20and%20Run%20tests][;;; Load and Run Tests]] subsection, the most important of
+ which are
+ - =org-test-load= which loads the entire Org-mode test suite
+ - =org-test-current-defun= which runs all tests for the current
+ function around point (should be called from inside of an
+ Org-mode elisp file)
+ - =org-test-run-all-tests= which runs the entire Org-mode test suite
+ - also note that the =ert= command can also be used to run tests
+
+8) Load and run all tests
+ #+begin_src emacs-lisp
+ (load-file "org-test.el")
+ (org-babel-lob-ingest "../contrib/babel/library-of-babel.org")
+ (org-test-load)
+ (org-test-run-all-tests)
+ #+end_src
+
+* To run the tests in batch mode
+First tangle this file out to your desktop.
+#+headers: :tangle ~/Desktop/run-org-tests.el
+#+begin_src emacs-lisp :var org-dir=(expand-file-name ".." (file-name-directory (or load-file-name (buffer-file-name))))
+ ;; add to the load path
+ (add-to-list 'load-path (concat org-dir "/lisp/"))
+ (add-to-list 'load-path (concat org-dir "/lisp/testing/"))
+ (add-to-list 'load-path (concat org-dir "/lisp/testing/ert/"))
+
+ ;; load Org-mode
+ (require 'org)
+
+ ;; setup the ID locations used in tests
+ (require 'org-id)
+ (org-id-update-id-locations
+ (list (concat org-dir "/testing/examples/babel.org")
+ (concat org-dir "/testing/examples/ob-C-test.org")
+ (concat org-dir "/testing/examples/normal.org")
+ (concat org-dir "/testing/examples/ob-awk-test.org")
+ (concat org-dir "/testing/examples/ob-octave.org")
+ (concat org-dir "/testing/examples/ob-fortran-test.org")
+ (concat org-dir "/testing/examples/ob-maxima-test.org")
+ (concat org-dir "/testing/examples/link-in-heading.org")
+ (concat org-dir "/testing/examples/links.org")))
+
+ ;; ensure that the latest Org-mode is loaded
+ (org-reload)
+
+ ;; load the test suite
+ (load-file (concat org-dir "/testing/org-test.el"))
+
+ ;; configure Babel
+ (org-babel-lob-ingest (concat org-dir "/contrib/babel/library-of-babel.org"))
+ (org-babel-do-load-languages
+ 'org-babel-load-languages
+ '((emacs-lisp . t)
+ (sh . t)))
+ (setq org-confirm-babel-evaluate nil)
+
+ ;; run the test suite
+ (org-test-run-all-tests)
+
+ ;; print the results
+ (with-current-buffer "*ert*"
+ (print (buffer-string)))
+#+end_src
+
+Then run the test suite with the following command which could use any
+version of Emacs.
+#+begin_src sh :results output silent
+ emacs --batch -Q -l ~/Desktop/run-org-tests.el
+#+end_src
diff --git a/testing/contrib/lisp/.gitignore b/testing/contrib/lisp/.gitignore
new file mode 100644
index 0000000..6e7ef91
--- /dev/null
+++ b/testing/contrib/lisp/.gitignore
@@ -0,0 +1 @@
+# this file ensures that the testing/contrib/lisp directory is created by git
\ No newline at end of file
diff --git a/testing/examples/include.org b/testing/examples/include.org
deleted file mode 100644
index 186facb..0000000
--- a/testing/examples/include.org
+++ /dev/null
@@ -1,10 +0,0 @@
-Small Org file with an include keyword.
-
-#+BEGIN_SRC emacs-lisp :exports results
-(+ 2 1)
-#+END_SRC
-
-#+INCLUDE: "include2.org"
-
-* Heading
-body
diff --git a/testing/examples/include2.org b/testing/examples/include2.org
deleted file mode 100644
index f985b46..0000000
--- a/testing/examples/include2.org
+++ /dev/null
@@ -1 +0,0 @@
-Success!
diff --git a/testing/examples/table.org b/testing/examples/table.org
new file mode 100644
index 0000000..3c6caed
--- /dev/null
+++ b/testing/examples/table.org
@@ -0,0 +1,19 @@
+#+TITLE: example file with tables
+#+OPTIONS: num:nil ^:nil
+
+This is an example file for use by the Org-mode tests defined in
+file:../lisp/test-org-table.el.
+
+* simple formula
+ :PROPERTIES:
+ :ID: 563523f7-3f3e-49c9-9622-9216cc9a5d95
+ :END:
+
+#+tblname: simple-formula
+| 1 |
+| 2 |
+| 3 |
+| 4 |
+|----|
+| 10 |
+ #+TBLFM: $1=vsum(@address@hidden)
diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el
deleted file mode 100644
index db46f81..0000000
--- a/testing/lisp/test-org-element.el
+++ /dev/null
@@ -1,436 +0,0 @@
-;;; test-org-element.el --- Tests for org-element.el
-
-;; Copyright (C) 2012 Nicolas Goaziou
-
-;; Author: Nicolas Goaziou
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see .
-
-;;; Commentary:
-
-;;; Code:
-
-(unless (featurep 'org-element)
- (signal 'missing-test-dependency "org-element"))
-
-
-
-;;; Tests:
-
-
-
-;;;; Headlines
-
-(ert-deftest test-org-element/headline-quote-keyword ()
- "Test QUOTE keyword recognition."
- ;; Reference test.
- (org-test-with-temp-text "* Headline"
- (let ((org-quote-string "QUOTE"))
- (should-not (org-element-property :quotedp (org-element-at-point)))))
- ;; Standard position.
- (org-test-with-temp-text "* QUOTE Headline"
- (let ((org-quote-string "QUOTE"))
- (let ((headline (org-element-at-point)))
- (should (org-element-property :quotedp headline))
- ;; Test removal from raw value.
- (should (equal (org-element-property :raw-value headline) "Headline"))))
- ;; Case sensitivity.
- (let ((org-quote-string "Quote"))
- (should-not (org-element-property :quotedp (org-element-at-point)))))
- ;; With another keyword.
- (org-test-with-temp-text "* TODO QUOTE Headline"
- (let ((org-quote-string "QUOTE")
- (org-todo-keywords '((sequence "TODO" "DONE"))))
- (should (org-element-property :quotedp (org-element-at-point))))))
-
-(ert-deftest test-org-element/headline-comment-keyword ()
- "Test COMMENT keyword recognition."
- ;; Reference test.
- (org-test-with-temp-text "* Headline"
- (let ((org-comment-string "COMMENT"))
- (should-not (org-element-property :commentedp (org-element-at-point)))))
- ;; Standard position.
- (org-test-with-temp-text "* COMMENT Headline"
- (let ((org-comment-string "COMMENT"))
- (let ((headline (org-element-at-point)))
- (should (org-element-property :commentedp headline))
- ;; Test removal from raw value.
- (should (equal (org-element-property :raw-value headline) "Headline"))))
- ;; Case sensitivity.
- (let ((org-comment-string "Comment"))
- (should-not (org-element-property :commentedp (org-element-at-point)))))
- ;; With another keyword.
- (org-test-with-temp-text "* TODO COMMENT Headline"
- (let ((org-comment-string "COMMENT")
- (org-todo-keywords '((sequence "TODO" "DONE"))))
- (should (org-element-property :commentedp (org-element-at-point))))))
-
-(ert-deftest test-org-element/headline-archive-tag ()
- "Test ARCHIVE tag recognition."
- ;; Reference test.
- (org-test-with-temp-text "* Headline"
- (let ((org-archive-tag "ARCHIVE"))
- (should-not (org-element-property :archivedp (org-element-at-point)))))
- ;; Single tag.
- (org-test-with-temp-text "* Headline :ARCHIVE:"
- (let ((org-archive-tag "ARCHIVE"))
- (let ((headline (org-element-at-point)))
- (should (org-element-property :archivedp headline))
- ;; Test tag removal.
- (should-not (org-element-property :tags headline))))
- (let ((org-archive-tag "Archive"))
- (should-not (org-element-property :archivedp (org-element-at-point)))))
- ;; Multiple tags.
- (org-test-with-temp-text "* Headline :test:ARCHIVE:"
- (let ((org-archive-tag "ARCHIVE"))
- (let ((headline (org-element-at-point)))
- (should (org-element-property :archivedp headline))
- ;; Test tag removal.
- (should (equal (org-element-property :tags headline) ":test:"))))))
-
-
-
-;;;; Example-blocks and Src-blocks
-
-(ert-deftest test-org-element/block-switches ()
- "Test `example-block' and `src-block' switches parsing."
- (let ((org-coderef-label-format "(ref:%s)"))
- ;; 1. Test "-i" switch.
- (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp\n(+ 1 1)\n#+END_SRC"
- (let ((element (org-element-current-element)))
- (should-not (org-element-property :preserve-indent element))))
- (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp -i\n(+ 1 1)\n#+END_SRC"
- (let ((element (org-element-current-element)))
- (should (org-element-property :preserve-indent element))))
- (org-test-with-temp-text "#+BEGIN_EXAMPLE\nText.\n#+END_EXAMPLE"
- (let ((element (org-element-current-element)))
- (should-not (org-element-property :preserve-indent element))))
- (org-test-with-temp-text "#+BEGIN_EXAMPLE -i\nText.\n#+END_EXAMPLE"
- (let ((element (org-element-current-element)))
- (should (org-element-property :preserve-indent element))))
- ;; 2. "-n -r -k" combination should number lines, retain labels but
- ;; not use them in coderefs.
- (org-test-with-temp-text "#+BEGIN_EXAMPLE -n -r -k\nText.\N#+END_EXAMPLE"
- (let ((element (org-element-current-element)))
- (should (and (org-element-property :number-lines element)
- (org-element-property :retain-labels element)
- (not (org-element-property :use-labels element))))))
- (org-test-with-temp-text
- "#+BEGIN_SRC emacs-lisp -n -r -k\n(+ 1 1)\n#+END_SRC"
- (let ((element (org-element-current-element)))
- (should (and (org-element-property :number-lines element)
- (org-element-property :retain-labels element)
- (not (org-element-property :use-labels element))))))
- ;; 3. "-n -r" combination should number-lines remove labels and not
- ;; use them in coderefs.
- (org-test-with-temp-text "#+BEGIN_EXAMPLE -n -r\nText.\n#+END_EXAMPLE"
- (let ((element (org-element-current-element)))
- (should (and (org-element-property :number-lines element)
- (not (org-element-property :retain-labels element))
- (not (org-element-property :use-labels element))))))
- (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp -n -r\n(+ 1 1)\n#+END_SRC"
- (let ((element (org-element-current-element)))
- (should (and (org-element-property :number-lines element)
- (not (org-element-property :retain-labels element))
- (not (org-element-property :use-labels element))))))
- ;; 4. "-n" or "+n" should number lines, retain labels and use them
- ;; in coderefs.
- (org-test-with-temp-text "#+BEGIN_EXAMPLE -n\nText.\n#+END_EXAMPLE"
- (let ((element (org-element-current-element)))
- (should (and (org-element-property :number-lines element)
- (org-element-property :retain-labels element)
- (org-element-property :use-labels element)))))
- (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp -n\n(+ 1 1)\n#+END_SRC"
- (let ((element (org-element-current-element)))
- (should (and (org-element-property :number-lines element)
- (org-element-property :retain-labels element)
- (org-element-property :use-labels element)))))
- (org-test-with-temp-text "#+BEGIN_EXAMPLE +n\nText.\n#+END_EXAMPLE"
- (let ((element (org-element-current-element)))
- (should (and (org-element-property :number-lines element)
- (org-element-property :retain-labels element)
- (org-element-property :use-labels element)))))
- (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp +n\n(+ 1 1)\n#+END_SRC"
- (let ((element (org-element-current-element)))
- (should (and (org-element-property :number-lines element)
- (org-element-property :retain-labels element)
- (org-element-property :use-labels element)))))
- ;; 5. No switch should not number lines, but retain labels and use
- ;; them in coderefs.
- (org-test-with-temp-text "#+BEGIN_EXAMPLE\nText.\n#+END_EXAMPLE"
- (let ((element (org-element-current-element)))
- (should (and (not (org-element-property :number-lines element))
- (org-element-property :retain-labels element)
- (org-element-property :use-labels element)))))
- (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp\n(+ 1 1)\n#+END_SRC"
- (let ((element (org-element-current-element)))
- (should (and (not (org-element-property :number-lines element))
- (org-element-property :retain-labels element)
- (org-element-property :use-labels element)))))
- ;; 6. "-r" switch only: do not number lines, remove labels, and
- ;; don't use labels in coderefs.
- (org-test-with-temp-text "#+BEGIN_EXAMPLE -r\nText.\n#+END_EXAMPLE"
- (let ((element (org-element-current-element)))
- (should (and (not (org-element-property :number-lines element))
- (not (org-element-property :retain-labels element))
- (not (org-element-property :use-labels element))))))
- (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp -r\n(+ 1 1)\n#+END_SRC"
- (let ((element (org-element-current-element)))
- (should (and (not (org-element-property :number-lines element))
- (not (org-element-property :retain-labels element))
- (not (org-element-property :use-labels element))))))
- ;; 7. Recognize coderefs with user-defined syntax.
- (org-test-with-temp-text
- "#+BEGIN_EXAMPLE -l \"[ref:%s]\"\nText [ref:text]\n#+END_EXAMPLE"
- (let ((element (org-element-current-element)))
- (should
- (equal (org-element-property :label-fmt element) "[ref:%s]"))))
- (org-test-with-temp-text
- "#+BEGIN_SRC emacs-lisp -l \"[ref:%s]\"\n(+ 1 1) [ref:text]\n#+END_SRC"
- (let ((element (org-element-current-element)))
- (should
- (equal (org-element-property :label-fmt element) "[ref:%s]"))))))
-
-
-
-;;; Navigation tools.
-
-(ert-deftest test-org-element/forward-element ()
- "Test `org-element-forward' specifications."
- ;; 1. At EOB: should error.
- (org-test-with-temp-text "Some text\n"
- (goto-char (point-max))
- (should-error (org-element-forward)))
- ;; 2. Standard move: expected to ignore blank lines.
- (org-test-with-temp-text "First paragraph.\n\n\nSecond paragraph."
- (org-element-forward)
- (should (looking-at "Second paragraph.")))
- ;; 3. Headline tests.
- (org-test-with-temp-text "
-* Head 1
-** Head 1.1
-*** Head 1.1.1
-** Head 1.2"
- ;; 3.1. At an headline beginning: move to next headline at the
- ;; same level.
- (goto-line 3)
- (org-element-forward)
- (should (looking-at "** Head 1.2"))
- ;; 3.2. At an headline beginning: move to parent headline if no
- ;; headline at the same level.
- (goto-line 3)
- (org-element-forward)
- (should (looking-at "** Head 1.2")))
- ;; 4. Greater element tests.
- (org-test-with-temp-text
- "#+BEGIN_CENTER\nInside.\n#+END_CENTER\n\nOutside."
- ;; 4.1. At a greater element: expected to skip contents.
- (org-element-forward)
- (should (looking-at "Outside."))
- ;; 4.2. At the end of greater element contents: expected to skip
- ;; to the end of the greater element.
- (goto-line 2)
- (org-element-forward)
- (should (looking-at "Outside.")))
- ;; 5. List tests.
- (org-test-with-temp-text "
-- item1
-
- - sub1
-
- - sub2
-
- - sub3
-
- Inner paragraph.
-
-- item2
-
-Outside."
- ;; 5.1. At list top point: expected to move to the element after
- ;; the list.
- (goto-line 2)
- (org-element-forward)
- (should (looking-at "Outside."))
- ;; 5.2. Special case: at the first line of a sub-list, but not at
- ;; beginning of line, move to next item.
- (goto-line 2)
- (forward-char)
- (org-element-forward)
- (should (looking-at "- item2"))
- (goto-line 4)
- (forward-char)
- (org-element-forward)
- (should (looking-at " - sub2"))
- ;; 5.3 At sub-list beginning: expected to move after the sub-list.
- (goto-line 4)
- (org-element-forward)
- (should (looking-at " Inner paragraph."))
- ;; 5.4. At sub-list end: expected to move outside the sub-list.
- (goto-line 8)
- (org-element-forward)
- (should (looking-at " Inner paragraph."))
- ;; 5.5. At an item: expected to move to next item, if any.
- (goto-line 6)
- (org-element-forward)
- (should (looking-at " - sub3"))))
-
-(ert-deftest test-org-element/backward-element ()
- "Test `org-element-backward' specifications."
- ;; 1. At BOB (modulo some white spaces): should error.
- (org-test-with-temp-text " \nParagraph."
- (org-skip-whitespace)
- (should-error (org-element-backward)))
- ;; 2. Not at the beginning of an element: move at its beginning.
- (org-test-with-temp-text "Paragraph1.\n\nParagraph2."
- (goto-line 3)
- (end-of-line)
- (org-element-backward)
- (should (looking-at "Paragraph2.")))
- ;; 3. Headline tests.
- (org-test-with-temp-text "
-* Head 1
-** Head 1.1
-*** Head 1.1.1
-** Head 1.2"
- ;; 3.1. At an headline beginning: move to previous headline at the
- ;; same level.
- (goto-line 5)
- (org-element-backward)
- (should (looking-at "** Head 1.1"))
- ;; 3.2. At an headline beginning: move to parent headline if no
- ;; headline at the same level.
- (goto-line 3)
- (org-element-backward)
- (should (looking-at "* Head 1"))
- ;; 3.3. At the first top-level headline: should error.
- (goto-line 2)
- (should-error (org-element-backward)))
- ;; 4. At beginning of first element inside a greater element:
- ;; expected to move to greater element's beginning.
- (org-test-with-temp-text "Before.\n#+BEGIN_CENTER\nInside.\n#+END_CENTER."
- (goto-line 3)
- (org-element-backward)
- (should (looking-at "#\\+BEGIN_CENTER")))
- ;; 5. List tests.
- (org-test-with-temp-text "
-- item1
-
- - sub1
-
- - sub2
-
- - sub3
-
- Inner paragraph.
-
-- item2
-
-
-Outside."
- ;; 5.1. At beginning of sub-list: expected to move to the
- ;; paragraph before it.
- (goto-line 4)
- (org-element-backward)
- (should (looking-at "item1"))
- ;; 5.2. At an item in a list: expected to move at previous item.
- (goto-line 8)
- (org-element-backward)
- (should (looking-at " - sub2"))
- (goto-line 12)
- (org-element-backward)
- (should (looking-at "- item1"))
- ;; 5.3. At end of list/sub-list: expected to move to list/sub-list
- ;; beginning.
- (goto-line 10)
- (org-element-backward)
- (should (looking-at " - sub1"))
- (goto-line 15)
- (org-element-backward)
- (should (looking-at "- item1"))
- ;; 5.4. At blank-lines before list end: expected to move to top
- ;; item.
- (goto-line 14)
- (org-element-backward)
- (should (looking-at "- item1"))))
-
-(ert-deftest test-org-element/up-element ()
- "Test `org-element-up' specifications."
- ;; 1. At BOB or with no surrounding element: should error.
- (org-test-with-temp-text "Paragraph."
- (should-error (org-element-up)))
- (org-test-with-temp-text "* Head1\n* Head2"
- (goto-line 2)
- (should-error (org-element-up)))
- (org-test-with-temp-text "Paragraph1.\n\nParagraph2."
- (goto-line 3)
- (should-error (org-element-up)))
- ;; 2. At an headline: move to parent headline.
- (org-test-with-temp-text "* Head1\n** Sub-Head1\n** Sub-Head2"
- (goto-line 3)
- (org-element-up)
- (should (looking-at "\\* Head1")))
- ;; 3. Inside a greater element: move to greater element beginning.
- (org-test-with-temp-text
- "Before.\n#+BEGIN_CENTER\nParagraph1\nParagraph2\n#+END_CENTER\n"
- (goto-line 3)
- (org-element-up)
- (should (looking-at "#\\+BEGIN_CENTER")))
- ;; 4. List tests.
- (org-test-with-temp-text "* Top
-- item1
-
- - sub1
-
- - sub2
-
- Paragraph within sub2.
-
-- item2"
- ;; 4.1. Within an item: move to the item beginning.
- (goto-line 8)
- (org-element-up)
- (should (looking-at " - sub2"))
- ;; 4.2. At an item in a sub-list: move to parent item.
- (goto-line 4)
- (org-element-up)
- (should (looking-at "- item1"))
- ;; 4.3. At an item in top list: move to beginning of whole list.
- (goto-line 10)
- (org-element-up)
- (should (looking-at "- item1"))
- ;; 4.4. Special case. At very top point: should move to parent of
- ;; list.
- (goto-line 2)
- (org-element-up)
- (should (looking-at "\\* Top"))))
-
-(ert-deftest test-org-element/down-element ()
- "Test `org-element-down' specifications."
- ;; 1. Error when the element hasn't got a recursive type.
- (org-test-with-temp-text "Paragraph."
- (should-error (org-element-down)))
- ;; 2. When at a plain-list, move to first item.
- (org-test-with-temp-text "- Item 1\n - Item 1.1\n - Item 2.2"
- (goto-line 2)
- (org-element-down)
- (should (looking-at " - Item 1.1")))
- ;; 3. Otherwise, move inside the greater element.
- (org-test-with-temp-text "#+BEGIN_CENTER\nParagraph.\n#+END_CENTER"
- (org-element-down)
- (should (looking-at "Paragraph"))))
-
-
-(provide 'test-org-element)
-;;; test-org-element.el ends here
diff --git a/testing/lisp/test-org-export.el b/testing/lisp/test-org-export.el
deleted file mode 100644
index f34cc7b..0000000
--- a/testing/lisp/test-org-export.el
+++ /dev/null
@@ -1,625 +0,0 @@
-;;; test-org-export.el --- Tests for org-export.el
-
-;; Copyright (C) 2012 Nicolas Goaziou
-
-;; Author: Nicolas Goaziou
-
-;; Released under the GNU General Public License version 3
-;; see: http://www.gnu.org/licenses/gpl-3.0.html
-
-;;;; Comments
-
-
-
-;;; Code:
-
-(unless (featurep 'org-export)
- (signal 'missing-test-dependency "org-export"))
-
-
-
-;;; Tests
-
-(defmacro org-test-with-backend (backend &rest body)
- "Execute body with an export back-end defined.
-
-BACKEND is the name, as a string, of the back-end. BODY is the
-body to execute. The defined back-end simply returns parsed data
-as Org syntax."
- (declare (debug (form body)) (indent 1))
- `(flet ,(let (transcoders)
- (dolist (type (append org-element-all-elements
- org-element-all-objects)
- transcoders)
- (push `(,(intern (format "org-%s-%s" backend type))
- (obj contents info)
- (,(intern (format "org-element-%s-interpreter" type))
- obj contents))
- transcoders)))
- ,@body))
-
-(ert-deftest test-org-export/parse-option-keyword ()
- "Test reading all standard #+OPTIONS: items."
- (should
- (equal
- (org-export-parse-option-keyword
- "H:1 num:t \\n:t timestamp:t arch:t author:t creator:t d:t email:t
- *:t e:t ::t f:t pri:t -:t ^:t toc:t |:t tags:t tasks:t <:t todo:t")
- '(:headline-levels
- 1 :preserve-breaks t :section-numbers t :time-stamp-file t
- :with-archived-trees t :with-author t :with-creator t :with-drawers t
- :with-email t :with-emphasize t :with-entities t :with-fixed-width t
- :with-footnotes t :with-priority t :with-special-strings t
- :with-sub-superscript t :with-toc t :with-tables t :with-tags t
- :with-tasks t :with-timestamps t :with-todo-keywords t)))
- ;; Test some special values.
- (should
- (equal
- (org-export-parse-option-keyword
- "arch:headline creator:comment d:(\"TEST\")
- ^:{} toc:1 tags:not-in-toc tasks:todo num:2")
- '( :section-numbers
- 2
- :with-archived-trees headline :with-creator comment
- :with-drawers ("TEST") :with-sub-superscript {} :with-toc 1
- :with-tags not-in-toc :with-tasks todo))))
-
-(ert-deftest test-org-export/get-inbuffer-options ()
- "Test reading all standard export keywords."
- (should
- (equal
- (org-test-with-temp-text "#+AUTHOR: Me, Myself and I
-#+CREATOR: Idem
-#+DATE: Today
-#+DESCRIPTION: Testing
-#+DESCRIPTION: with two lines
-#+EMAIL: address@hidden
-#+EXPORT_EXCLUDE_TAGS: noexport invisible
-#+KEYWORDS: test
-#+LANGUAGE: en
-#+EXPORT_SELECT_TAGS: export
-#+TITLE: Some title
-#+TITLE: with spaces"
- (org-export-get-inbuffer-options))
- '(:author
- "Me, Myself and I" :creator "Idem" :date "Today"
- :description "Testing\nwith two lines" :email "address@hidden"
- :exclude-tags ("noexport" "invisible") :keywords "test" :language "en"
- :select-tags ("export") :title "Some title with spaces"))))
-
-(ert-deftest test-org-export/define-macro ()
- "Try defining various Org macro using in-buffer #+MACRO: keyword."
- ;; Parsed macro.
- (should (equal (org-test-with-temp-text "#+MACRO: one 1"
- (org-export-get-inbuffer-options))
- '(:macro-one ("1"))))
- ;; Evaled macro.
- (should (equal (org-test-with-temp-text "#+MACRO: two (eval (+ 1 1))"
- (org-export-get-inbuffer-options))
- '(:macro-two "(eval (+ 1 1))")))
- ;; Incomplete macro.
- (should-not (org-test-with-temp-text "#+MACRO: three"
- (org-export-get-inbuffer-options)))
- ;; Macro with newline character.
- (should (equal (org-test-with-temp-text "#+MACRO: four a\\nb"
- (org-export-get-inbuffer-options))
- '(:macro-four ("a\nb"))))
- ;; Macro with protected newline character.
- (should (equal (org-test-with-temp-text "#+MACRO: five a\\\\nb"
- (org-export-get-inbuffer-options))
- '(:macro-five ("a\\nb"))))
- ;; Recursive macro.
- (org-test-with-temp-text "#+MACRO: six 6\n#+MACRO: seven 1 + {{{six}}}"
- (should
- (equal
- (org-export-get-inbuffer-options)
- '(:macro-six
- ("6")
- :macro-seven
- ("1 + " (macro (:key "six" :value "{{{six}}}" :args nil :begin 5 :end 14
- :post-blank 0))))))))
-
-(ert-deftest test-org-export/handle-options ()
- "Test if export options have an impact on output."
- ;; Test exclude tags.
- (org-test-with-temp-text "* Head1 :noexport:"
- (org-test-with-backend "test"
- (should
- (equal (org-export-as 'test nil nil nil '(:exclude-tags ("noexport")))
- ""))))
- ;; Test include tags.
- (org-test-with-temp-text "
-* Head1
-** Sub-Head1.1 :export:
-*** Sub-Head1.1.1
-* Head2"
- (org-test-with-backend "test"
- (should
- (string-match
- "\\* Head1\n\\*\\* Sub-Head1.1[ \t]+:export:\n\\*\\*\\* Sub-Head1.1.1\n"
- (org-export-as 'test nil nil nil '(:select-tags ("export")))))))
- ;; Test mixing include tags and exclude tags.
- (org-test-with-temp-text "
-* Head1 :export:
-** Sub-Head1 :noexport:
-** Sub-Head2
-* Head2 :noexport:
-** Sub-Head1 :export:"
- (org-test-with-backend "test"
- (should
- (string-match
- "\\* Head1[ \t]+:export:\n\\*\\* Sub-Head2\n"
- (org-export-as
- 'test nil nil nil
- '(:select-tags ("export") :exclude-tags ("noexport")))))))
- ;; Ignore tasks.
- (let ((org-todo-keywords '((sequence "TODO" "DONE"))))
- (org-test-with-temp-text "* TODO Head1"
- (org-test-with-backend "test"
- (should (equal (org-export-as 'test nil nil nil '(:with-tasks nil))
- "")))))
- (let ((org-todo-keywords '((sequence "TODO" "DONE"))))
- (org-test-with-temp-text "* TODO Head1"
- (org-test-with-backend "test"
- (should (equal (org-export-as 'test nil nil nil '(:with-tasks t))
- "* TODO Head1\n")))))
- ;; Archived tree.
- (org-test-with-temp-text "* Head1 :archive:"
- (let ((org-archive-tag "archive"))
- (org-test-with-backend "test"
- (should
- (equal (org-export-as 'test nil nil nil '(:with-archived-trees nil))
- "")))))
- (org-test-with-temp-text "* Head1 :archive:\nbody\n** Sub-head 2"
- (let ((org-archive-tag "archive"))
- (org-test-with-backend "test"
- (should
- (string-match
- "\\* Head1[ \t]+:archive:"
- (org-export-as 'test nil nil nil
- '(:with-archived-trees headline)))))))
- (org-test-with-temp-text "* Head1 :archive:"
- (let ((org-archive-tag "archive"))
- (org-test-with-backend "test"
- (should
- (string-match
- "\\`\\* Head1[ \t]+:archive:\n\\'"
- (org-export-as 'test nil nil nil '(:with-archived-trees t)))))))
- ;; Drawers.
- (let ((org-drawers '("TEST")))
- (org-test-with-temp-text ":TEST:\ncontents\n:END:"
- (org-test-with-backend "test"
- (should (equal (org-export-as 'test nil nil nil '(:with-drawers nil))
- "")))))
- (let ((org-drawers '("TEST")))
- (org-test-with-temp-text ":TEST:\ncontents\n:END:"
- (org-test-with-backend "test"
- (should (equal (org-export-as 'test nil nil nil '(:with-drawers t))
- ":TEST:\ncontents\n:END:\n"))))))
-
-(ert-deftest test-org-export/comment-tree ()
- "Test if export process ignores commented trees."
- (let ((org-comment-string "COMMENT"))
- (org-test-with-temp-text "* COMMENT Head1"
- (org-test-with-backend "test"
- (should (equal (org-export-as 'test) ""))))))
-
-(ert-deftest test-org-export/export-scope ()
- "Test all export scopes."
- (org-test-with-temp-text "
-* Head1
-** Head2
-text
-*** Head3"
- (org-test-with-backend "test"
- ;; Subtree.
- (forward-line 3)
- (should (equal (org-export-as 'test 'subtree) "text\n*** Head3\n"))
- ;; Visible.
- (goto-char (point-min))
- (forward-line)
- (org-cycle)
- (should (equal (org-export-as 'test nil 'visible) "* Head1\n"))
- ;; Body only.
- (flet ((org-test-template (body info) (format "BEGIN\n%sEND" body)))
- (should (equal (org-export-as 'test nil nil 'body-only)
- "* Head1\n** Head2\ntext\n*** Head3\n"))
- (should (equal (org-export-as 'test)
- "BEGIN\n* Head1\n** Head2\ntext\n*** Head3\nEND")))
- ;; Region.
- (goto-char (point-min))
- (forward-line 3)
- (transient-mark-mode 1)
- (push-mark (point) t t)
- (goto-char (point-at-eol))
- (should (equal (org-export-as 'test) "text\n")))))
-
-(ert-deftest test-org-export/export-snippet ()
- "Test export snippets transcoding."
- (org-test-with-temp-text "@address@hidden"
- (org-test-with-backend "test"
- (flet ((org-test-export-snippet
- (snippet contents info)
- (when (eq (org-export-snippet-backend snippet) 'test)
- (org-element-property :value snippet))))
- (let ((org-export-snippet-translation-alist nil))
- (should (equal (org-export-as 'test) "A\n")))
- (let ((org-export-snippet-translation-alist '(("t" . "test"))))
- (should (equal (org-export-as 'test) "AB\n")))))))
-
-(ert-deftest test-org-export/expand-include ()
- "Test file inclusion in an Org buffer."
- ;; Full insertion with recursive inclusion.
- (org-test-with-temp-text
- (format "#+INCLUDE: \"%s/examples/include.org\"" org-test-dir)
- (org-export-expand-include-keyword)
- (should (equal (buffer-string)
- "Small Org file with an include keyword.
-
-#+BEGIN_SRC emacs-lisp :exports results\n(+ 2 1)\n#+END_SRC
-
-Success!
-
-* Heading
-body\n")))
- ;; Localized insertion.
- (org-test-with-temp-text
- (format "#+INCLUDE: \"%s/examples/include.org\" :lines \"1-2\""
- org-test-dir)
- (org-export-expand-include-keyword)
- (should (equal (buffer-string)
- "Small Org file with an include keyword.\n")))
- ;; Insertion with constraints on headlines level.
- (org-test-with-temp-text
- (format
- "* Top heading\n#+INCLUDE: \"%s/examples/include.org\" :lines \"9-\""
- org-test-dir)
- (org-export-expand-include-keyword)
- (should (equal (buffer-string) "* Top heading\n** Heading\nbody\n")))
- ;; Inclusion within an example block.
- (org-test-with-temp-text
- (format "#+INCLUDE: \"%s/examples/include.org\" :lines \"1-2\" example"
- org-test-dir)
- (org-export-expand-include-keyword)
- (should
- (equal
- (buffer-string)
- "#+BEGIN_EXAMPLE\nSmall Org file with an include keyword.\n#+END_EXAMPLE\n")))
- ;; Inclusion within a src-block.
- (org-test-with-temp-text
- (format
- "#+INCLUDE: \"%s/examples/include.org\" :lines \"4-5\" src emacs-lisp"
- org-test-dir)
- (org-export-expand-include-keyword)
- (should (equal (buffer-string)
- "#+BEGIN_SRC emacs-lisp\n(+ 2 1)\n#+END_SRC\n"))))
-
-(ert-deftest test-org-export/user-ignore-list ()
- "Test if `:ignore-list' accepts user input."
- (org-test-with-backend "test"
- (flet ((skip-note-head
- (data backend info)
- ;; Ignore headlines with the word "note" in their title.
- (org-element-map
- data 'headline
- (lambda (headline)
- (when (string-match "\\"
- (org-element-property :raw-value headline))
- (org-export-ignore-element headline info)))
- info)
- data))
- ;; Install function in parse tree filters.
- (let ((org-export-filter-parse-tree-functions '(skip-note-head)))
- (org-test-with-temp-text "* Head1\n* Head2 (note)\n"
- (should (equal (org-export-as 'test) "* Head1\n")))))))
-
-
-
-;; Footnotes
-
-(ert-deftest test-org-export/footnotes ()
- "Test footnotes specifications."
- (let ((org-footnote-section nil))
- ;; 1. Read every type of footnote.
- (org-test-with-temp-text
- "Text[fn:1] [1] [fn:label:C] [fn::D]\n\n[fn:1] A\n\n[1] B"
- (let* ((tree (org-element-parse-buffer))
- (info (org-combine-plists
- (org-export-initial-options) '(:with-footnotes t))))
- (setq info (org-combine-plists
- info (org-export-collect-tree-properties tree info 'test)))
- (should
- (equal
- '((1 . "A") (2 . "B") (3 . "C") (4 . "D"))
- (org-element-map
- tree 'footnote-reference
- (lambda (ref)
- (let ((def (org-export-get-footnote-definition ref info)))
- (cons (org-export-get-footnote-number ref info)
- (if (eq (org-element-property :type ref) 'inline) (car def)
- (car (org-element-contents
- (car (org-element-contents def))))))))
- info)))))
- ;; 2. Test nested footnotes order.
- (org-test-with-temp-text
- "Text[fn:1:A[fn:2]] [fn:3].\n\n[fn:2] B [fn:3] [fn::D].\n\n[fn:3] C."
- (let* ((tree (org-element-parse-buffer))
- (info (org-combine-plists
- (org-export-initial-options) '(:with-footnotes t))))
- (setq info (org-combine-plists
- info (org-export-collect-tree-properties tree info 'test)))
- (should
- (equal
- '((1 . "fn:1") (2 . "fn:2") (3 . "fn:3") (4))
- (org-element-map
- tree 'footnote-reference
- (lambda (ref)
- (when (org-export-footnote-first-reference-p ref info)
- (cons (org-export-get-footnote-number ref info)
- (org-element-property :label ref))))
- info)))))
- ;; 3. Test nested footnote in invisible definitions.
- (org-test-with-temp-text "Text[1]\n\n[1] B [2]\n\n[2] C."
- ;; Hide definitions.
- (narrow-to-region (point) (point-at-eol))
- (let* ((tree (org-element-parse-buffer))
- (info (org-combine-plists
- (org-export-initial-options) '(:with-footnotes t))))
- (setq info (org-combine-plists
- info (org-export-collect-tree-properties tree info 'test)))
- ;; Both footnotes should be seen.
- (should
- (= (length (org-export-collect-footnote-definitions tree info)) 2))))
- ;; 4. Test footnotes definitions collection.
- (org-test-with-temp-text "Text[fn:1:A[fn:2]] [fn:3].
-
-\[fn:2] B [fn:3] [fn::D].
-
-\[fn:3] C."
- (let ((tree (org-element-parse-buffer))
- (info (org-combine-plists
- (org-export-initial-options) '(:with-footnotes t))))
- (setq info (org-combine-plists
- info (org-export-collect-tree-properties tree info 'test)))
- (should (= (length (org-export-collect-footnote-definitions tree info))
- 4))))))
-
-
-
-;;; Links
-
-(ert-deftest test-org-export/fuzzy-links ()
- "Test fuzz link export specifications."
- ;; 1. Links to invisible (keyword) targets should be ignored.
- (org-test-with-temp-text
- "Paragraph.\n#+TARGET: Test\n[[Test]]"
- (let* ((tree (org-element-parse-buffer))
- (info (org-combine-plists (org-export-initial-options))))
- (setq info (org-combine-plists
- info (org-export-collect-tree-properties tree info 'test)))
- (should-not
- (org-element-map
- tree 'link
- (lambda (link)
- (org-export-get-ordinal
- (org-export-resolve-fuzzy-link link info) info)) info))))
- ;; 2. Link to an headline should return headline's number.
- (org-test-with-temp-text
- "Paragraph.\n* Head1\n* Head2\n* Head3\n[[Head2]]"
- (let* ((tree (org-element-parse-buffer))
- (info (org-combine-plists (org-export-initial-options))))
- (setq info (org-combine-plists
- info (org-export-collect-tree-properties tree info 'test)))
- (should
- ;; Note: Headline's number is in fact a list of numbers.
- (equal '(2)
- (org-element-map
- tree 'link
- (lambda (link)
- (org-export-get-ordinal
- (org-export-resolve-fuzzy-link link info) info)) info t)))))
- ;; 3. Link to a target in an item should return item's number.
- (org-test-with-temp-text
- "- Item1\n - Item11\n - <>Item12\n- Item2\n\n\n[[test]]"
- (let* ((tree (org-element-parse-buffer))
- (info (org-combine-plists (org-export-initial-options))))
- (setq info (org-combine-plists
- info (org-export-collect-tree-properties tree info 'test)))
- (should
- ;; Note: Item's number is in fact a list of numbers.
- (equal '(1 2)
- (org-element-map
- tree 'link
- (lambda (link)
- (org-export-get-ordinal
- (org-export-resolve-fuzzy-link link info) info)) info t)))))
- ;; 4. Link to a target in a footnote should return footnote's
- ;; number.
- (org-test-with-temp-text
- "Paragraph[1][2][fn:lbl3:C<>][[test]][[target]]\n[1] A\n\n[2] <>B"
- (let* ((tree (org-element-parse-buffer))
- (info (org-combine-plists (org-export-initial-options))))
- (setq info (org-combine-plists
- info (org-export-collect-tree-properties tree info 'test)))
- (should
- (equal '(2 3)
- (org-element-map
- tree 'link
- (lambda (link)
- (org-export-get-ordinal
- (org-export-resolve-fuzzy-link link info) info)) info)))))
- ;; 5. Link to a named element should return sequence number of that
- ;; element.
- (org-test-with-temp-text
- "#+NAME: tbl1\n|1|2|\n#+NAME: tbl2\n|3|4|\n#+NAME: tbl3\n|5|6|\n[[tbl2]]"
- (let* ((tree (org-element-parse-buffer))
- (info (org-combine-plists (org-export-initial-options))))
- (setq info (org-combine-plists
- info (org-export-collect-tree-properties tree info 'test)))
- (should
- (= 2
- (org-element-map
- tree 'link
- (lambda (link)
- (org-export-get-ordinal
- (org-export-resolve-fuzzy-link link info) info)) info t)))))
- ;; 6. Link to a target not within an item, a table, a footnote
- ;; reference or definition should return section number.
- (org-test-with-temp-text
- "* Head1\n* Head2\nParagraph<>\n* Head3\n[[target]]"
- (let* ((tree (org-element-parse-buffer))
- (info (org-combine-plists (org-export-initial-options))))
- (setq info (org-combine-plists
- info (org-export-collect-tree-properties tree info 'test)))
- (should
- (equal '(2)
- (org-element-map
- tree 'link
- (lambda (link)
- (org-export-get-ordinal
- (org-export-resolve-fuzzy-link link info) info)) info t))))))
-
-(defun test-org-export/resolve-coderef ()
- "Test `org-export-resolve-coderef' specifications."
- (let ((org-coderef-label-format "(ref:%s)"))
- ;; 1. A link to a "-n -k -r" block returns line number.
- (org-test-with-temp-text
- "#+BEGIN_EXAMPLE -n -k -r\nText (ref:coderef)\n#+END_EXAMPLE"
- (let ((tree (org-element-parse-buffer)))
- (should
- (= (org-export-resolve-coderef "coderef" `(:parse-tree ,tree)) 1))))
- (org-test-with-temp-text
- "#+BEGIN_SRC emacs-lisp -n -k -r\n(+ 1 1) (ref:coderef)\n#+END_SRC"
- (let ((tree (org-element-parse-buffer)))
- (should
- (= (org-export-resolve-coderef "coderef" `(:parse-tree ,tree)) 1))))
- ;; 2. A link to a "-n -r" block returns line number.
- (org-test-with-temp-text
- "#+BEGIN_EXAMPLE -n -r\nText (ref:coderef)\n#+END_EXAMPLE"
- (let ((tree (org-element-parse-buffer)))
- (should
- (= (org-export-resolve-coderef "coderef" `(:parse-tree ,tree)) 1))))
- (org-test-with-temp-text
- "#+BEGIN_SRC emacs-lisp -n -r\n(+ 1 1) (ref:coderef)\n#+END_SRC"
- (let ((tree (org-element-parse-buffer)))
- (should
- (= (org-export-resolve-coderef "coderef" `(:parse-tree ,tree)) 1))))
- ;; 3. A link to a "-n" block returns coderef.
- (org-test-with-temp-text
- "#+BEGIN_SRC emacs-lisp -n\n(+ 1 1) (ref:coderef)\n#+END_SRC"
- (let ((tree (org-element-parse-buffer)))
- (should
- (equal (org-export-resolve-coderef "coderef" `(:parse-tree ,tree))
- "coderef"))))
- (org-test-with-temp-text
- "#+BEGIN_EXAMPLE -n\nText (ref:coderef)\n#+END_EXAMPLE"
- (let ((tree (org-element-parse-buffer)))
- (should
- (equal (org-export-resolve-coderef "coderef" `(:parse-tree ,tree))
- "coderef"))))
- ;; 4. A link to a "-r" block returns line number.
- (org-test-with-temp-text
- "#+BEGIN_SRC emacs-lisp -r\n(+ 1 1) (ref:coderef)\n#+END_SRC"
- (let ((tree (org-element-parse-buffer)))
- (should
- (= (org-export-resolve-coderef "coderef" `(:parse-tree ,tree)) 1))))
- (org-test-with-temp-text
- "#+BEGIN_EXAMPLE -r\nText (ref:coderef)\n#+END_EXAMPLE"
- (let ((tree (org-element-parse-buffer)))
- (should
- (= (org-export-resolve-coderef "coderef" `(:parse-tree ,tree)) 1))))
- ;; 5. A link to a block without a switch returns coderef.
- (org-test-with-temp-text
- "#+BEGIN_SRC emacs-lisp\n(+ 1 1) (ref:coderef)\n#+END_SRC"
- (let ((tree (org-element-parse-buffer)))
- (should
- (equal (org-export-resolve-coderef "coderef" `(:parse-tree ,tree))
- "coderef"))))
- (org-test-with-temp-text
- "#+BEGIN_EXAMPLE\nText (ref:coderef)\n#+END_EXAMPLE"
- (let ((tree (org-element-parse-buffer)))
- (should
- (equal (org-export-resolve-coderef "coderef" `(:parse-tree ,tree))
- "coderef"))))
- ;; 6. Correctly handle continued line numbers. A "+n" switch
- ;; should resume numbering from previous block with numbered
- ;; lines, ignoring blocks not numbering lines in the process.
- ;; A "-n" switch resets count.
- (org-test-with-temp-text "
-#+BEGIN_EXAMPLE -n
-Text.
-#+END_EXAMPLE
-
-#+BEGIN_SRC emacs-lisp
-\(- 1 1)
-#+END_SRC
-
-#+BEGIN_SRC emacs-lisp +n -r
-\(+ 1 1) (ref:addition)
-#+END_SRC
-
-#+BEGIN_EXAMPLE -n -r
-Another text. (ref:text)
-#+END_EXAMPLE"
- (let* ((tree (org-element-parse-buffer))
- (info `(:parse-tree ,tree)))
- (should (= (org-export-resolve-coderef "addition" info) 2))
- (should (= (org-export-resolve-coderef "text" info) 1))))
- ;; 7. Recognize coderef with user-specified syntax.
- (org-test-with-temp-text
- "#+BEGIN_EXAMPLE -l \"[ref:%s]\"\nText. [ref:text]\n#+END_EXAMPLE"
- (let ((tree (org-element-parse-buffer)))
- (should (equal (org-export-resolve-coderef "text" `(:parse-tree ,tree))
- "text"))))))
-
-
-
-;;; Src-block and example-block
-
-(ert-deftest test-org-export/unravel-code ()
- "Test `org-export-unravel-code' function."
- (let ((org-coderef-label-format "(ref:%s)"))
- ;; 1. Code without reference.
- (org-test-with-temp-text "#+BEGIN_EXAMPLE\n(+ 1 1)\n#+END_EXAMPLE"
- (should (equal (org-export-unravel-code (org-element-current-element))
- '("(+ 1 1)\n"))))
- ;; 2. Code with reference.
- (org-test-with-temp-text
- "#+BEGIN_EXAMPLE\n(+ 1 1) (ref:test)\n#+END_EXAMPLE"
- (should (equal (org-export-unravel-code (org-element-current-element))
- '("(+ 1 1)\n" (1 . "test")))))
- ;; 3. Code with user-defined reference.
- (org-test-with-temp-text
- "#+BEGIN_EXAMPLE -l \"[ref:%s]\"\n(+ 1 1) [ref:test]\n#+END_EXAMPLE"
- (should (equal (org-export-unravel-code (org-element-current-element))
- '("(+ 1 1)\n" (1 . "test")))))
- ;; 4. Code references keys are relative to the current block.
- (org-test-with-temp-text "
-#+BEGIN_EXAMPLE -n
-\(+ 1 1)
-#+END_EXAMPLE
-#+BEGIN_EXAMPLE +n
-\(+ 2 2)
-\(+ 3 3) (ref:one)
-#+END_EXAMPLE"
- (goto-line 5)
- (should (equal (org-export-unravel-code (org-element-current-element))
- '("(+ 2 2)\n(+ 3 3)\n" (2 . "one")))))
- ;; 5. Free up comma-protected lines.
- ;;
- ;; 5.1. In an Org source block, every line is protected.
- (org-test-with-temp-text
- "#+BEGIN_SRC org\n,* Test\n,# comment\n,Text\n#+END_SRC"
- (should (equal (org-export-unravel-code (org-element-current-element))
- '("* Test\n# comment\nText\n"))))
- ;; 5.2. In other blocks, only headlines, comments and keywords are
- ;; protected.
- (org-test-with-temp-text
- "#+BEGIN_EXAMPLE\n,* Headline\n, * Not headline\n,Keep\n#+END_EXAMPLE"
- (should (equal (org-export-unravel-code (org-element-current-element))
- '("* Headline\n, * Not headline\n,Keep\n"))))))
-
-
-
-(provide 'test-org-export)
-;;; test-org-export.el end here
--
1.7.9.2