Intelligent fragment folding and unfolding.
authorMarek Stępniowski <marek@stepniowski.com>
Thu, 4 Sep 2008 20:18:33 +0000 (22:18 +0200)
committerMarek Stępniowski <marek@stepniowski.com>
Thu, 4 Sep 2008 20:18:33 +0000 (22:18 +0200)
catalogue/models.py
media/css/master.css
media/js/catalogue.js
templates/catalogue/tagged_book_list.html

index d252bbf..e9c8928 100644 (file)
@@ -129,6 +129,8 @@ class Book(models.Model):
         from tempfile import NamedTemporaryFile
         from slughifi import slughifi
         import dcparser
+        from markupstring import MarkupString
+        import re
         
         # Read book metadata
         book_info = dcparser.parse(xml_file)
@@ -159,7 +161,11 @@ class Book(models.Model):
         closed_fragments, open_fragments = html.extract_fragments(book.html_file.path)
         book_themes = []
         for fragment in closed_fragments.values():
-            new_fragment = Fragment(html=fragment.to_string(), anchor=fragment.id, book=book)
+            text = fragment.to_string()
+            short_text = ''
+            if (len(re.sub(r'</?.*?>', '', text)) > 400):
+                short_text = MarkupString(text)[:240]
+            new_fragment = Fragment(text=text, short_text=short_text, anchor=fragment.id, book=book)
                 
             theme_names = [s.strip() for s in fragment.themes.split(',')]
             themes = []
@@ -190,7 +196,8 @@ class Book(models.Model):
 
 
 class Fragment(models.Model):
-    html = models.TextField()
+    text = models.TextField()
+    short_text = models.TextField(editable=False)
     _short_html = models.TextField(editable=False)
     anchor = models.IntegerField()
     book = models.ForeignKey(Book, related_name='fragments')
index bbce7b5..530062a 100644 (file)
@@ -404,7 +404,3 @@ em {
     margin-bottom: 1.5em;
 }
 
-.fragment-text {
-    max-height: 12em;
-    overflow: hidden;
-}
index 11d30b8..bdceb1a 100644 (file)
             $('#login-form').show();
         });
         
-        $('.fragment-text').toggle(
-            function() { $(this).addClass('fragment-text-full').removeClass('fragment-text'); }, 
-            function() { $(this).addClass('fragment-text').removeClass('fragment-text-full'); }
-        ).hover(
+        // Fragments
+        $('.fragment-text').each(function() {
+            if ($(this).prev().filter('.fragment-short-text').length) {
+                $(this).hover(
+                    function() { $(this).css({background: '#F3F3F3', cursor: 'pointer'}); },
+                    function() { $(this).css({background: '#FFF'}); }
+                ).click(function() {
+                    $(this).fadeOut(function() {
+                        $(this).prev().fadeIn()
+                    });
+                })
+            }
+        });
+        
+        $('.fragment-short-text').click(function() {
+            $(this).fadeOut(function() { $(this).next().fadeIn() });
+        }).hover(
             function() { $(this).css({background: '#F3F3F3', cursor: 'pointer'}); },
             function() { $(this).css({background: '#FFF'}); }
-        )
+        );
         
         $('#registration-form').ajaxForm({
             dataType: 'json',
index 12c0981..83e530c 100644 (file)
@@ -7,6 +7,7 @@
 
 {% block extrahead %}
     <script type="text/javascript">
+    // <![CDATA[
         $(function() {            
             // $('#tags-list ul').addClass('dontsplit');
             // $('#tags-list').columnize({width: 180});
@@ -49,6 +50,7 @@
                     });
                 }});
         });
+    // ]]>
     </script>
 {% endblock %}