Changes for page Export To Markdown

Last modified by Tobias Wintrich on 2026/03/27 13:39

From version 3.1
edited by René Vögeli
on 2026/03/25 10:32
Change comment: There is no comment for this version
To version 7.1
edited by Tobias Wintrich
on 2026/03/27 13:39
Change comment: There is no comment for this version

Summary

Details

Page properties
Author
... ... @@ -1,1 +1,1 @@
1 -XWiki.rvoegeli
1 +XWiki.twintrich
Content
... ... @@ -1,20 +1,66 @@
1 1  {{groovy}}
2 -import org.xwiki.environment.*
3 -import org.xwiki.model.reference.*
2 +import org.xwiki.model.reference.EntityReferenceSerializer
3 +import java.io.File
4 4  
5 -if (request.confirm == '1') {
6 - services.query.xwql("select distinct doc.fullName from Document doc where doc.space like 'HowTos' or doc.space like 'HowTos.%'").execute().each() {
7 - print "* Converting ${it} to MD..."
8 - def itemDoc = xwiki.getDocument(it)
9 - def newContent = services.rendering.render(itemDoc.getXDOM(), 'markdown/1.2')
10 - def tmpDir = new File(services.component.getInstance(Environment.class).temporaryDirectory, 'md-export')
11 - def pathSerializer = services.component.getInstance(EntityReferenceSerializer.TYPE_STRING, 'fspath')
12 - def outputFile = new File(tmpDir, pathSerializer.serialize(itemDoc.documentReference))
5 +if (request.get('confirm') == '1') {
6 +
7 + // Zielverzeichnis
8 + def exportDir = new File("/usr/local/xwiki/data/md-export")
9 + exportDir.mkdirs()
10 +
11 + // Serializer für Ordnerstruktur
12 + def pathSerializer = services.component.getInstance(
13 + EntityReferenceSerializer.TYPE_STRING, "fspath"
14 + )
15 +
16 + // Query (einzeilig!)
17 + def query = "select doc.fullName from Document doc " +
18 + "where (doc.space like 'HowTos' or doc.space like 'HowTos.%') " +
19 + "and doc.hidden = false"
20 +
21 + def results = services.query.xwql(query).execute()
22 +
23 + for (fullName in results) {
24 +
25 + println("* Exporting " + fullName)
26 +
27 + def doc = xwiki.getDocument(fullName)
28 +
29 + if (doc.isHidden()) {
30 + continue
31 + }
32 +
33 + // Markdown erzeugen
34 + def markdown = services.rendering.render(doc.getXDOM(), "markdown/1.2")
35 +
36 + // Fix für XWiki Image Syntax ![[file|text]]
37 + markdown = markdown.replaceAll(
38 + /!\[\[([^|\]]+)\|([^\]]+)\]\]/,
39 + '![\$2](\$1)'
40 + )
41 +
42 + // Dateipfad erzeugen
43 + def relativePath = pathSerializer.serialize(doc.documentReference)
44 + def outputFile = new File(exportDir, relativePath + ".md")
45 +
13 13   outputFile.parentFile.mkdirs()
14 - outputFile << newContent
15 - println "Saved in ${outputFile.toString()}"
47 + outputFile.write(markdown, "UTF-8")
48 +
49 + println(" -> Saved page to " + outputFile)
50 +
51 + // Anhänge exportieren
52 + for (attachment in doc.getAttachmentList()) {
53 +
54 + def attachmentFile = new File(outputFile.parentFile, attachment.getFilename())
55 +
56 + attachmentFile.withOutputStream { os ->
57 + os << attachment.getContentInputStream()
58 + }
59 +
60 + println(" -> Exported attachment " + attachment.getFilename())
61 + }
16 16   }
17 17  }
18 18  
19 -println "[[Export>>||queryString='confirm=1']]"
65 +println("[[Export starten>>||queryString='confirm=1']]")
20 20  {{/groovy}}