paul@20 | 1 | Introduction
|
paul@143 | 2 | ============
|
paul@20 | 3 |
|
paul@20 | 4 | ConfluenceConverter is a distribution of software that converts exported data
|
paul@100 | 5 | from Confluence wiki instances, provided in the form of an XML file, to a
|
paul@100 | 6 | collection of wiki pages and resources that can be imported into a MoinMoin
|
paul@20 | 7 | instance as a page package.
|
paul@20 | 8 |
|
paul@127 | 9 | Migration Activities
|
paul@127 | 10 | --------------------
|
paul@127 | 11 |
|
paul@127 | 12 | The following activities are involved in a migration from Confluence to
|
paul@138 | 13 | MoinMoin. First, the activities that can be performed from any location:
|
paul@127 | 14 |
|
paul@127 | 15 | * Export of Confluence content
|
paul@127 | 16 | * Conversion of Confluence content to MoinMoin content
|
paul@127 | 17 | * Confluence page identifier extraction and mapping to MoinMoin identifiers
|
paul@127 | 18 | * Acquisition of Confluence user profile details
|
paul@138 | 19 |
|
paul@138 | 20 | Then, the activities that are performed on the server:
|
paul@138 | 21 |
|
paul@127 | 22 | * Installation of MoinMoin
|
paul@127 | 23 | * Initialisation of a MoinMoin wiki instance
|
paul@127 | 24 | * Import of MoinMoin content into the new wiki instance
|
paul@127 | 25 | * Installation of MoinMoin extensions
|
paul@127 | 26 | * Initialisation of user profiles in MoinMoin
|
paul@127 | 27 | * Installation of scripts and identifier mappings
|
paul@127 | 28 | * Filesystem permission adjustments
|
paul@127 | 29 |
|
paul@143 | 30 |
|
paul@143 | 31 |
|
paul@20 | 32 | Prerequisites
|
paul@143 | 33 | =============
|
paul@20 | 34 |
|
paul@20 | 35 | ConfluenceConverter requires a library called xmlread that can be found at the
|
paul@20 | 36 | following location:
|
paul@20 | 37 |
|
paul@20 | 38 | http://hgweb.boddie.org.uk/xmlread
|
paul@20 | 39 |
|
paul@20 | 40 | The xmlread.py file from the xmlread distribution can be copied into the
|
paul@20 | 41 | ConfluenceConverter directory.
|
paul@20 | 42 |
|
paul@40 | 43 | ConfluenceConverter also requires access to the MoinMoin.wikiutil module found
|
paul@143 | 44 | in the MoinMoin distribution. Setting the PYTHONPATH environment variable to
|
paul@143 | 45 | the location of the MoinMoin package should be sufficient for access to this
|
paul@143 | 46 | module.
|
paul@40 | 47 |
|
paul@20 | 48 | The moinsetup program is highly recommended for the installation of page
|
paul@100 | 49 | packages and the management of MoinMoin wiki instances:
|
paul@20 | 50 |
|
paul@20 | 51 | http://moinmo.in/ScriptMarket/moinsetup
|
paul@20 | 52 |
|
paul@20 | 53 | If moinsetup is not being used, the page package installer documentation
|
paul@20 | 54 | should be consulted:
|
paul@20 | 55 |
|
paul@20 | 56 | http://moinmo.in/HelpOnPackageInstaller
|
paul@20 | 57 |
|
paul@106 | 58 | To read Confluence user profiles on live Confluence sites using the
|
paul@106 | 59 | get_profiles.py program, the libxml2dom library is required:
|
paul@106 | 60 |
|
paul@106 | 61 | http://hgweb.boddie.org.uk/libxml2dom
|
paul@106 | 62 |
|
paul@100 | 63 | MoinMoin Prerequisites
|
paul@100 | 64 | ----------------------
|
paul@100 | 65 |
|
paul@123 | 66 | The page package installer does not preserve user information or the last
|
paul@123 | 67 | modified time when installing page revisions. This can be modified by applying
|
paul@123 | 68 | a patch to MoinMoin as follows while at the top level of the MoinMoin source
|
paul@123 | 69 | distribution:
|
paul@100 | 70 |
|
paul@100 | 71 | patch -p1 $CCDIR/patches/patch-moin-1.9-MoinMoin-packages.diff
|
paul@100 | 72 |
|
paul@100 | 73 | Here, CCDIR is the path to the top level of this source distribution where
|
paul@100 | 74 | this README.txt file is found.
|
paul@100 | 75 |
|
paul@133 | 76 | When importing users, MoinMoin may be unable to handle user information
|
paul@133 | 77 | containing non-ASCII characters. Another patch to solve such problems can be
|
paul@133 | 78 | applied to MoinMoin as follows:
|
paul@133 | 79 |
|
paul@133 | 80 | patch -p1 $CCDIR/patches/patch-moin-1.9-MoinMoin-user.diff
|
paul@133 | 81 |
|
paul@49 | 82 | Wiki Content Prerequisites
|
paul@49 | 83 | --------------------------
|
paul@49 | 84 |
|
paul@49 | 85 | For the output of the converter, the following MoinMoin extensions are
|
paul@49 | 86 | required:
|
paul@49 | 87 |
|
paul@49 | 88 | http://moinmo.in/ParserMarket/ImprovedTableParser
|
paul@133 | 89 | http://moinmo.in/ActionMarket/SubpageComments
|
paul@79 | 90 | http://moinmo.in/MacroMarket/Color2
|
paul@49 | 91 |
|
paul@133 | 92 | A common dependency of various extensions is provided by MoinSupport:
|
paul@108 | 93 |
|
paul@133 | 94 | http://hgweb.boddie.org.uk/MoinSupport
|
paul@108 | 95 |
|
paul@143 | 96 |
|
paul@143 | 97 |
|
paul@118 | 98 | Additional Software
|
paul@143 | 99 | ===================
|
paul@118 | 100 |
|
paul@118 | 101 | PDF export support requires the ExportPDF action:
|
paul@118 | 102 |
|
paul@118 | 103 | http://moinmo.in/ActionMarket/ExportPDF
|
paul@118 | 104 |
|
paul@118 | 105 | This in turn requires Apache FOP for PDF production using XSL-FO:
|
paul@118 | 106 |
|
paul@118 | 107 | http://xmlgraphics.apache.org/fop/
|
paul@118 | 108 |
|
paul@118 | 109 | (On Debian systems, the fop package provides this tool.)
|
paul@118 | 110 |
|
paul@118 | 111 | To produce XSL-FO from DocBook output, xsltproc is required from the libxslt
|
paul@118 | 112 | distribution:
|
paul@118 | 113 |
|
paul@118 | 114 | http://xmlsoft.org/XSLT/
|
paul@118 | 115 |
|
paul@118 | 116 | (On Debian systems, the xsltproc package provides this tool.)
|
paul@118 | 117 |
|
paul@118 | 118 | And DocBook output requires the DocBook resources to be installed, described
|
paul@118 | 119 | in the following guide:
|
paul@118 | 120 |
|
paul@118 | 121 | http://www.sagehill.net/docbookxsl/ToolsSetup.html
|
paul@118 | 122 |
|
paul@118 | 123 | (On Debian systems, the docbook-xsl package provides these resources.)
|
paul@118 | 124 |
|
paul@143 | 125 |
|
paul@143 | 126 |
|
paul@20 | 127 | Quick Start
|
paul@143 | 128 | ===========
|
paul@20 | 129 |
|
paul@138 | 130 | (!) The acquisition of Confluence wiki content and its conversion can be
|
paul@138 | 131 | performed from any location, not necessarily on the server.
|
paul@138 | 132 |
|
paul@136 | 133 | To obtain XML export archives from a Confluence wiki instance, the
|
paul@136 | 134 | exportspacexml.action resource is visited and the "Export" button selected.
|
paul@136 | 135 | For example, for the Mailman Wiki, the appropriate resource (with the COM
|
paul@136 | 136 | namespace selected) is as follows:
|
paul@136 | 137 |
|
paul@136 | 138 | http://wiki.list.org/spaces/exportspacexml.action?key=COM
|
paul@136 | 139 |
|
paul@136 | 140 | For your own instance, adjust the above URL accordingly. Alternatively, you
|
paul@136 | 141 | can find your way to the export page by selecting a namespace, then choosing
|
paul@136 | 142 | "Advanced" from the "Browse" menu, and then choosing "XML Export" from the
|
paul@136 | 143 | "Export" sidebar.
|
paul@136 | 144 |
|
paul@100 | 145 | Given an XML export archive file for a Confluence wiki instance (in the
|
paul@100 | 146 | example below, the file is called COM-123456-789012.zip), the following
|
paul@100 | 147 | command can be used to prepare a page package for MoinMoin:
|
paul@20 | 148 |
|
paul@100 | 149 | python convert.py COM-123456-789012.zip COM
|
paul@20 | 150 |
|
paul@20 | 151 | In addition to the filename, a workspace name is required. Confluence appears
|
paul@20 | 152 | to require a workspace as a container for collections of pages, but this also
|
paul@100 | 153 | permits us to selectively import parts of a wiki into MoinMoin. If attachments
|
paul@100 | 154 | were included in the export from Confluence, these will be imported into the
|
paul@100 | 155 | page package.
|
paul@20 | 156 |
|
paul@20 | 157 | The result of the above command will be a directory having the same name as
|
paul@20 | 158 | the chosen workspace, together with a zip archive for that directory's
|
paul@20 | 159 | contents. Thus, the above command would produce a directory called COM and an
|
paul@20 | 160 | archive called COM.zip.
|
paul@20 | 161 |
|
paul@138 | 162 | (!) The following step is performed on the server.
|
paul@138 | 163 |
|
paul@136 | 164 | To import the result (although you may wish to process other namespaces
|
paul@136 | 165 | first), use moinsetup as follows:
|
paul@20 | 166 |
|
paul@20 | 167 | python moinsetup.py -m install_page_package COM.zip
|
paul@20 | 168 |
|
paul@20 | 169 | This requires a suitable moinsetup.cfg file in the working directory.
|
paul@20 | 170 |
|
paul@136 | 171 | Importing Many Workspaces/Namespaces
|
paul@136 | 172 | ------------------------------------
|
paul@123 | 173 |
|
paul@123 | 174 | Where more than one namespace is to be imported, the page packages should be
|
paul@123 | 175 | merged so that the resulting history information is ordered correctly.
|
paul@123 | 176 |
|
paul@138 | 177 | (!) This process can be performed from any location and the result uploaded to
|
paul@138 | 178 | the server for eventual import.
|
paul@138 | 179 |
|
paul@123 | 180 | To merge packages, use a command of the following form:
|
paul@123 | 181 |
|
paul@123 | 182 | python merge.py OUT COM.zip DEV.zip DOC.zip SEC.zip
|
paul@123 | 183 |
|
paul@123 | 184 | A directory called OUT and a page package called OUT.zip will be produced. The
|
paul@123 | 185 | latter can then be imported into MoinMoin as described above.
|
paul@123 | 186 |
|
paul@100 | 187 | Mappings from Identifiers to Pages
|
paul@100 | 188 | ----------------------------------
|
paul@100 | 189 |
|
paul@100 | 190 | Confluence uses numbers to label content revisions, and links to Confluence
|
paul@100 | 191 | sites sometimes use these numbers instead of a readable page name. MoinMoin,
|
paul@100 | 192 | meanwhile, only uses page names and has no external numeric identifier scheme.
|
paul@100 | 193 | Consequently, it is necessary to produce a mapping from Confluence identifiers
|
paul@100 | 194 | to MoinMoin page names. In addition to numeric identifiers, Confluence also
|
paul@100 | 195 | provides "tiny URLs" which are an alphanumeric encoding of the numeric
|
paul@100 | 196 | identifiers.
|
paul@100 | 197 |
|
paul@138 | 198 | (!) This process can be performed with the converted content from any
|
paul@138 | 199 | location, with the generated files uploaded to the server for eventual
|
paul@138 | 200 | deployment.
|
paul@138 | 201 |
|
paul@100 | 202 | To generate mappings for the Confluence content, use the mappings script as
|
paul@100 | 203 | follows:
|
paul@100 | 204 |
|
paul@103 | 205 | tools/mappings.sh COM
|
paul@100 | 206 |
|
paul@100 | 207 | Here, COM is a directory name containing converted Confluence content,
|
paul@100 | 208 | corresponding to a space name in the original Confluence wiki. More than one
|
paul@138 | 209 | space name can be used to generate a complete mapping for a site. For example:
|
paul@138 | 210 |
|
paul@138 | 211 | tools/mappings.sh COM DEV DOC SEC
|
paul@100 | 212 |
|
paul@100 | 213 | The following files are generated:
|
paul@100 | 214 |
|
paul@100 | 215 | * mapping-id-to-page.txt
|
paul@100 | 216 | * mapping-tiny-to-id.txt
|
paul@100 | 217 | * mapping-tiny-to-page.txt
|
paul@100 | 218 |
|
paul@100 | 219 | The most useful of these is the first as it includes all the necessary
|
paul@100 | 220 | information provided by the arbitrary mapping from identifiers to page names.
|
paul@100 | 221 | The second mapping merely converts the "tiny URLs" to identifiers, which can
|
paul@100 | 222 | be done by applying an algorithm without any external knowledge of the wiki
|
paul@100 | 223 | structure. The third mapping is provided as a convenience, combining the "tiny
|
paul@100 | 224 | URL" conversion and the arbitrary mapping to page names.
|
paul@100 | 225 |
|
paul@102 | 226 | Translating Requests Using the Mappings
|
paul@102 | 227 | ---------------------------------------
|
paul@102 | 228 |
|
paul@100 | 229 | Where Web server facilities such as RewriteMap are available for use, the
|
paul@100 | 230 | first and third mapping files can be used directly. See the Apache
|
paul@100 | 231 | documentation for details of RewriteMap:
|
paul@100 | 232 |
|
paul@100 | 233 | http://httpd.apache.org/docs/2.4/rewrite/rewritemap.html
|
paul@100 | 234 |
|
paul@100 | 235 | Otherwise, it is more likely that the first file is used by a program that can
|
paul@100 | 236 | perform a redirect to the appropriate wiki page, and the "tiny URL" decoding
|
paul@100 | 237 | is also done by this program when deployed in a suitable location to receive
|
paul@102 | 238 | such requests. To support this, the following resources are provided:
|
paul@102 | 239 |
|
paul@102 | 240 | * scripts/redirect.py
|
paul@102 | 241 | * config/mailmanwiki-redirect
|
paul@102 | 242 |
|
paul@102 | 243 | The latter configuration file should be combined with the Web server
|
paul@102 | 244 | configuration file such that the appropriate aliases are able to capture
|
paul@102 | 245 | requests and invoke the redirect.py script before the main wiki aliases are
|
paul@102 | 246 | consulted. The script itself should be placed in a suitable filesystem
|
paul@102 | 247 | location, and the mapping-id-to-page.txt file should be placed alongside it,
|
paul@102 | 248 | or it should be placed in a different location and the MAPPING_ID_TO_PAGE
|
paul@102 | 249 | variable changed in the script to refer to this different location.
|
paul@100 | 250 |
|
paul@113 | 251 | Supporting Confluence Action URLs
|
paul@113 | 252 | ---------------------------------
|
paul@113 | 253 |
|
paul@113 | 254 | Besides the "viewpage" action mapping identifiers to pages (covered by the
|
paul@113 | 255 | mapping described above), some other action URLs may be used in wiki content
|
paul@113 | 256 | and must either be translated or supported using redirects. Since external
|
paul@113 | 257 | sites may also employ such actions, a redirect strategy perhaps makes more
|
paul@113 | 258 | sense. To support this, the following resources are involved:
|
paul@113 | 259 |
|
paul@114 | 260 | * scripts/dashboard.py
|
paul@118 | 261 | * scripts/redirect.py
|
paul@113 | 262 | * scripts/search.py
|
paul@113 | 263 | * config/mailmanwiki-redirect
|
paul@113 | 264 |
|
paul@113 | 265 | The latter configuration file is also involved in identifier-to-page mapping,
|
paul@118 | 266 | but in this case it causes requests to the "dashboard", "doexportpage" and
|
paul@118 | 267 | "dosearchsite" actions to be directed to the dashboard.py, redirect.py and
|
paul@118 | 268 | search.py scripts respectively.
|
paul@114 | 269 |
|
paul@114 | 270 | The dashboard.py script merely redirects requests to the root of the site,
|
paul@114 | 271 | thus assuming that the front page is configured to show dashboard-like
|
paul@114 | 272 | information.
|
paul@114 | 273 |
|
paul@118 | 274 | The redirect.py script, apart from supporting identifier-to-page redirects,
|
paul@139 | 275 | also supports attachment downloads and PDF page exports, since both kinds of
|
paul@139 | 276 | resource employ identifiers to indicate which page is involved. In an
|
paul@139 | 277 | environment that uses .htaccess and mod_rewrite, the redirect.py script should
|
paul@139 | 278 | also be deployed under separate names (such as export.py and exportpdf.py) so
|
paul@139 | 279 | that it can discover whether it should be exporting a page instead of just
|
paul@139 | 280 | showing it.
|
paul@118 | 281 |
|
paul@114 | 282 | The search.py script redirects search requests in a suitable form to the
|
paul@114 | 283 | MoinMoin "fullsearch" action.
|
paul@113 | 284 |
|
paul@104 | 285 | Identifying and Migrating Users
|
paul@104 | 286 | -------------------------------
|
paul@104 | 287 |
|
paul@104 | 288 | Confluence export archives do not contain user profile information, but page
|
paul@104 | 289 | versions are marked with user identifiers. Therefore, a list of user
|
paul@104 | 290 | identifiers can be obtained by running a script extracting these identifiers.
|
paul@104 | 291 | The following command writes to standard output the users involved with
|
paul@104 | 292 | editing the wiki in four different spaces (exported to four directories):
|
paul@104 | 293 |
|
paul@104 | 294 | tools/users.sh COM DEV DOC SEC
|
paul@104 | 295 |
|
paul@105 | 296 | This output can be edited and then passed to a program which fetches other
|
paul@105 | 297 | profile details as follows:
|
paul@104 | 298 |
|
paul@138 | 299 | tools/users.sh COM DEV DOC SEC > users.txt
|
paul@138 | 300 |
|
paul@138 | 301 | After editing...
|
paul@138 | 302 |
|
paul@138 | 303 | cat users.txt \
|
paul@138 | 304 | | tools/get_profiles.py http://wiki.list.org/ \
|
paul@138 | 305 | > profiles.txt
|
paul@104 | 306 |
|
paul@104 | 307 | If no users are to be removed in migration, the following command could be
|
paul@104 | 308 | issued:
|
paul@104 | 309 |
|
paul@138 | 310 | tools/users.sh COM DEV DOC SEC \
|
paul@138 | 311 | | tools/get_profiles.py http://wiki.list.org/ \
|
paul@138 | 312 | > profiles.txt
|
paul@105 | 313 |
|
paul@105 | 314 | The get_profiles.py program needs to be told the URL of the original
|
paul@105 | 315 | Confluence site. Note that it accesses the site at a default rate of around
|
paul@105 | 316 | one request per second; a different delay between requests can be specified
|
paul@105 | 317 | using an additional argument.
|
paul@105 | 318 |
|
paul@138 | 319 | (!) The above steps can be performed from any location, but the command
|
paul@138 | 320 | pipelines below need to be run on the server due to the use of a program that
|
paul@138 | 321 | updates the deployed wiki.
|
paul@138 | 322 |
|
paul@105 | 323 | The output of the get_profiles.py program can be passed to another program
|
paul@105 | 324 | which adds users to MoinMoin, and so the following commands can be used:
|
paul@105 | 325 |
|
paul@138 | 326 | cat profiles.txt \
|
paul@138 | 327 | | tools/addusers.py wiki
|
paul@138 | 328 |
|
paul@138 | 329 | Alternatively, the users can be converted to profiles and immediately added
|
paul@138 | 330 | without creating a profiles file:
|
paul@138 | 331 |
|
paul@105 | 332 | cat users.txt \
|
paul@105 | 333 | | tools/get_profiles.py http://wiki.list.org/ \
|
paul@105 | 334 | | tools/addusers.py wiki
|
paul@105 | 335 |
|
paul@138 | 336 | Or just using one single command without inspecting the users or profiles at
|
paul@138 | 337 | all:
|
paul@105 | 338 |
|
paul@105 | 339 | tools/users.sh COM DEV DOC SEC \
|
paul@105 | 340 | | tools/get_profiles.py http://wiki.list.org/ \
|
paul@105 | 341 | | tools/addusers.py wiki
|
paul@104 | 342 |
|
paul@104 | 343 | The addusers.py program needs to be told the directory containing the wiki
|
paul@105 | 344 | configuration.
|
paul@104 | 345 |
|
paul@30 | 346 | Output Structure
|
paul@30 | 347 | ----------------
|
paul@30 | 348 |
|
paul@30 | 349 | The structure of a converted workspace is a directory hierarchy containing the
|
paul@30 | 350 | following directories:
|
paul@30 | 351 |
|
paul@30 | 352 | * pages (a collection of directories defining each page or content item,
|
paul@30 | 353 | corresponding to Page, Comment and BlogPost elements in the XML
|
paul@30 | 354 | exported from Confluence)
|
paul@30 | 355 |
|
paul@30 | 356 | * versions (a collection of files, each defining a revision or version of
|
paul@30 | 357 | some content, corresponding to BodyContent elements in the XML
|
paul@30 | 358 | exported from Confluence)
|
paul@30 | 359 |
|
paul@30 | 360 | Each page directory contains the following things:
|
paul@30 | 361 |
|
paul@100 | 362 | * pagetype (either "Page", "Comment" or "BlogPost")
|
paul@100 | 363 |
|
paul@40 | 364 | * manifest (a list of version entries in a format similar to the MoinMoin
|
paul@40 | 365 | page package manifest format)
|
paul@30 | 366 |
|
paul@40 | 367 | * attachments (a list of attachment version entries in a format similar to
|
paul@40 | 368 | the MoinMoin page package manifest format)
|
paul@30 | 369 |
|
paul@40 | 370 | * pagetitle (an optional page title imposed on the page by another content
|
paul@40 | 371 | item)
|
paul@40 | 372 |
|
paul@40 | 373 | * children (a list of child page names defined for the page)
|
paul@30 | 374 |
|
paul@100 | 375 | * comments (a list of creation date plus comment page identifier pairs)
|
paul@100 | 376 |
|
paul@30 | 377 | In the output structure, content items such as comments are represented as
|
paul@30 | 378 | pages and each reference a content version. Since comments will ultimately be
|
paul@30 | 379 | represented as subpages of some parent page, they will have a pagetitle file
|
paul@30 | 380 | in their directory with an appropriate subpage name written according to the
|
paul@30 | 381 | parent page's name and comment details.
|
paul@30 | 382 |
|
paul@20 | 383 | Troubleshooting
|
paul@20 | 384 | ---------------
|
paul@20 | 385 |
|
paul@20 | 386 | The page package import activity in particular can be a source of problems.
|
paul@20 | 387 | Generally, any error occurring when attempting to import a package is likely
|
paul@20 | 388 | to be due to insufficient privileges when writing to the pages directory of a
|
paul@100 | 389 | wiki or to its edit-log file.
|
paul@20 | 390 |
|
paul@100 | 391 | The moinsetup software can generate scripts that set the ownership of wiki
|
paul@20 | 392 | files or apply ACLs (access control lists) to those files in order to make
|
paul@100 | 393 | access to wiki data more convenient. Where the ownership of the files must be
|
paul@20 | 394 | set (to www-data or nobody), the import step can be run as that user given
|
paul@20 | 395 | sufficient privileges. However, the easiest solution is to apply ACLs, thus
|
paul@100 | 396 | allowing the user who created the wiki to retain write access to it.
|
paul@20 | 397 |
|
paul@143 | 398 |
|
paul@143 | 399 |
|
paul@20 | 400 | Contact, Copyright and Licence Information
|
paul@143 | 401 | ==========================================
|
paul@20 | 402 |
|
paul@20 | 403 | The current Web page for ConfluenceConverter at the time of release is:
|
paul@20 | 404 |
|
paul@20 | 405 | http://hgweb.boddie.org.uk/ConfluenceConverter
|
paul@20 | 406 |
|
paul@20 | 407 | Copyright and licence information can be found in the docs directory - see
|
paul@20 | 408 | docs/COPYING.txt and docs/LICENCE.txt for more information.
|
paul@145 | 409 |
|
paul@145 | 410 |
|
paul@145 | 411 |
|
paul@145 | 412 | Resources
|
paul@145 | 413 | =========
|
paul@145 | 414 |
|
paul@145 | 415 | "Confluence Data Model"
|
paul@145 | 416 | https://confluence.atlassian.com/doc/confluence-data-model-127369837.html
|
paul@145 | 417 |
|
paul@145 | 418 | "Confluence Storage Format"
|
paul@145 | 419 | https://confluence.atlassian.com/doc/confluence-storage-format-790796544.html
|
paul@145 | 420 |
|
paul@145 | 421 | "Confluence Wiki Markup"
|
paul@145 | 422 | https://confluence.atlassian.com/doc/confluence-wiki-markup-251003035.html
|
paul@145 | 423 |
|
paul@145 | 424 | "Macros"
|
paul@145 | 425 | https://confluence.atlassian.com/doc/macros-139387.html
|