Commit 6fa26162 authored by Shizzz's avatar Shizzz
Browse files

Запоминание места чтения и книги в localStorage

Добавил гифку, которая крутится в момента загрузки книги.
Книга после загрузки сжимается и сохраняется в localStorage. Если место
заканчивается, из хранилища удаляется книга загруженная раньше всех.
Сохраняется место чтения в БД. Для этого была добавлена колока.
Соответственно для обновления нужно приминять миграции.
Немного исправил шаблон для FB2 файла.
parent 971ab72a
Loading
Loading
Loading
Loading
+10 −13
Original line number Diff line number Diff line
@@ -28,8 +28,6 @@
				</style>
			</head>
			<body>


				<h4 align="center">
					<xsl:value-of select="fb:description/fb:title-info/fb:book-title"/>
				</h4>
@@ -39,7 +37,6 @@
				</xsl:for-each>

				<xsl:for-each select="fb:description/fb:title-info/fb:annotation">

					<div>
						<xsl:call-template name="annotation"/>
					</div>
@@ -100,7 +97,7 @@
			</xsl:when>
			<xsl:otherwise>
				<li>
					<a href="#TOC_{generate-id()}"><xsl:value-of select="normalize-space(fb:title/fb:p[1] | @name)"/></a>
					<a href="#TOC_{position()}"><xsl:value-of select="normalize-space(fb:title/fb:p[1] | @name)"/></a>
					<xsl:if test="fb:section">
						<ul><xsl:apply-templates select="fb:section" mode="toc"/></ul>
					</xsl:if>
@@ -118,7 +115,7 @@
	</xsl:template>

	<xsl:template match="fb:section">
		<a name="TOC_{generate-id()}"></a>
		<a name="TOC_{position()}"></a>
		<xsl:if test="@id">
			<xsl:element name="a">
				<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
@@ -133,7 +130,7 @@
		<xsl:choose>
			<xsl:when test="count(ancestor::node()) &lt; 9">
				<xsl:element name="{concat('h',count(ancestor::node())-3)}">
					<a name="TOC_{generate-id()}"></a>
					<a name="TOC_{position()}"></a>
					<xsl:if test="@id">
						<xsl:element name="a">
							<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
@@ -175,7 +172,7 @@
	</xsl:template>
	<!-- p -->
	<xsl:template match="fb:p">
		<div align="justify"><xsl:if test="@id">
		<div id="{position()}" align="justify"><xsl:if test="@id">
				<xsl:element name="a">
					<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
				</xsl:element>
+20 −0
Original line number Diff line number Diff line
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2017-03-27 16:10
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('opds_catalog', '0005_auto_20161204_2138'),
    ]

    operations = [
        migrations.AddField(
            model_name='bookshelf',
            name='position',
            field=models.FloatField(default=None, null=True),
        ),
    ]
+1 −0
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ class bookshelf(models.Model):
    user = models.ForeignKey(User, db_index=True)
    book = models.ForeignKey(Book, db_index=True)
    readtime = models.DateTimeField(null=False, default=timezone.now, db_index=True)
    position = models.FloatField(null=True,default=None)


class CounterManager(models.Manager):
+93 −4
Original line number Diff line number Diff line
{% extends "sopds_main.html" %}
{% load i18n %}
{% load staticfiles %}
{% block body %}
<script>
	var BookID = {{ book_id }};
	document.addEventListener("DOMContentLoaded", function(event) { 
		$('#ReaderBlock').load('{% url 'opds_catalog:read' book_id %}', function() {});
	var delay = 1000;
	var timeout = null;
	
	var waitForLoad = function(){
		if (typeof jQuery != "undefined") {
			LoadBook();
			$(window).bind('scroll',function(){
				clearTimeout(timeout);
				timeout = setTimeout(function(){
					SetPos();
				},delay);
			});
		} else {
			window.setTimeout(waitForLoad, 500);
		}
	};
	window.setTimeout(waitForLoad, 500);  
	
	var ChangeBookDate = function(ID){
		
	}
	
	var SetPos = function(){
		var CurrentPos = window.scrollY;
		$.ajax( {
			url: '{% url 'web:setpos' book_id %}?pos='+CurrentPos,
			type: 'GET',
			cache: false,
			success: function() {
				window.setTimeout(SetPos, 10000);
			}
		});		
	}
	
	var GetPos = function(){
		$.ajax( {
			url: '{% url 'web:getpos' book_id %}',
			type: 'GET',
			cache: false,
			success: function(data) {
				window.scrollTo(0,data);
			}
		});		
	}

	var LoadBook = function(){
		if (localStorage.getItem(BookID)){
			$("#ReaderBlock").html(LZString.decompress(localStorage.getItem(BookID)));
			GetPos();
		} else {
			$.ajax( {
				url: '{% url 'opds_catalog:read' book_id %}',
				type: 'GET',
				cache: true,
				success: function(html) {
					$("#ReaderBlock").html(html);
					
					var StoreDates = {};
					if (localStorage.getItem('StoreDates')) {
						StoreDates = JSON.parse(localStorage.getItem('StoreDates'));
					}
					StoreDates[BookID] = Date();
					
					var CompressedBook = LZString.compress(html);
					
					var StoreBook = function(){
						try {
							localStorage.setItem(BookID,CompressedBook);
							localStorage.setItem('StoreDates',JSON.stringify(StoreDates));
							$('#DownloadBook').hide();
						} catch (err) {
							var Old = Date();
							var OldBookID;
							$.each(StoreDates,function(idx,el){
								if (Old > el) {
									Old = el;
									OldBookID = idx;
								}
							})
							localStorage.removeItem(OldBookID);
							delete StoreDates[OldBookID];
							StoreBook();
						}
					}
					StoreBook();
					
					GetPos();
				}
			});	
		}
	}
</script>
<div id="ReaderBlock"></div>
<div id="ReaderBlock"><div id="DownloadBook" style="text-align: center;"><img src="{% static "images/download.gif" %}" style="width: 200px;height: 200px;"></div></div>
{% endblock %}{# body #}
 No newline at end of file
+1 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@

  <script src="{% static "js/vendor/jquery.js" %}"></script>
  <script src="{% static "js/vendor/foundation.min.js" %}"></script>
  <script src="{% static "js/vendor/lz-string.js" %}"></script>

  <script>
    $(document).foundation();   
Loading