From mboxrd@z Thu Jan 1 00:00:00 1970 From: Francesco Pizzolante Subject: Re: Blorgit > SVN integration Date: Thu, 19 Nov 2009 11:06:55 +0100 Message-ID: <87fx8asu9s.fsf@missioncriticalit.com> References: <87r5s24ebl.fsf@missioncriticalit.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: In-Reply-To: (Eric Schulte's message of "Fri, 13 Nov 2009 10:45:31 -0700") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org-mXXj517/zsQ@public.gmane.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org-mXXj517/zsQ@public.gmane.org To: Eric Schulte Cc: mailing-list-org-mode 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 _______________________________________________ Emacs-orgmode mailing list Remember: use `Reply All' to send replies to the list. Emacs-orgmode-mXXj517/zsQ@public.gmane.org http://lists.gnu.org/mailman/listinfo/emacs-orgmode