emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orgmode] Blorgit > SVN integration


From: Francesco Pizzolante
Subject: Re: [Orgmode] Blorgit > SVN integration
Date: Thu, 19 Nov 2009 11:06:55 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (windows-nt)

Hi Eric,

First of all, I thank you very much for your useful tips.

Thanks to you, I think I've made a step forward. Here's how.


>> 1) Is it possible to integrate Blorgit with SVN instead of git? If yes, how
>>    can I do it?
>
> Yes, it should be possible to use any version control backend, the only
> command that will not work with svn is the option to automatically
> commit any edits to the git repository, however changing this command
> should be straightforward.  You should just have to make a change in
> backend/blog.rb line 15.

This is what I've added to blog.rb:

--8<---------------cut here---------------start------------->8---
diff --git a/backend/blog.rb b/backend/blog.rb
index 0f43728..827ec05 100644
--- a/backend/blog.rb
+++ b/backend/blog.rb
@@ -17,6 +17,20 @@ class Blog < ActiveFile::Base
     end
   end

+  # if the svn_commit option is set then add a hook to automatically
+  # commit any changes from the web interface to svn.
+  if $global_config[:config]['svn_commit']
+    puts "adding svn commit hooks Blog.after_save"
+
+    add_hooks(:save)
+
+    def after_save
+      Dir.chdir(Blog.base_directory) do
+        %x{svn add #{self.path} && svn ci -m "#{self.path} updated through the 
web interface" #{self.path}}
+      end
+    end
+  end
+
   def self.files(path)
     base = (File.directory?(self.expand(path)) ? self.expand(path) : 
File.dirname(self.expand(path)))
     self.entries(path).
--8<---------------cut here---------------end--------------->8---

You simply need to add the "svn_commit: true" options to the blorgit.yml
config file and make your blogs directory a SVN working copy for this to work.

I do a "svn add" (in case this is a new file) followed by an "svn commit".

This works very well.

One little question: is it possible to add a comment field when editing a file
through the web interface and use that comment as the log when checking in the
file in the repository?


>> 2) If I have comments in an org file, as soon as I edit the file through the
>>    web interface, the comments disappear (they're still present as * COMMENT
>>    lines in the org file though, but no longer displayed in the browser).
>>
>
> Hmm, not sure about that, are you sure that you are creating the comment
> outline headings exactly how they are created when blorgit adds them
> through the web interface?

Well, the comments were added by the web interface itself (the org file was
completely edited by the web interface) and were correctly displayed as soon
as you add them. But then, they disappeared once you edited the page. When
looking at the org file, the comments were still there but no longer displayed
through the web interface.

But, this issue went away from the moment I created a brand new blogs folder.
I cannot reproduce it. I don't have any more details about this for the
moment. I will come back to you with more details if needed. Thanks for your
help.


>> 3) I would like to add a .pdf link (next to edit .org .tex) in order to
>>    download the PDF coming from the compilation (pdflatex) of the .tex file.
>>    Is it possible?
>
> Yes, this should certainly be possible (and please let me know if you
> succeed and I would like to add that change to the main repo).  See line
> 70 in backend/acts_as_org/lib/acts_as_org.rb, it should be fairly
> straight forward to create a to_pdf command similar to the to_tex
> command defined therein.

Here's what I did for this.

First I added the .pdf link:

--8<---------------cut here---------------start------------->8---
diff --git a/blorgit.rb b/blorgit.rb
index 077b5d9..93bea47 100644
--- a/blorgit.rb
+++ b/blorgit.rb
@@ -197,6 +197,8 @@ __END__
         %a{ :href => path_for(@blog, :format => 'org'), :title => 'download as 
org-mode' } .org
       %li
         %a{ :href => path_for(@blog, :format => 'tex'), :title => 'download as 
LaTeX' } .tex
+      %li
+        %a{ :href => path_for(@blog, :format => 'pdf'), :title => 'download as 
PDF' } .pdf
 #title_separator

 @@ sidebar
:
--8<---------------cut here---------------end--------------->8---


I had to remove the first dot in the exported filenames as pdflatex doesn't
like it:

--8<---------------cut here---------------start------------->8---
diff --git a/Rakefile b/Rakefile
index 7c6d202..129b952 100644
--- a/Rakefile
+++ b/Rakefile
@@ -13,7 +13,7 @@ end
 Dir[File.join(File.dirname(__FILE__), "themes", "*", "*.rake")].each { |ext| 
load ext }

 # handle exported files
-def all_exported(dir) Dir.chdir($blogs){ Dir['**/.exported_*'].each{ |path| 
yield(path) } } end
+def all_exported(dir) Dir.chdir($blogs){ Dir['**/exported_*'].each{ |path| 
yield(path) } } end
 namespace :exported do
   desc "list all temporary exported files"
   task :list do

diff --git a/elisp/org-interaction.el b/elisp/org-interaction.el
index 2311156..78373df 100644
--- a/elisp/org-interaction.el
+++ b/elisp/org-interaction.el
@@ -23,7 +23,7 @@ evaluating BODY."
        (kill-buffer ,temp-file)
        ,temp-result)))

-(defvar org-interaction-prefix ".exported_")
+(defvar org-interaction-prefix "exported_")

 (defun org-file-to-html (file-path)
   "Open up an org file, publish it to html, and then return the
--8<---------------cut here---------------end--------------->8---


Here are the changes in acts_as_org.rb:

--8<---------------cut here---------------start------------->8---
diff --git a/lib/acts_as_org.rb b/lib/acts_as_org.rb
index 458741d..69bc12b 100644
--- a/lib/acts_as_org.rb
+++ b/lib/acts_as_org.rb
@@ -7,7 +7,7 @@ module ActiveFile
       # *note*: if you change this value, you must also change the
       # value of `org-interaction-prefix' in
       # ../elisp/org-interaction.el
-      EXP_PREFIX = ".exported_"
+      EXP_PREFIX = "exported_"

       def self.included(base)
         base.extend ActiveFile::Acts::Org::ClassMethods
@@ -20,6 +20,7 @@ module ActiveFile
         end

         def emacs_run(command) %x{#{EMACS_CMD} --eval '#{command}'} end
+        def run_command(command) %x{#{command}} end

         # convert a string of org-formatted text to html
         def string_to_html(org_string, options = {})
@@ -80,6 +81,30 @@ PREAMBLE
           l_path = self.latex_path(path)
           File.exist?(l_path) and File.mtime(l_path) > File.mtime(path)
         end
+
+        def pdf_path(path)
+          File.join(File.dirname(path),
+                    ActiveFile::Acts::Org::EXP_PREFIX + File.basename(path) + 
".pdf")
+        end
+
+        def to_pdf(path, options = {})
+          p_dir = File.dirname(path)
+          p_path = self.pdf_path(path)
+          l_path = self.latex_path(path)
+          self.run_command("(cd #{p_dir};to-pdf.sh #{path} #{l_path})") unless 
self.clean_pdf?(path)
+          return nil unless File.exist?(p_path)
+          html = File.read(p_path)
+        end
+ #       alias :to_pdf
+
+        def clean_pdf?(path)
+          p_path = self.pdf_path(path)
+          File.exist?(p_path) and File.mtime(p_path) > File.mtime(path)
+        end
       end

       module InstanceMethods
@@ -107,6 +132,20 @@ PREAMBLE
           self.class.to_latex(self.full_path, options)
         end
         alias :to_tex :to_latex
+
+        def pdf_path
+          self.class.pdf_path(self.full_path)
+        end
+
+        def clean_pdf?
+          self.class.clean_pdf?(self.full_path)
+        end
+
+        def to_pdf(options = {})
+          self.class.to_pdf(self.full_path, options)
+        end
+
       end
     end
   end
--8<---------------cut here---------------end--------------->8---


As you can see, to compile to pdf I use an external shell script in order to
generate the .tex file with emacs client and then compile to pdf (and doing
the required iterations in order to get the right references). Here's this
to-pdf.sh script (that needs to be in you path):

--8<---------------cut here---------------start------------->8---
#!/bin/sh

# first argument is the org file
ORGFILE=$1

# second argument is the tex file
TEXFILE=$2

# Blorgit-dependent details
EMACSSOCKET=`cat /tmp/emacsclient-socket-dir`

# Output files
LOGFILE=${TEXFILE%.*}.log

# Commands
RM="rm -f"
PDFLATEX="pdflatex --interaction=batchmode"
EMACS="emacsclient -s $EMACSSOCKET/server --eval \"(org-file-to-latex 
\\\"$ORGFILE\\\")\""

# First part -- Generate the .tex file from .org
echo
echo "* Running \`org-mode' *"
$RM $TEXFILE
echo $EMACS
eval $EMACS

# Second part -- Generate the .pdf from .tex
if [ -f $TEXFILE ]
then
    echo
    echo "* Running \`pdfLaTeX "$TEXFILE"' *"
    $RM $LOGFILE
    $PDFLATEX $TEXFILE
    while ( grep -e "Rerun .* cross-references" $LOGFILE > /dev/null ); \
        do \
        echo; \
        echo "* Re-running \`pdfLaTeX "$TEXFILE"' *"; \
        $RM $LOGFILE; \
        $PDFLATEX $TEXFILE; \
        done
fi
--8<---------------cut here---------------end--------------->8---


This works very well too.

Except that, as I removed the first dot in exported filenames, these are no
longer hidden and are thus displayed in the web interface (in Recent or
Directory view). Do you know how to avoid this?


>> 4) Is it possible to add a button in order to create a new file directly from
>>    the web interface?
>
> Yes, with the edit-able option set to true, you will just need to type
> the path to the new file as a url into your web browser.  If blorgit
> can't find a file there it will offer to let you create one.

Indeed, this works very well. Thanks for the tip.


I have a lot of other questions to raise about Blorgit, but I need some time
to better understand how it works and experiment a bit more. I will raise my
questions in separate threads.

Now, thanks to Blorgit, anyone in my office can edit org files and get the
associated PDF (with our own LaTeX style) without having to configure neither
Emacs or even LaTeX.

This is really great.

Thanks,
Francesco




reply via email to

[Prev in Thread] Current Thread [Next in Thread]