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 5.1
edited by Tobias Wintrich
on 2026/03/27 13:28
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,62 @@
1 1  {{groovy}}
2 -import org.xwiki.environment.*
3 3  import org.xwiki.model.reference.*
3 +import org.xwiki.model.EntityType
4 +import java.io.File
4 4  
5 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))
7 +
8 + // Zielverzeichnis
9 + def exportDir = new File("/usr/local/xwiki/data/md-export")
10 + exportDir.mkdirs()
11 +
12 + // Serializer für saubere Ordnerstruktur
13 + def pathSerializer = services.component.getInstance(
14 + EntityReferenceSerializer.TYPE_STRING, 'fspath'
15 + )
16 +
17 + // Nur veröffentlichte Dokumente (hidden = false)
18 + def query = """
19 + select doc.fullName from Document doc
20 + where (doc.space like 'HowTos' or doc.space like 'HowTos.%')
21 + and doc.hidden = false
22 + """
23 +
24 + services.query.xwql(query).execute().each { fullName ->
25 +
26 + println "* Exporting ${fullName}..."
27 +
28 + def doc = xwiki.getDocument(fullName)
29 +
30 + if (doc.isHidden()) {
31 + return
32 + }
33 +
34 + // Markdown rendern
35 + def markdown = services.rendering.render(doc.getXDOM(), 'markdown/1.2')
36 +
37 + // Verzeichnisstruktur erzeugen
38 + def relativePath = pathSerializer.serialize(doc.documentReference)
39 + def outputFile = new File(exportDir, relativePath + ".md")
40 +
13 13   outputFile.parentFile.mkdirs()
14 - outputFile << newContent
15 - println "Saved in ${outputFile.toString()}"
42 + outputFile.text = markdown
43 +
44 + println " -> Saved page to ${outputFile}"
45 +
46 + // Anhänge exportieren
47 + doc.attachmentList.each { attachment ->
48 +
49 + def attachmentDir = outputFile.parentFile
50 + def attachmentFile = new File(attachmentDir, attachment.filename)
51 +
52 + attachmentFile.withOutputStream { os ->
53 + os << attachment.contentInputStream
54 + }
55 +
56 + println " -> Exported attachment ${attachment.filename}"
57 + }
16 16   }
17 17  }
18 18  
19 -println "[[Export>>||queryString='confirm=1']]"
61 +println "[[Export starten>>||queryString='confirm=1']]"
20 20  {{/groovy}}