On Thu, Feb 04, 2016 at 02:47:55AM +0100, Juan Francisco Cantero Hurtado wrote:
> On Wed, Feb 03, 2016 at 03:08:53AM +0100, Juan Francisco Cantero Hurtado 
> wrote:
> > The patch adds support for documents with duplicate page titles. I
> > need this change to update pdf2djvu to the latest version.
> > 
> > I've not tested any djvu viewer, just the conversion. So any test is
> > welcome.
> 
> Tested with zathura-djvu and everything works fine.
> 

no regress with my djvu files, ok shadchin@

> > 
> > OK?
> > 
> > 
> > Index: Makefile
> > ===================================================================
> > RCS file: /cvs/ports/graphics/djvulibre/Makefile,v
> > retrieving revision 1.34
> > diff -u -p -r1.34 Makefile
> > --- Makefile        12 May 2015 16:10:27 -0000      1.34
> > +++ Makefile        3 Feb 2016 01:53:18 -0000
> > @@ -3,6 +3,7 @@
> >  COMMENT=   view, decode and encode DjVu files
> >  
> >  DISTNAME=  djvulibre-3.5.27
> > +REVISION=  0
> >  SHARED_LIBS=       djvulibre       26.0    # 27.0
> >  CATEGORIES=        graphics print
> >  
> > Index: patches/patch-libdjvu_DjVmDir_cpp
> > ===================================================================
> > RCS file: patches/patch-libdjvu_DjVmDir_cpp
> > diff -N patches/patch-libdjvu_DjVmDir_cpp
> > --- /dev/null       1 Jan 1970 00:00:00 -0000
> > +++ patches/patch-libdjvu_DjVmDir_cpp       3 Feb 2016 01:53:18 -0000
> > @@ -0,0 +1,94 @@
> > +$OpenBSD$
> > +
> > +"accept documents with duplicate page titles"
> > +
> > +http://sourceforge.net/p/djvu/djvulibre-git/ci/77a4dca8dd3acd0acc1680fa14a352c11084e25d/
> > +https://bitbucket.org/jwilk/pdf2djvu/issues/113/duplicate-page-title-1
> > +
> > +--- libdjvu/DjVmDir.cpp.orig       Tue Jul  8 23:15:07 2014
> > ++++ libdjvu/DjVmDir.cpp    Wed Feb  3 01:51:28 2016
> > +@@ -223,7 +223,6 @@ DjVmDir::decode(const GP<ByteStream> &gstr)
> > +    page2file.resize(-1);
> > +    name2file.empty();
> > +    id2file.empty();
> > +-   title2file.empty();
> > + 
> > +    int ver=str.read8();
> > +    bool bundled=(ver & 0x80)!=0;
> > +@@ -375,18 +374,6 @@ DjVmDir::decode(const GP<ByteStream> &gstr)
> > +             G_THROW( ERR_MSG("DjVmDir.dupl_id") "\t" + file->id);
> > +          id2file[file->id]=file;
> > +       }
> > +-
> > +-         // Generate title2file map
> > +-      for(pos=files_list;pos;++pos)
> > +-      {
> > +-         GP<File> file=files_list[pos];
> > +-         if (file->title.length())
> > +-         {
> > +-            if (title2file.contains(file->title))
> > +-               G_THROW( ERR_MSG("DjVmDir.dupl_title") "\t" + file->title);
> > +-            title2file[file->title]=file;
> > +-         }
> > +-      }
> > +    }
> > + }
> > + 
> > +@@ -556,11 +543,19 @@ DjVmDir::id_to_file(const GUTF8String &id) const
> > + }
> > + 
> > + GP<DjVmDir::File>
> > +-DjVmDir::title_to_file(const GUTF8String &title) const
> > ++DjVmDir::title_to_file(const GUTF8String &title, GPosition spos) const
> > + {
> > +-   GCriticalSectionLock lock((GCriticalSection *) &class_lock);
> > +-   GPosition pos;
> > +-   return (title2file.contains(title, 
> > pos))?title2file[pos]:(GP<DjVmDir::File>(0));
> > ++  if (! title)
> > ++    return 0;
> > ++  GCriticalSectionLock lock((GCriticalSection *) &class_lock);
> > ++  if (! spos)
> > ++    for (GPosition pos = spos; pos; ++pos)
> > ++      if (files_list[pos]->is_page() && files_list[pos]->title == title)
> > ++        return files_list[pos];
> > ++  for (GPosition pos = files_list; pos; ++pos)
> > ++    if (files_list[pos]->is_page() && files_list[pos]->title == title)
> > ++      return files_list[pos];
> > ++  return 0;
> > + }
> > + 
> > + GP<DjVmDir::File>
> > +@@ -661,14 +656,7 @@ DjVmDir::insert_file(const GP<File> & file, int pos_nu
> > +      G_THROW( ERR_MSG("DjVmDir.dupl_name2") "\t" + file->name);
> > +    name2file[file->name]=file;
> > +    id2file[file->id]=file;
> > +-   if (file->title.length())
> > +-     {
> > +-       if (title2file.contains(file->title))  
> > +-         // duplicate titles may become ok some day
> > +-         G_THROW( ERR_MSG("DjVmDir.dupl_title2") "\t" + file->title);
> > +-       title2file[file->title]=file;
> > +-     }
> > +-
> > ++   
> > +       // Make sure that there is no more than one file with shared 
> > annotations
> > +    if (file->is_shared_anno())
> > +    {
> > +@@ -727,7 +715,6 @@ DjVmDir::delete_file(const GUTF8String &id)
> > +       {
> > +          name2file.del(f->name);
> > +          id2file.del(f->id);
> > +-         title2file.del(f->title);
> > +          if (f->is_page())
> > +          {
> > +             for(int page=0;page<page2file.size();page++)
> > +@@ -788,9 +775,7 @@ DjVmDir::set_file_title(const GUTF8String &id, const G
> > +    if (!id2file.contains(id, pos))
> > +       G_THROW( ERR_MSG("DjVmDir.no_info") "\t" + GUTF8String(id));
> > +    GP<File> file=id2file[pos];
> > +-   title2file.del(file->title);
> > +    file->title=title;
> > +-   title2file[title]=file;
> > + }
> > + 
> > + GPList<DjVmDir::File>
> > Index: patches/patch-libdjvu_DjVmDir_h
> > ===================================================================
> > RCS file: patches/patch-libdjvu_DjVmDir_h
> > diff -N patches/patch-libdjvu_DjVmDir_h
> > --- /dev/null       1 Jan 1970 00:00:00 -0000
> > +++ patches/patch-libdjvu_DjVmDir_h 3 Feb 2016 01:53:18 -0000
> > @@ -0,0 +1,41 @@
> > +$OpenBSD$
> > +
> > +"accept documents with duplicate page titles"
> > +
> > +http://sourceforge.net/p/djvu/djvulibre-git/ci/77a4dca8dd3acd0acc1680fa14a352c11084e25d/
> > +https://bitbucket.org/jwilk/pdf2djvu/issues/113/duplicate-page-title-1
> > +
> > +--- libdjvu/DjVmDir.h.orig Tue Jul  8 23:15:07 2014
> > ++++ libdjvu/DjVmDir.h      Wed Feb  3 01:51:28 2016
> > +@@ -181,7 +181,8 @@ class DJVUAPI DjVmDir : public GPEnabled (public)
> > +       /** Translates file IDs to file records. */
> > +    GP<File> id_to_file(const GUTF8String &id) const;
> > +       /** Translates file shortcuts to file records. */
> > +-   GP<File> title_to_file(const GUTF8String &title) const;
> > ++   GP<File> title_to_file(const GUTF8String &title, GPosition spos) const;
> > ++   GP<File> title_to_file(const GUTF8String &title) const; 
> > +       /** Access file record by position. */
> > +    GP<File> pos_to_file(int fileno, int *ppageno=0) const;
> > +       /** Returns position of the file in the directory. */
> > +@@ -216,7 +217,6 @@ class DJVUAPI DjVmDir : public GPEnabled (public)
> > +    GPArray<File> page2file;
> > +    GPMap<GUTF8String, File> name2file;
> > +    GPMap<GUTF8String, File> id2file;
> > +-   GPMap<GUTF8String, File> title2file;
> > + private: //dummy stuff
> > +    static void decode(ByteStream *);
> > +    static void encode(ByteStream *);
> > +@@ -438,6 +438,13 @@ DjVmDir::is_indirect(void) const
> > +   GCriticalSectionLock lock((GCriticalSection *) &class_lock);
> > +   return ( files_list.size() && files_list[files_list] != 0 &&
> > +            files_list[files_list]->offset==0 );
> > ++}
> > ++
> > ++inline GP<DjVmDir::File> 
> > ++DjVmDir::title_to_file(const GUTF8String &title) const
> > ++{
> > ++  GPosition pos;
> > ++  return title_to_file(title, pos);
> > + }
> > + 
> > + 
> > Index: patches/patch-libdjvu_DjVuDocument_cpp
> > ===================================================================
> > RCS file: patches/patch-libdjvu_DjVuDocument_cpp
> > diff -N patches/patch-libdjvu_DjVuDocument_cpp
> > --- /dev/null       1 Jan 1970 00:00:00 -0000
> > +++ patches/patch-libdjvu_DjVuDocument_cpp  3 Feb 2016 01:53:18 -0000
> > @@ -0,0 +1,37 @@
> > +$OpenBSD$
> > +
> > +"accept documents with duplicate page titles"
> > +
> > +http://sourceforge.net/p/djvu/djvulibre-git/ci/77a4dca8dd3acd0acc1680fa14a352c11084e25d/
> > +https://bitbucket.org/jwilk/pdf2djvu/issues/113/duplicate-page-title-1
> > +
> > +--- libdjvu/DjVuDocument.cpp.orig  Mon Sep 22 00:06:03 2014
> > ++++ libdjvu/DjVuDocument.cpp       Wed Feb  3 01:51:28 2016
> > +@@ -805,11 +805,9 @@ DjVuDocument::id_to_url(const GUTF8String & id) const
> > +       {
> > +         GP<DjVmDir::File> file=djvm_dir->id_to_file(id);
> > +         if (!file)
> > +-              {
> > +                 file=djvm_dir->name_to_file(id);
> > +-          if (!file)
> > +-                  file=djvm_dir->title_to_file(id);
> > +-              }
> > ++        if (!file)
> > ++                file=djvm_dir->title_to_file(id);
> > +         if (file)
> > +           return GURL::UTF8(file->get_load_name(),init_url);
> > +       }
> > +@@ -819,11 +817,9 @@ DjVuDocument::id_to_url(const GUTF8String & id) const
> > +       {
> > +          GP<DjVmDir::File> file=djvm_dir->id_to_file(id);
> > +          if (!file)
> > +-               {
> > +                  file=djvm_dir->name_to_file(id);
> > +-           if (!file)
> > +-                   file=djvm_dir->title_to_file(id);
> > +-               }
> > ++        if (!file)
> > ++                file=djvm_dir->title_to_file(id);
> > +          if (file)
> > +            return GURL::UTF8(file->get_load_name(),init_url.base());
> > +       }
> > Index: patches/patch-libdjvu_DjVuDocument_h
> > ===================================================================
> > RCS file: patches/patch-libdjvu_DjVuDocument_h
> > diff -N patches/patch-libdjvu_DjVuDocument_h
> > --- /dev/null       1 Jan 1970 00:00:00 -0000
> > +++ patches/patch-libdjvu_DjVuDocument_h    3 Feb 2016 01:53:18 -0000
> > @@ -0,0 +1,17 @@
> > +$OpenBSD$
> > +
> > +"accept documents with duplicate page titles"
> > +
> > +http://sourceforge.net/p/djvu/djvulibre-git/ci/77a4dca8dd3acd0acc1680fa14a352c11084e25d/
> > +https://bitbucket.org/jwilk/pdf2djvu/issues/113/duplicate-page-title-1
> > +
> > +--- libdjvu/DjVuDocument.h.orig    Tue Jul  8 23:15:07 2014
> > ++++ libdjvu/DjVuDocument.h Wed Feb  3 01:51:28 2016
> > +@@ -524,7 +524,6 @@ class DJVUAPI DjVuDocument : public DjVuPort (public)
> > +              \begin{enumerate}
> > +                 \item File ID from the \Ref{DjVmDir}
> > +                 \item File name from the \Ref{DjVmDir}
> > +-                \item File title from the \Ref{DjVmDir}
> > +              \end{enumerate}
> > +              Then for #BUNDLED# document the URL is obtained by
> > +              appending the #name# of the found file to the document's
> > Index: patches/patch-libdjvu_DjVuMessageLite_h
> > ===================================================================
> > RCS file: patches/patch-libdjvu_DjVuMessageLite_h
> > diff -N patches/patch-libdjvu_DjVuMessageLite_h
> > --- /dev/null       1 Jan 1970 00:00:00 -0000
> > +++ patches/patch-libdjvu_DjVuMessageLite_h 3 Feb 2016 01:53:18 -0000
> > @@ -0,0 +1,20 @@
> > +$OpenBSD$
> > +
> > +"accept documents with duplicate page titles"
> > +
> > +http://sourceforge.net/p/djvu/djvulibre-git/ci/77a4dca8dd3acd0acc1680fa14a352c11084e25d/
> > +https://bitbucket.org/jwilk/pdf2djvu/issues/113/duplicate-page-title-1
> > +
> > +--- libdjvu/DjVuMessageLite.h.orig Tue Jul  8 23:15:07 2014
> > ++++ libdjvu/DjVuMessageLite.h      Wed Feb  3 01:51:28 2016
> > +@@ -89,8 +89,8 @@ class ByteStream;
> > +     separator ::= newline |
> > +                   newline | separator
> > +     
> > +-    single_message ::= message_ID |
> > +-                       message_ID parameters
> > ++    single_message ::= CTRLC message_ID |
> > ++                       CTRLC message_ID parameters
> > +     
> > +     parameters ::= tab string |
> > +                    tab string parameters
> > Index: patches/patch-tools_djvused_cpp
> > ===================================================================
> > RCS file: patches/patch-tools_djvused_cpp
> > diff -N patches/patch-tools_djvused_cpp
> > --- /dev/null       1 Jan 1970 00:00:00 -0000
> > +++ patches/patch-tools_djvused_cpp 3 Feb 2016 01:53:18 -0000
> > @@ -0,0 +1,27 @@
> > +$OpenBSD$
> > +
> > +"accept documents with duplicate page titles"
> > +
> > +http://sourceforge.net/p/djvu/djvulibre-git/ci/77a4dca8dd3acd0acc1680fa14a352c11084e25d/
> > +https://bitbucket.org/jwilk/pdf2djvu/issues/113/duplicate-page-title-1
> > +
> > +--- tools/djvused.cpp.orig Sun Feb  8 20:39:42 2015
> > ++++ tools/djvused.cpp      Wed Feb  3 01:51:28 2016
> > +@@ -66,6 +66,7 @@
> > + #include "GString.h"
> > + #include "DjVuDocEditor.h"
> > + #include "DjVuDumpHelper.h"
> > ++#include "DjVuMessageLite.h"
> > + #include "BSByteStream.h"
> > + #include "DjVuText.h"
> > + #include "DjVuAnno.h"
> > +@@ -2315,7 +2316,8 @@ execute()
> > +       G_CATCH(ex)
> > +         {
> > +           vprint("Error (%s): %s",
> > +-                 (const char*)ToNative(token), ex.get_cause());
> > ++                 (const char*)ToNative(token), 
> > ++                 (const char 
> > *)DjVuMessageLite::LookUpUTF8(ex.get_cause()));
> > +           if (! verbose)
> > +             G_RETHROW;
> > +         }
> > 
> 
> -- 
> Juan Francisco Cantero Hurtado http://juanfra.info

-- 
Alexandr Shadchin

Reply via email to