Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Is there an emacs org-mode to dokuwiki converter? Is there an dokuwiki to emacs org-mode converter?

share|improve this question
up vote 3 down vote accepted

I was just looking for the same thing, found this question here, and also found a solution in the form of a Perl script on GitHub.

script

#!/opt/local/bin/perl
#
# Modified by @takaxp
# Last Update: 2012-01-09@22:13
# 2012-01-09: support date([YYYY-MM-DD XX]) insertion
# 2012-01-09: support #+BEGIN_SRC
# 2011-11-16: use strict and warnings
# 2011-11-16: Add conversion from numeric items to `  - '.
# 2011-11-16: Skip headers, if #+TITLE: is, use it as the top headline.
# 2011-11-17: Add DISQUS comment
# 2011-11-30: Add TODO/DONE color in items
# cat hoge.org | perl org2doku.pl > title.txt

# Usage
# 
#   cat <<EOF | ./org2doku
#   * heading
#   
#     - item
#       - sub item
#   
#   ** sub heading
#   EOF           
#   ===== heading =====
#   
#     * item
#       * sub item
#   
#   ==== sub heading ====
#
# Todo
#
#   * font style
# 
# Copyright
#
#   Copyright (c) 2011 Takumi KINJO
#
# License
#
#   The MIT License. See http://www.opensource.org/licenses/mit-license.php
#

use strict;
use warnings;

sub next_item_level {
    my ($len, $level, $last_item_indents) = @_;
    my $index = $#$last_item_indents;
    if ($index >= 0) {
        if ($len == $$last_item_indents[$index]) {
            return $level;
        } else {
            for (my $i = $index; $i >= 0; $i--) {
                my $last_item_indent = $$last_item_indents[$i];
                if ($len > $last_item_indent) {
                    push @$last_item_indents, $len;
                    return $level + 1;
                } elsif ($len == $last_item_indent) {
                    return $level - ($index - $i);
                }
                pop @$last_item_indents;
            }
            return $level;
        }
    } else {
        push @$last_item_indents, $len;
        return $level + 1;
    }
}

sub doku_link {
    my $org_hlink = shift;
    while ($org_hlink =~ s/\[\[(.*?)\]\[(.*?)\]\]/[[$1|$2]]/g) {}
    return $org_hlink;
}

sub shallowest_indent {
    my $last_item_indents = shift;
    my $shallowest_indent = 128;
    foreach my $code_line (@$last_item_indents) {
        if ($code_line =~ /^(\s+).*/) {
            my $len = length($1);
            if ($len < $shallowest_indent) {
                $shallowest_indent = $len;
            }
        } else {
            $shallowest_indent = 0;
        }
    }
    return $shallowest_indent;
}

sub disqus_comment {
    my $title_of_document = shift;
    if($title_of_document){
    print "===== Comments =====\n";
    }else{
    print "====== Comments ======\n";
    }
    print "~~DISQUS~~\n";
}

# Replace TODO in items with colored TODO
sub replace_todo_color {
    my $line = shift;
    $$line =~
    s/TODO/<html><span style="color: red">TODO<\/span><\/html>/;
    $$line =~
    s/DONE/<html><span style="color: ForestGreen">DONE<\/span><\/html>/;
}

my $is_code_block = 0;
my $is_published = 1;
my $is_table = 0;
my $current_block_type = "";
my $item_level = 0;
my $last_head_indent = 0;
my @code_block_buf = ();
my @last_item_indents = ();
my $title_of_document = "";
while (<>) {
    chomp;
    my $line = $_;

    # skip headers
    if($line =~ /^#\+([^\s]+):\s*(.+)/){
    if($1 eq "TITLE"){
        $title_of_document = $2;
        print "====== ".$title_of_document." ======\n";
    }
    next;
    }

    # Replace TAB at the head of lines
    $line =~ s/^\t/<html>&nbsp;&nbsp;&nbsp;&nbsp;<\/html>/;

    if($line =~ /^\[\d\d\d\d-\d\d-\d\d/){
    $line =
        "<html><span style=\"color: #666666\">Date: ".$line."<\/span><\/html>\n";
    }

    # use github style
    $line =~ s/\=(.+?)\=/<html><span style=\"margin:0 2px;padding:2px 5px;white-space:nowrap;border:1px solid #ccc;background-color:#f8f8f8;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\">$1<\/span><\/html>/g;

  retry:
    if ($is_published) {
        if (/^=\ (.*)/) {
            # howm header
            $line = $1;
            $line =~ s/<<<//g;
            $line =~ s/^/====== /g;
            $line =~ s/$/ ======/g;
            $item_level = 0;
            @last_item_indents = ();

        } elsif (/^(\*+)\ (.*)/) {
            # org heading
            $last_head_indent = length($1);
            if ($2 =~ /^!/) {
                $is_published = 0;
                next;
            }
        my $max_headline = 6;
        if($title_of_document eq ""){
        $max_headline = 7;
        }
        my $doku_heading = ("=" x ($max_headline - length($1)));
            $line = $doku_heading." $2 ".$doku_heading;
            $item_level = 0;
            @last_item_indents = ();

        } elsif (/^(\s+)[-+*]\ (.*)/) {
            # org item
            $item_level =
        &next_item_level(length($1), $item_level, \@last_item_indents);
        my $content = $2;
        &replace_todo_color(\$content);
            $line = ("  " x $item_level)."* ".$content;

        } elsif (/^\s*(\d+)\.\s*(.+)$/) {
        # numerical item
        $line = "  - ".$2;
            $item_level = 0;
            @last_item_indents = ();

    } elsif (/^#\+begin_src\s(.+)$|#\+begin_example(.*)/i) {
        my $lang = $1;
        my $option = "";
        if($lang =~ /(.+?)\s(.+)$/){
        $lang = $1;
        $option = $2;
        }
        if($lang eq "emacs-lisp"){
        $current_block_type = "lisp";
        }else{
        $current_block_type = $lang;
        }
            # org code block begin
            $item_level = 0;
            @last_item_indents = ();
            $is_code_block = 1;
            next;

        } elsif (/^#\+end_src|^#\+end_example/i) {
            # org code block end
            $item_level = 0;
            @last_item_indents = ();
            $is_code_block = 0;
            print "<code ".$current_block_type.">\n";
            my $shallowest_indent = &shallowest_indent(\@code_block_buf);
            foreach my $line (@code_block_buf) {
                my $regex = "\ " x $shallowest_indent;
                $line =~ s/^$regex//g;
                $line =~ s/^,\*/*/g;
                print $line."\n";
            }
            print "</code>\n";
            @code_block_buf = ();
            next;

        } else {
            # paragraph
            if (!$is_code_block) {
                if ($line =~ /(.*?)\ \*([^\s]+)\*\ (.*)/) {
                    # bold
                    $line = $1." **".$2."** ".$3;
                }
                if ($line =~ /(.*?)\ _([^\s]+)_\ (.*)/) {
                    # under line
                    $line = $1." __".$2."__ ".$3;
                }

        # table
        if($line =~ /[^\|]*\|--/){
            $line = "";
            chomp($line);
        }elsif($line =~ /[^\|]*|/){
            $line =~ s/\|/\^/g;
        }else{
            $line = "?";
        }

            }
            $line =~ s/^\s+//g;
            if ($line) {
                $item_level = 0;
                @last_item_indents = ();
            }
        }

        if ($is_code_block) {
            push @code_block_buf, $_;
        } else {
            print &doku_link($line)."\n";
        }

    } else {
        if (/^(\*+)\ (.*)/) {
            my $head_indent = length($1);
            if (!($2 =~ /^!/)) {
                if ($head_indent <= $last_head_indent) {
                    $is_published = 1;
                    goto retry;
                }
            }
        }
    }
}

&disqus_comment($title_of_document);
1;

I've tried converting a short Org document and it went well.

share|improve this answer
    
That script handles only bold and underline and one per line. You cannot have them first or last on the line. – McNisse Jan 19 '15 at 15:55

I needed the same and have put together export backend, for org-mode 8.0 and above https://github.com/w-vi/ox-wk.el , it's not 100% ready yet but major stuff should work.

share|improve this answer

The generic exporter could be easily configured to export to dokuwiki. But I can't answer the "back" question. Very little converts to org at this point.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.