summary refs log tree commit diff
path: root/pkgs/tools/text
diff options
context:
space:
mode:
authorPeter Simons <simons@cryp.to>2013-09-08 22:54:35 +0200
committerPeter Simons <simons@cryp.to>2013-09-08 22:54:35 +0200
commit3d2caf1180c9e4de69a485bf3fc7b666748cf7f3 (patch)
tree1abf337a22ae8fa12ce4e0b51538f13e5dd4ab89 /pkgs/tools/text
parent53a6b55945e3c4935b4642cd9548e5f346acecdc (diff)
parent98fd7e387224400b78e60f2e500d320916576570 (diff)
downloadnixlib-3d2caf1180c9e4de69a485bf3fc7b666748cf7f3.tar
nixlib-3d2caf1180c9e4de69a485bf3fc7b666748cf7f3.tar.gz
nixlib-3d2caf1180c9e4de69a485bf3fc7b666748cf7f3.tar.bz2
nixlib-3d2caf1180c9e4de69a485bf3fc7b666748cf7f3.tar.lz
nixlib-3d2caf1180c9e4de69a485bf3fc7b666748cf7f3.tar.xz
nixlib-3d2caf1180c9e4de69a485bf3fc7b666748cf7f3.tar.zst
nixlib-3d2caf1180c9e4de69a485bf3fc7b666748cf7f3.zip
Merge remote-tracking branch 'origin/master' into stdenv-updates.
Diffstat (limited to 'pkgs/tools/text')
-rw-r--r--pkgs/tools/text/source-highlight/default.nix4
-rw-r--r--pkgs/tools/text/unoconv/default.nix41
-rw-r--r--pkgs/tools/text/unoconv/unoconv-python3.patch374
-rw-r--r--pkgs/tools/text/xml/basex/basex.svg81
-rw-r--r--pkgs/tools/text/xml/basex/default.nix73
5 files changed, 571 insertions, 2 deletions
diff --git a/pkgs/tools/text/source-highlight/default.nix b/pkgs/tools/text/source-highlight/default.nix
index ca3ec39da71f..148bbfce99da 100644
--- a/pkgs/tools/text/source-highlight/default.nix
+++ b/pkgs/tools/text/source-highlight/default.nix
@@ -2,14 +2,14 @@
 
 let
   name = "source-highlight";
-  version = "3.1.6";
+  version = "3.1.7";
 in
 stdenv.mkDerivation {
   name = "${name}-${version}";
 
   src = fetchurl {
       url = "mirror://gnu/src-highlite/${name}-${version}.tar.gz";
-      sha256 = "0a5zh876nc1gig8z586b953r8ahh9zbs1lmi8vxjrkwp6zqzf4xm";
+      sha256 = "1s49ld8cnpzhhwq0r7s0sfm3cg3nhhm0wla27lwraifrrl3y1cp1";
     };
 
   configureFlags = [ "--with-boost=${boost}" ];
diff --git a/pkgs/tools/text/unoconv/default.nix b/pkgs/tools/text/unoconv/default.nix
new file mode 100644
index 000000000000..ac90cb556f90
--- /dev/null
+++ b/pkgs/tools/text/unoconv/default.nix
@@ -0,0 +1,41 @@
+{ stdenv, fetchurl, python3, libreoffice, asciidoc, makeWrapper
+# whether to install odt2pdf/odt2doc/... symlinks to unoconv
+, installSymlinks ? true
+}:
+
+# IMPORTANT: unoconv must use the same python version as libreoffice (unless it
+# will not be able to load the pyuno module from libreoffice).
+
+stdenv.mkDerivation rec {
+  name = "unoconv-0.6";
+
+  src = fetchurl {
+    url = "http://dag.wieers.com/home-made/unoconv/${name}.tar.gz";
+    sha256 = "1m3kv942zf5rzyrbkil0nhmyq9mm3007y64bb3s7w88mhr5n23kr";
+  };
+
+  buildInputs = [ asciidoc makeWrapper ];
+
+  # We need to use python3 because libreoffice 4.x uses it. This patch comes
+  # from unoconv.git, so it will be a part of the next release.
+  patches = [ ./unoconv-python3.patch ];
+
+  preBuild = ''
+    makeFlags=prefix="$out"
+  '';
+
+  postInstall = ''
+    sed -i "s|/usr/bin/env python.*|${python3}/bin/${python3.executable}|" "$out/bin/unoconv"
+    wrapProgram "$out/bin/unoconv" --set UNO_PATH "${libreoffice}/lib/libreoffice/program/"
+  '' + (if installSymlinks then ''
+    make install-links prefix="$out"
+  '' else "");
+
+  meta = with stdenv.lib; {
+    description = "Convert between any document format supported by LibreOffice/OpenOffice";
+    homepage = http://dag.wieers.com/home-made/unoconv/;
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.bjornfor ];
+  };
+}
diff --git a/pkgs/tools/text/unoconv/unoconv-python3.patch b/pkgs/tools/text/unoconv/unoconv-python3.patch
new file mode 100644
index 000000000000..b23f5d54c18f
--- /dev/null
+++ b/pkgs/tools/text/unoconv/unoconv-python3.patch
@@ -0,0 +1,374 @@
+commit fc59dd90f03cf88f4cf16c07204809f2239284ee
+Author: Riccardo Magliocchetti <riccardo.magliocchetti@gmail.com>
+Date:   Thu Dec 20 00:02:53 2012 +0100
+
+    Add support for python3
+    
+    Libreoffice 4.0 will switch its internal python version to 3.3.0
+    so it's to support that.
+    
+    Porting done automatically 2to3 plus print_function import added
+    manually. Tested on both libreoffice master with internal python
+    and with libreoffince 3.6.4 on debian with system python 2.7.
+    
+    This bumps the minimal python version to 2.6 since 2.5 does not
+    have the print function.
+
+diff --git a/unoconv b/unoconv
+index 30e6706..f72cf08 100755
+--- a/unoconv
++++ b/unoconv
+@@ -14,6 +14,8 @@
+ ### Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ ### Copyright 2007-2010 Dag Wieers <dag@wieers.com>
+ 
++from __future__ import print_function
++
+ from distutils.version import LooseVersion
+ import getopt
+ import glob
+@@ -77,11 +79,11 @@ def find_offices():
+     else:
+ 
+         if os.name in ( 'nt', 'os2' ):
+-            if 'PROGRAMFILES' in os.environ.keys():
++            if 'PROGRAMFILES' in list(os.environ.keys()):
+                 extrapaths += glob.glob(os.environ['PROGRAMFILES']+'\\LibreOffice*') + \
+                               glob.glob(os.environ['PROGRAMFILES']+'\\OpenOffice.org*')
+ 
+-            if 'PROGRAMFILES(X86)' in os.environ.keys():
++            if 'PROGRAMFILES(X86)' in list(os.environ.keys()):
+                 extrapaths += glob.glob(os.environ['PROGRAMFILES(X86)']+'\\LibreOffice*') + \
+                               glob.glob(os.environ['PROGRAMFILES(X86)']+'\\OpenOffice.org*')
+ 
+@@ -233,18 +235,18 @@ def office_environ(office):
+ 
+ def debug_office():
+     if 'URE_BOOTSTRAP' in os.environ:
+-        print >>sys.stderr, 'URE_BOOTSTRAP=%s' % os.environ['URE_BOOTSTRAP']
++        print('URE_BOOTSTRAP=%s' % os.environ['URE_BOOTSTRAP'], file=sys.stderr)
+     if 'UNO_PATH' in os.environ:
+-        print >>sys.stderr, 'UNO_PATH=%s' % os.environ['UNO_PATH']
++        print('UNO_PATH=%s' % os.environ['UNO_PATH'], file=sys.stderr)
+     if 'UNO_TYPES' in os.environ:
+-        print >>sys.stderr, 'UNO_TYPES=%s' % os.environ['UNO_TYPES']
+-    print 'PATH=%s' % os.environ['PATH']
++        print('UNO_TYPES=%s' % os.environ['UNO_TYPES'], file=sys.stderr)
++    print('PATH=%s' % os.environ['PATH'])
+     if 'PYTHONHOME' in os.environ:
+-        print >>sys.stderr, 'PYTHONHOME=%s' % os.environ['PYTHONHOME']
++        print('PYTHONHOME=%s' % os.environ['PYTHONHOME'], file=sys.stderr)
+     if 'PYTHONPATH' in os.environ:
+-        print >>sys.stderr, 'PYTHONPATH=%s' % os.environ['PYTHONPATH']
++        print('PYTHONPATH=%s' % os.environ['PYTHONPATH'], file=sys.stderr)
+     if 'LD_LIBRARY_PATH' in os.environ:
+-        print >>sys.stderr, 'LD_LIBRARY_PATH=%s' % os.environ['LD_LIBRARY_PATH']
++        print('LD_LIBRARY_PATH=%s' % os.environ['LD_LIBRARY_PATH'], file=sys.stderr)
+ 
+ def python_switch(office):
+     if office.pythonhome:
+@@ -335,11 +337,11 @@ class FmtList:
+         return ret
+ 
+     def display(self, doctype):
+-        print >>sys.stderr, "The following list of %s formats are currently available:\n" % doctype
++        print("The following list of %s formats are currently available:\n" % doctype, file=sys.stderr)
+         for fmt in self.list:
+             if fmt.doctype == doctype:
+-                print >>sys.stderr, "  %-8s - %s" % (fmt.name, fmt)
+-        print >>sys.stderr
++                print("  %-8s - %s" % (fmt.name, fmt), file=sys.stderr)
++        print(file=sys.stderr)
+ 
+ fmts = FmtList()
+ 
+@@ -530,14 +532,14 @@ class Options:
+                  'outputpath', 'password=', 'pipe=', 'port=', 'server=',
+                  'timeout=', 'show', 'stdout', 'template', 'verbose',
+                  'version'] )
+-        except getopt.error, exc:
+-            print 'unoconv: %s, try unoconv -h for a list of all the options' % str(exc)
++        except getopt.error as exc:
++            print('unoconv: %s, try unoconv -h for a list of all the options' % str(exc))
+             sys.exit(255)
+ 
+         for opt, arg in opts:
+             if opt in ['-h', '--help']:
+                 self.usage()
+-                print
++                print()
+                 self.help()
+                 sys.exit(1)
+             elif opt in ['-c', '--connection']:
+@@ -562,7 +564,7 @@ class Options:
+                         except ValueError:
+                             self.exportfilter.append( PropertyValue( name, 0, value, 0 ) )
+                 else:
+-                    print >>sys.stderr, 'Warning: Option %s cannot be parsed, ignoring.' % arg
++                    print('Warning: Option %s cannot be parsed, ignoring.' % arg, file=sys.stderr)
+             elif opt in ['-f', '--format']:
+                 self.format = arg
+             elif opt in ['-i', '--import']:
+@@ -581,7 +583,7 @@ class Options:
+                         except ValueError:
+                             self.importfilter.append( PropertyValue( name, 0, value, 0 ) )
+                 else:
+-                    print >>sys.stderr, 'Warning: Option %s cannot be parsed, ignoring.' % arg
++                    print('Warning: Option %s cannot be parsed, ignoring.' % arg, file=sys.stderr)
+             elif opt in ['-l', '--listener']:
+                 self.listener = True
+             elif opt in ['-n', '--no-launch']:
+@@ -589,7 +591,7 @@ class Options:
+             elif opt in ['-o', '--output']:
+                 self.output = arg
+             elif opt in ['--outputpath']:
+-                print >>sys.stderr, 'Warning: This option is deprecated by --output.'
++                print('Warning: This option is deprecated by --output.', file=sys.stderr)
+                 self.output = arg
+             elif opt in ['--password']:
+                 self.password = arg
+@@ -615,13 +617,13 @@ class Options:
+ 
+         ### Enable verbosity
+         if self.verbose >= 2:
+-            print >>sys.stderr, 'Verbosity set to level %d' % self.verbose
++            print('Verbosity set to level %d' % self.verbose, file=sys.stderr)
+ 
+         self.filenames = args
+ 
+         if not self.listener and not self.showlist and self.doctype != 'list' and not self.filenames:
+-            print >>sys.stderr, 'unoconv: you have to provide a filename as argument'
+-            print >>sys.stderr, 'Try `unoconv -h\' for more information.'
++            print('unoconv: you have to provide a filename as argument', file=sys.stderr)
++            print('Try `unoconv -h\' for more information.', file=sys.stderr)
+             sys.exit(255)
+ 
+         ### Set connection string
+@@ -659,21 +661,21 @@ class Options:
+         ### Get office product information
+         product = uno.getComponentContext().ServiceManager.createInstance("com.sun.star.configuration.ConfigurationProvider").createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", UnoProps(nodepath="/org.openoffice.Setup/Product"))
+ 
+-        print 'unoconv %s' % VERSION
+-        print 'Written by Dag Wieers <dag@wieers.com>'
+-        print 'Homepage at http://dag.wieers.com/home-made/unoconv/'
+-        print
+-        print 'platform %s/%s' % (os.name, sys.platform)
+-        print 'python %s' % sys.version
+-        print product.ooName, product.ooSetupVersion
++        print('unoconv %s' % VERSION)
++        print('Written by Dag Wieers <dag@wieers.com>')
++        print('Homepage at http://dag.wieers.com/home-made/unoconv/')
++        print()
++        print('platform %s/%s' % (os.name, sys.platform))
++        print('python %s' % sys.version)
++        print(product.ooName, product.ooSetupVersion)
+ #        print
+ #        print 'build revision $Rev$'
+ 
+     def usage(self):
+-        print >>sys.stderr, 'usage: unoconv [options] file [file2 ..]'
++        print('usage: unoconv [options] file [file2 ..]', file=sys.stderr)
+ 
+     def help(self):
+-        print >>sys.stderr, '''Convert from and to any format supported by LibreOffice
++        print('''Convert from and to any format supported by LibreOffice
+ 
+ unoconv options:
+   -c, --connection=string  use a custom connection string
+@@ -698,7 +700,7 @@ unoconv options:
+   -t, --template=file      import the styles from template (.ott)
+   -T, --timeout=secs       timeout after secs if connection to listener fails
+   -v, --verbose            be more and more verbose (-vvv for debugging)
+-'''
++''', file=sys.stderr)
+ 
+ class Convertor:
+     def __init__(self):
+@@ -714,7 +716,7 @@ class Convertor:
+         info(3, 'Connection type: %s' % op.connection)
+         try:
+             unocontext = resolver.resolve("uno:%s" % op.connection)
+-        except NoConnectException, e:
++        except NoConnectException as e:
+ #            info(3, "Existing listener not found.\n%s" % e)
+             info(3, "Existing listener not found.")
+ 
+@@ -749,7 +751,7 @@ class Convertor:
+                         raise
+                 else:
+                     error("Failed to connect to %s (pid=%s) in %d seconds.\n%s" % (office.binary, ooproc.pid, op.timeout, e))
+-            except Exception, e:
++            except Exception as e:
+                 raise
+                 error("Launch of %s failed.\n%s" % (office.binary, e))
+ 
+@@ -799,9 +801,9 @@ class Convertor:
+         ### No format found, throw error
+         if not outputfmt:
+             if doctype:
+-                print >>sys.stderr, 'unoconv: format [%s/%s] is not known to unoconv.' % (op.doctype, op.format)
++                print('unoconv: format [%s/%s] is not known to unoconv.' % (op.doctype, op.format), file=sys.stderr)
+             else:
+-                print >>sys.stderr, 'unoconv: format [%s] is not known to unoconv.' % op.format
++                print('unoconv: format [%s] is not known to unoconv.' % op.format, file=sys.stderr)
+             die(1)
+ 
+         return outputfmt
+@@ -813,10 +815,10 @@ class Convertor:
+         outputfmt = self.getformat(inputfn)
+ 
+         if op.verbose > 0:
+-            print >>sys.stderr, 'Input file:', inputfn
++            print('Input file:', inputfn, file=sys.stderr)
+ 
+         if not os.path.exists(inputfn):
+-            print >>sys.stderr, 'unoconv: file `%s\' does not exist.' % inputfn
++            print('unoconv: file `%s\' does not exist.' % inputfn, file=sys.stderr)
+             exitcode = 1
+ 
+         try:
+@@ -854,7 +856,7 @@ class Convertor:
+                     templateurl = unohelper.absolutize(self.cwd, unohelper.systemPathToFileUrl(op.template))
+                     document.StyleFamilies.loadStylesFromURL(templateurl, templateprops)
+                 else:
+-                    print >>sys.stderr, 'unoconv: template file `%s\' does not exist.' % op.template
++                    print('unoconv: template file `%s\' does not exist.' % op.template, file=sys.stderr)
+                     exitcode = 1
+ 
+             ### Update document links
+@@ -924,40 +926,40 @@ class Convertor:
+ 
+             try:
+                 document.storeToURL(outputurl, tuple(outputprops) )
+-            except IOException, e:
++            except IOException as e:
+                 raise UnoException("Unable to store document to %s (ErrCode %d)\n\nProperties: %s" % (outputurl, e.ErrCode, outputprops), None)
+ 
+             phase = "dispose"
+             document.dispose()
+             document.close(True)
+ 
+-        except SystemError, e:
++        except SystemError as e:
+             error("unoconv: SystemError during %s phase:\n%s" % (phase, e))
+             exitcode = 1
+ 
+-        except RuntimeException, e:
++        except RuntimeException as e:
+             error("unoconv: RuntimeException during %s phase:\nOffice probably died. %s" % (phase, e))
+             exitcode = 6
+ 
+-        except DisposedException, e:
++        except DisposedException as e:
+             error("unoconv: DisposedException during %s phase:\nOffice probably died. %s" % (phase, e))
+             exitcode = 7
+ 
+-        except IllegalArgumentException, e:
++        except IllegalArgumentException as e:
+             error("UNO IllegalArgument during %s phase:\nSource file cannot be read. %s" % (phase, e))
+             exitcode = 8
+ 
+-        except IOException, e:
++        except IOException as e:
+ #            for attr in dir(e): print '%s: %s', (attr, getattr(e, attr))
+             error("unoconv: IOException during %s phase:\n%s" % (phase, e.Message))
+             exitcode = 3
+ 
+-        except CannotConvertException, e:
++        except CannotConvertException as e:
+ #            for attr in dir(e): print '%s: %s', (attr, getattr(e, attr))
+             error("unoconv: CannotConvertException during %s phase:\n%s" % (phase, e.Message))
+             exitcode = 4
+ 
+-        except UnoException, e:
++        except UnoException as e:
+             if hasattr(e, 'ErrCode'):
+                 error("unoconv: UnoException during %s phase in %s (ErrCode %d)" % (phase, repr(e.__class__), e.ErrCode))
+                 exitcode = e.ErrCode
+@@ -982,7 +984,7 @@ class Listener:
+             product = self.svcmgr.createInstance("com.sun.star.configuration.ConfigurationProvider").createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", UnoProps(nodepath="/org.openoffice.Setup/Product"))
+             try:
+                 unocontext = resolver.resolve("uno:%s" % op.connection)
+-            except NoConnectException, e:
++            except NoConnectException as e:
+                 pass
+             else:
+                 info(1, "Existing %s listener found, nothing to do." % product.ooName)
+@@ -991,25 +993,25 @@ class Listener:
+                 subprocess.call([office.binary, "-headless", "-invisible", "-nocrashreport", "-nodefault", "-nologo", "-nofirststartwizard", "-norestore", "-accept=%s" % op.connection], env=os.environ)
+             else:
+                 subprocess.call([office.binary, "--headless", "--invisible", "--nocrashreport", "--nodefault", "--nologo", "--nofirststartwizard", "--norestore", "--accept=%s" % op.connection], env=os.environ)
+-        except Exception, e:
++        except Exception as e:
+             error("Launch of %s failed.\n%s" % (office.binary, e))
+         else:
+             info(1, "Existing %s listener found, nothing to do." % product.ooName)
+ 
+ def error(msg):
+     "Output error message"
+-    print >>sys.stderr, msg
++    print(msg, file=sys.stderr)
+ 
+ def info(level, msg):
+     "Output info message"
+     if 'op' not in globals():
+         pass
+     elif op.verbose >= 3 and level >= 3:
+-        print >>sys.stderr, "DEBUG:", msg
++        print("DEBUG:", msg, file=sys.stderr)
+     elif not op.stdout and level <= op.verbose:
+-        print >>sys.stdout, msg
++        print(msg, file=sys.stdout)
+     elif level <= op.verbose:
+-        print >>sys.stderr, msg
++        print(msg, file=sys.stderr)
+ 
+ def die(ret, msg=None):
+     "Print optional error and exit with errorcode"
+@@ -1031,7 +1033,7 @@ def die(ret, msg=None):
+                     subprocess.Popen([office.binary, "--headless", "--invisible", "--nocrashreport", "--nodefault", "--nofirststartwizard", "--nologo", "--norestore", "--unaccept=%s" % op.connection], env=os.environ)
+                 ooproc.wait()
+                 info(2, '%s listener successfully disabled.' % product.ooName)
+-            except Exception, e:
++            except Exception as e:
+                 error("Terminate using %s failed.\n%s" % (office.binary, e))
+ 
+         ### If there is no GUI attached to the instance, terminate instance
+@@ -1080,7 +1082,7 @@ def main():
+             for inputfn in op.filenames:
+                 convertor.convert(inputfn)
+ 
+-    except NoConnectException, e:
++    except NoConnectException as e:
+         error("unoconv: could not find an existing connection to LibreOffice at %s:%s." % (op.server, op.port))
+         if op.connection:
+             info(0, "Please start an LibreOffice instance on server '%s' by doing:\n\n    unoconv --listener --server %s --port %s\n\nor alternatively:\n\n    soffice -nologo -nodefault -accept=\"%s\"" % (op.server, op.server, op.port, op.connection))
+@@ -1110,14 +1112,14 @@ if __name__ == '__main__':
+             break
+         except:
+ #            debug_office()
+-            print >>sys.stderr, "unoconv: Cannot find a suitable pyuno library and python binary combination in %s" % of
+-            print >>sys.stderr, "ERROR:", sys.exc_info()[1]
+-            print >>sys.stderr
++            print("unoconv: Cannot find a suitable pyuno library and python binary combination in %s" % of, file=sys.stderr)
++            print("ERROR:", sys.exc_info()[1], file=sys.stderr)
++            print(file=sys.stderr)
+     else:
+ #        debug_office()
+-        print >>sys.stderr, "unoconv: Cannot find a suitable office installation on your system."
+-        print >>sys.stderr, "ERROR: Please locate your office installation and send your feedback to:"
+-        print >>sys.stderr, "       http://github.com/dagwieers/unoconv/issues"
++        print("unoconv: Cannot find a suitable office installation on your system.", file=sys.stderr)
++        print("ERROR: Please locate your office installation and send your feedback to:", file=sys.stderr)
++        print("       http://github.com/dagwieers/unoconv/issues", file=sys.stderr)
+         sys.exit(1)
+ 
+     ### Now that we have found a working pyuno library, let's import some classes
+@@ -1160,6 +1162,6 @@ if __name__ == '__main__':
+ 
+     try:
+         main()
+-    except KeyboardInterrupt, e:
++    except KeyboardInterrupt as e:
+         die(6, 'Exiting on user request')
+     die(exitcode)
diff --git a/pkgs/tools/text/xml/basex/basex.svg b/pkgs/tools/text/xml/basex/basex.svg
new file mode 100644
index 000000000000..9d476cec2ca1
--- /dev/null
+++ b/pkgs/tools/text/xml/basex/basex.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg2178"
+   sodipodi:version="0.32"
+   inkscape:version="0.45"
+   width="1568"
+   height="1164"
+   version="1.0"
+   sodipodi:docbase="F:\Uni\Scholl\Research\Conferences\BTW2007\Poster"
+   sodipodi:docname="Logo.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:modified="true">
+  <metadata
+     id="metadata2183">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs2181" />
+  <sodipodi:namedview
+     inkscape:window-height="1150"
+     inkscape:window-width="1143"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     guidetolerance="10.0"
+     gridtolerance="10.0"
+     objecttolerance="10.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     inkscape:zoom="0.64948454"
+     inkscape:cx="784"
+     inkscape:cy="584.00852"
+     inkscape:window-x="412"
+     inkscape:window-y="20"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:object-bbox="true"
+     inkscape:object-points="true"
+     gridempspacing="10" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     style="opacity:1">
+    <path
+       style="font-size:1470px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:19.98425102;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;font-family:Clarendo"
+       d="M 628.08008,847.55762 C 613.24569,864.30587 601.88095,879.3791 593.98584,892.77734 C 586.08995,906.17595 582.1422,916.94254 582.14258,925.07715 C 582.1422,937.9972 586.92735,947.08899 596.49805,952.35254 C 606.06796,957.61633 624.49079,960.24816 651.7666,960.24805 L 720.67285,960.24805 L 720.67285,1072.2207 L 207.46484,1072.2207 L 207.46484,960.24805 L 256.27344,960.24805 C 284.9843,960.24816 308.07265,955.94152 325.53857,947.32813 C 343.00426,938.71498 364.89633,919.09586 391.21484,888.4707 L 673.2998,568.34375 L 441.45898,276.92773 C 416.57596,245.82505 393.60723,224.77038 372.55273,213.76367 C 351.4979,202.75868 325.89734,197.25576 295.75098,197.25488 L 245.50684,197.25488 L 245.50684,86 L 767.32813,86 L 767.32813,197.25488 L 699.85742,197.25488 C 685.97999,197.25576 675.45266,199.76796 668.27539,204.7915 C 661.0972,209.81678 657.50834,217.11414 657.50879,226.68359 C 657.50834,233.38365 659.30277,240.20249 662.89209,247.14014 C 666.4805,254.07943 672.58156,262.57308 681.19531,272.62109 L 810.39453,429.81348 L 967.58691,265.44336 C 974.76388,258.26644 980.50606,250.84945 984.81348,243.19238 C 989.11933,235.53697 991.27265,229.07702 991.27344,223.8125 C 991.27265,215.20008 985.88936,208.62049 975.12354,204.07373 C 964.35618,199.5287 948.20629,197.25576 926.67383,197.25488 L 869.25195,197.25488 L 869.25195,86 L 1332.2158,86 L 1332.2158,197.25488 L 1279.1006,197.25488 C 1241.2968,197.25576 1189.8564,233.14439 1124.7793,304.9209 L 1123.3438,306.35645 L 905.8584,544.65723 L 1155.6436,856.1709 C 1194.8808,904.97966 1224.6684,934.52797 1245.0063,944.81592 C 1265.3422,955.10412 1294.412,960.24816 1332.2158,960.24805 L 1376,960.24805 L 1376,1072.2207 L 810.39453,1072.2207 L 810.39453,960.24805 L 877.86523,960.24805 C 901.79032,960.24816 919.25612,958.21447 930.2627,954.14697 C 941.26782,950.07971 946.77074,943.26087 946.77148,933.69043 C 946.77074,926.51284 945.3352,918.97623 942.46484,911.08057 C 939.59302,903.18523 935.28638,895.64861 929.54492,888.4707 L 768.76367,685.34082 L 628.08008,847.55762 z "
+       id="text2175" />
+    <path
+       style="font-size:500px;font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e00000;fill-opacity:1;stroke:#ffffff;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;font-family:Arial Black"
+       d="M 146.16714,395.52869 L 353.19839,395.52869 C 387.70332,395.52904 414.19255,404.07396 432.66616,421.16345 C 451.13913,438.25361 460.37577,459.41244 460.37612,484.64001 C 460.37577,505.79912 453.78398,523.94688 440.60073,539.08337 C 431.81135,549.17472 418.95329,557.14998 402.02651,563.00916 C 427.74234,569.19424 446.66322,579.81434 458.78921,594.86951 C 470.9145,609.92499 476.97732,628.84587 476.97768,651.6322 C 476.97732,670.18697 472.66417,686.8699 464.03823,701.68103 C 455.41158,716.49227 443.61146,728.211 428.63784,736.83728 C 419.36019,742.20839 405.3628,746.11463 386.64565,748.55603 C 361.74306,751.81124 345.22289,753.43884 337.08511,753.43884 L 146.16714,753.43884 L 146.16714,395.52869 z M 257.7394,535.90955 L 305.83511,535.90955 C 323.0875,535.90976 335.09107,532.93939 341.84585,526.99841 C 348.60017,521.05789 351.97744,512.47229 351.97768,501.24158 C 351.97744,490.82517 348.60017,482.68716 341.84585,476.82751 C 335.09107,470.96842 323.33164,468.03874 306.56753,468.03845 L 257.7394,468.03845 L 257.7394,535.90955 z M 257.7394,676.53455 L 314.13589,676.53455 C 333.17863,676.53462 346.60635,673.15735 354.41909,666.40271 C 362.23134,659.64825 366.13758,650.57436 366.13784,639.18103 C 366.13758,628.60173 362.27203,620.0975 354.54116,613.66833 C 346.8098,607.23944 333.26001,604.02493 313.89175,604.02478 L 257.7394,604.02478 L 257.7394,676.53455 z "
+       id="text2205" />
+    <path
+       style="font-size:500px;font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e00000;fill-opacity:1;stroke:#ffffff;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;font-family:Arial Black"
+       d="M 703.69272,694.35681 L 577.71616,694.35681 L 560.38217,753.43884 L 447.34506,753.43884 L 581.86655,395.52869 L 702.47202,395.52869 L 836.9935,753.43884 L 721.27084,753.43884 L 703.69272,694.35681 z M 680.49936,616.96423 L 640.94858,488.30212 L 601.64194,616.96423 L 680.49936,616.96423 z "
+       id="text3180" />
+    <path
+       style="font-size:500px;font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e00000;fill-opacity:1;stroke:#ffffff;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;font-family:Arial Black"
+       d="M 810.90509,641.13416 L 916.1297,634.54236 C 918.40822,651.63231 923.04689,664.65313 930.04572,673.60486 C 941.4388,688.09061 957.71482,695.33344 978.87384,695.33337 C 994.6614,695.33344 1006.8277,691.63064 1015.3729,684.22498 C 1023.9176,676.81946 1028.19,668.23386 1028.1902,658.46814 C 1028.19,649.19091 1024.121,640.89013 1015.9832,633.5658 C 1007.845,626.24171 988.96479,619.3244 959.34259,612.81384 C 910.83987,601.90905 876.25331,587.42339 855.58282,569.35681 C 834.74945,551.29061 824.33279,528.26004 824.33282,500.26501 C 824.33279,481.87337 829.66319,464.49871 840.32404,448.14099 C 850.98479,431.7839 867.01667,418.92584 888.41974,409.56677 C 909.82262,400.20841 939.16015,395.52905 976.43243,395.52869 C 1022.1679,395.52905 1057.0393,404.03327 1081.0467,421.04138 C 1105.0535,438.05017 1119.3358,465.10906 1123.8934,502.21814 L 1019.6453,508.32166 C 1016.8782,492.20864 1011.0595,480.4899 1002.1893,473.16541 C 993.31863,465.84148 981.07092,462.17937 965.44611,462.17908 C 952.58787,462.17937 942.90364,464.90561 936.39337,470.35779 C 929.88282,475.81055 926.62761,482.44303 926.62775,490.25525 C 926.62761,495.95213 929.31316,501.07908 934.68439,505.63611 C 939.89257,510.35641 952.26235,514.75094 971.79376,518.8197 C 1020.1334,529.2366 1054.7606,539.77533 1075.6756,550.43591 C 1096.59,561.09692 1111.8081,574.32119 1121.3299,590.10876 C 1130.851,605.89668 1135.6118,623.55617 1135.6121,643.08728 C 1135.6118,666.03659 1129.2641,687.19543 1116.5692,706.56384 C 1103.8735,725.93237 1086.1327,740.62148 1063.3465,750.63123 C 1040.5598,760.64099 1011.8326,765.64587 977.16486,765.64587 C 916.29234,765.64587 874.13743,753.92713 850.70001,730.48962 C 827.26248,707.05218 813.99752,677.26705 810.90509,641.13416 L 810.90509,641.13416 z "
+       id="text3184" />
+    <path
+       style="font-size:500px;font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e00000;fill-opacity:1;stroke:#ffffff;stroke-width:20;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;font-family:Arial Black"
+       d="M 1139.0592,395.52869 L 1435.4459,395.52869 L 1435.4459,471.9447 L 1249.899,471.9447 L 1249.899,528.82947 L 1422.0182,528.82947 L 1422.0182,601.82751 L 1249.899,601.82751 L 1249.899,672.38416 L 1440.817,672.38416 L 1440.817,753.43884 L 1139.0592,753.43884 L 1139.0592,395.52869 z "
+       id="text3188" />
+  </g>
+</svg>
diff --git a/pkgs/tools/text/xml/basex/default.nix b/pkgs/tools/text/xml/basex/default.nix
new file mode 100644
index 000000000000..4f120601c8e7
--- /dev/null
+++ b/pkgs/tools/text/xml/basex/default.nix
@@ -0,0 +1,73 @@
+{ stdenv, fetchurl, unzip, jre, coreutils, makeDesktopItem }:
+
+stdenv.mkDerivation rec {
+  name = "basex-7.7";
+
+  src = fetchurl {
+    url = "http://files.basex.org/releases/7.7/BaseX77.zip";
+    sha256 = "1wnndq8lcnfx29bc3j2sgswk6dxgv2nln2chmwbf7h4a05fcavdj";
+  };
+
+  buildInputs = [ unzip jre ];
+
+  desktopItem = makeDesktopItem {
+    name = "basex";
+    exec = "basexgui %f";
+    icon = "${./basex.svg}"; # icon copied from Ubuntu basex package
+    comment = "Visually query and analyse your XML data";
+    desktopName = "BaseX XML Database";
+    genericName = "XML database tool";
+    categories = "Development;Utility;Database";
+    mimeType = "text/xml";
+  };
+
+  # We're using a pre-built package
+  configurePhase = "true";
+  buildPhase = "true";
+  installPhase = ''
+    mkdir -p "$out"
+    cp -r * "$out"
+
+    # Remove Windows batch files (unclutter $out/bin)
+    rm -f "$out"/bin/*.bat
+
+    # Move some top-level stuff to $out/share/basex (unclutter $out)
+    mkdir -p "$out/share/basex"
+    mv "$out"/*.txt "$out/share/basex/"
+    mv "$out"/webapp "$out/share/basex/"
+
+    # Remove empty directories
+    rmdir "$out/repo"
+    rmdir "$out/data"
+
+    # Install desktop file
+    mkdir -p "$out/share/applications"
+    cp "$desktopItem"/share/applications/* "$out/share/applications/"
+
+    # Use substitutions instead of wrapper scripts
+    for file in "$out"/bin/*; do
+        sed -i -e "s|/usr/bin/env bash|${stdenv.shell}|" \
+               -e "s|java|${jre}/bin/java|" \
+               -e "s|readlink|${coreutils}/bin/readlink|" \
+               -e "s|dirname|${coreutils}/bin/dirname|" \
+               -e "s|basename|${coreutils}/bin/basename|" \
+               -e "s|echo|${coreutils}/bin/echo|" \
+            "$file"
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    description = "XML database and XPath/XQuery processor";
+    longDescription = ''
+      BaseX is a very fast and light-weight, yet powerful XML database and
+      XPath/XQuery processor, including support for the latest W3C Full Text
+      and Update Recommendations. It supports large XML instances and offers a
+      highly interactive front-end (basexgui). Apart from two local standalone
+      modes, BaseX offers a client/server architecture.
+    '';
+    homepage = http://basex.org/;
+    license = licenses.bsd3;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.bjornfor ];
+  };
+}