You've already forked code_examples_server
mirror of
https://github.com/AdaCore/code_examples_server.git
synced 2026-02-12 12:45:18 -08:00
Removing static book_list.yaml and creating workflow like we have for yannicks code examples. README and design notes have been updated with info. An example book is sitting in resources/books.
This commit is contained in:
@@ -30,6 +30,11 @@ To enter some examples in the database, do this:
|
||||
./manage.py fill_examples --dir=resources/example/hello_world
|
||||
```
|
||||
|
||||
To enter some books in the database, do this:
|
||||
```sh
|
||||
./manage.py fill_books --dir=resources/books/example
|
||||
```
|
||||
|
||||
To launch the server, do this:
|
||||
```sh
|
||||
./manage.py runserver
|
||||
|
||||
59
compile_server/app/management/commands/fill_books.py
Normal file
59
compile_server/app/management/commands/fill_books.py
Normal file
@@ -0,0 +1,59 @@
|
||||
# The manage.py command to enter books in the database.
|
||||
# This is meant to be used by the administrators of the project only.
|
||||
|
||||
import os
|
||||
import yaml
|
||||
from django.core.management.base import BaseCommand
|
||||
|
||||
from compile_server.app.models import Book
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('--remove_all', const=True, default=False,
|
||||
action='store_const',
|
||||
help='remove all books from the database')
|
||||
|
||||
parser.add_argument('--dir', nargs=1, type=str,
|
||||
help='add the book found in the given dir')
|
||||
|
||||
def handle(self, *args, **options):
|
||||
|
||||
if options.get('remove_all', False):
|
||||
# Remove all books from the database
|
||||
Book.objects.all().delete()
|
||||
|
||||
if options.get('dir', None):
|
||||
d = os.path.abspath(options.get('dir')[0])
|
||||
|
||||
# Consider directory as the book
|
||||
if not os.path.isdir(d):
|
||||
print "{} is not a valid directory".format(d)
|
||||
return
|
||||
|
||||
# Look for 'chapters.yaml'
|
||||
chapters_yaml = os.path.join(d, 'chapters.yaml')
|
||||
if not os.path.isfile(chapters_yaml):
|
||||
print 'There is no "chapters.yaml" in {}'.format(d)
|
||||
return
|
||||
|
||||
# Check contents of chapters.yaml
|
||||
with open(chapters_yaml, 'rb') as f:
|
||||
try:
|
||||
metadata = yaml.load(f.read())
|
||||
except:
|
||||
print format_traceback
|
||||
print 'Could not decode yaml in {}'.format(chapters_yaml)
|
||||
return
|
||||
for field in ['title', 'description']:
|
||||
if field not in metadata:
|
||||
print 'chapters.yaml should contain a field {}'.format(
|
||||
field)
|
||||
return
|
||||
|
||||
b = Book(description=metadata['description'],
|
||||
directory=d,
|
||||
subpath=os.path.basename(os.path.normpath(d)),
|
||||
title=metadata['title'])
|
||||
b.save()
|
||||
@@ -48,3 +48,21 @@ class Example(models.Model):
|
||||
|
||||
# An example is a contains a set of resources
|
||||
resources = models.ManyToManyField(Resource)
|
||||
|
||||
|
||||
class Book(models.Model):
|
||||
""" The represents a book """
|
||||
|
||||
# the directory in relation to resources/books
|
||||
# that has the resources for this book
|
||||
directory = models.TextField()
|
||||
|
||||
# This is the name of the book formatted as a url subdomain
|
||||
# This is be the same name of the folder where the book lives under resources
|
||||
subpath = models.TextField()
|
||||
|
||||
# A description of the book
|
||||
description = models.TextField()
|
||||
|
||||
# the title of the book
|
||||
title = models.TextField()
|
||||
@@ -1,6 +1,6 @@
|
||||
from django.contrib.auth.models import User, Group
|
||||
from rest_framework import serializers
|
||||
from compile_server.app.models import Resource, Example
|
||||
from compile_server.app.models import Resource, Example, Book
|
||||
|
||||
|
||||
class UserSerializer(serializers.HyperlinkedModelSerializer):
|
||||
@@ -37,3 +37,9 @@ class ExampleSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Example
|
||||
fields = ('name', 'description', 'main')
|
||||
|
||||
|
||||
class BookSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Book
|
||||
fields = ('title', 'description', 'directory', 'subpath')
|
||||
|
||||
@@ -19,8 +19,9 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for b in books %}
|
||||
<tr>
|
||||
<td><a href="{{ HTTP_HOST }}/books/{{ b.url }}/part1-chapter1">{{ b.title }}</a></td>
|
||||
<tr class='clickable-row' data-href="{{ HTTP_HOST }}/books/{{ b.subpath }}/part1-chapter1">
|
||||
<td>{{ b.title }}</td>
|
||||
<td>{{ b.description }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
@@ -33,6 +34,14 @@
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
|
||||
<script src="{% static "editors.js" %}"></script>
|
||||
<script src="{% static "sidebar.js" %}"></script>
|
||||
<script type=""text/javascript">
|
||||
jQuery(document).ready(function($) {
|
||||
$(".clickable-row").click(function() {
|
||||
window.location = $(this).data("href");
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
{% block sidebar %}
|
||||
<nav id="sidebar">
|
||||
<div class="sidebar-header">
|
||||
<h3>{{ book_title }}</h3>
|
||||
<h3>{{ book_info.title }}</h3>
|
||||
<a href="{{ HTTP_HOST }}/books/">Back to book list</a>
|
||||
</div>
|
||||
<ul class="list-unstyled components">
|
||||
@@ -24,7 +24,7 @@
|
||||
{% else %}
|
||||
<li>
|
||||
{% endif %}
|
||||
<a href="{{ HTTP_HOST }}/books/{{ book_url }}/{{ c.url }}">{{ c.title }}</a>
|
||||
<a href="{{ HTTP_HOST }}/books/{{ book_info.subpath }}/{{ c.url }}">{{ c.title }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
@@ -52,10 +52,10 @@
|
||||
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
{% if prev_topic %}
|
||||
<li><a href="{{ HTTP_HOST }}/books/{{ book_url }}/{{ prev_topic.url }}">Prev - {{ prev_topic.title }}</a></li>
|
||||
<li><a href="{{ HTTP_HOST }}/books/{{ book_info.subpath }}/{{ prev_topic.url }}">Prev - {{ prev_topic.title }}</a></li>
|
||||
{% endif %}
|
||||
{% if next_topic %}
|
||||
<li><a href="{{ HTTP_HOST }}/books/{{ book_url }}/{{ next_topic.url }}">Next - {{ next_topic.title }}</a></li>
|
||||
<li><a href="{{ HTTP_HOST }}/books/{{ book_info.subpath }}/{{ next_topic.url }}">Next - {{ next_topic.title }}</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -18,9 +18,10 @@ from rest_framework.response import Response
|
||||
from compile_server.app.serializers import (UserSerializer,
|
||||
GroupSerializer,
|
||||
ResourceSerializer,
|
||||
ExampleSerializer)
|
||||
ExampleSerializer,
|
||||
BookSerializer)
|
||||
|
||||
from compile_server.app.models import Resource, Example
|
||||
from compile_server.app.models import Resource, Example, Book
|
||||
|
||||
|
||||
class UserViewSet(viewsets.ModelViewSet):
|
||||
@@ -112,38 +113,35 @@ def examples_list(request):
|
||||
|
||||
|
||||
def book_list(request):
|
||||
resources_base_path = os.path.join(settings.RESOURCES_DIR, "books")
|
||||
|
||||
with open(os.path.join(resources_base_path, "book_list.yaml"), 'r') as f:
|
||||
booklist = yaml.load(f)
|
||||
booklist = {'books': Book.objects.all}
|
||||
return render(request, 'book_list.html', booklist)
|
||||
|
||||
|
||||
def book_router(request, book, part, chapter):
|
||||
def book_router(request, subpath, part, chapter):
|
||||
resources_base_path = os.path.join(settings.RESOURCES_DIR, "books")
|
||||
book_path = os.path.join(resources_base_path, book)
|
||||
|
||||
with open(os.path.join(resources_base_path, "book_list.yaml"), 'r') as f:
|
||||
booklist = yaml.load(f)
|
||||
|
||||
# If the book url is not valid, jump back to book list
|
||||
if not os.path.isdir(book_path):
|
||||
matches = Book.objects.filter(subpath=subpath)
|
||||
if not matches:
|
||||
booklist = {'books': Book.object.all}
|
||||
return render(request, 'book_list.html', booklist)
|
||||
|
||||
path = os.path.join(book_path, "chapters.yaml")
|
||||
bk = matches[0]
|
||||
serializer = BookSerializer(bk)
|
||||
|
||||
book = serializer.data
|
||||
|
||||
# open chapters list of book
|
||||
with open(path, 'r') as f:
|
||||
bookdata = yaml.load(f)
|
||||
with open(os.path.join(book['directory'], "chapters.yaml"), 'r') as f:
|
||||
try:
|
||||
bookdata = yaml.load(f.read())
|
||||
except:
|
||||
print format_traceback
|
||||
print 'Could not decode yaml in {}'.format(book['directory'])
|
||||
return
|
||||
|
||||
# store chapters and parts list in htmldata
|
||||
htmldata = bookdata
|
||||
|
||||
# store book url and book title for side bar and absolute path references
|
||||
for b in booklist['books']:
|
||||
if b['url'] == book:
|
||||
htmldata['book_title'] = b['title']
|
||||
htmldata['book_url'] = book
|
||||
htmldata['book_info'] = book
|
||||
|
||||
# store chapter and part numbers for absolute links
|
||||
htmldata['sel_part'] = int(part)
|
||||
@@ -170,10 +168,10 @@ def book_router(request, book, part, chapter):
|
||||
|
||||
# load page, if part or chapter is out of range go to unknown page link
|
||||
if inrange:
|
||||
mdcontent_page = os.path.join(book_path,
|
||||
mdcontent_page = os.path.join(book['directory'],
|
||||
"pages",
|
||||
"part%s-chapter%s.md" % (part, chapter))
|
||||
rstcontent_page = os.path.join(book_path,
|
||||
rstcontent_page = os.path.join(book['directory'],
|
||||
"pages",
|
||||
"part%s-chapter%s.rst" % (part, chapter))
|
||||
|
||||
|
||||
@@ -47,3 +47,16 @@ cd resources ; git clone https://github.com/AdaCore/Compile_And_Prove_Demo.git
|
||||
./manage.py fill_examples --remove_all
|
||||
list="hello_world absolute_value bitwise_swap saturate_angle sensor_average strings communications landing_procedure"
|
||||
for a in $list; do ./manage.py fill_examples --dir=resources/Compile_And_Prove_Demo/examples/$a ; done
|
||||
|
||||
################
|
||||
# Import books #
|
||||
################
|
||||
|
||||
# TODO: add a facility to do this
|
||||
|
||||
# Setup:
|
||||
cd resources/books ; git clone https://github.com/Robert-Tice/Ada_For_The_CPP_Java_Developer.git ; https://github.com/Robert-Tice/Ada_for_the_C_Programmer_Book.git
|
||||
|
||||
./manage.py fill_books --remove_all
|
||||
list="Ada_for_the_C_Programmer_Book Ada_For_The_CPP_Java_Developer"
|
||||
for a in $list; do ./manage.py fill_books --dir=resources/books/$a ; done
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
books:
|
||||
- title: "Ada For The C Developer"
|
||||
url: "Ada_For_The_C_Programmer_Book"
|
||||
- title: "Ada For the C++ Java Developer"
|
||||
url: "Ada_For_The_CPP_Java_Developer"
|
||||
...
|
||||
18
resources/books/example/chapters.yaml
Normal file
18
resources/books/example/chapters.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
title: "Example Book"
|
||||
description: "This is an example book that is a placeholder."
|
||||
parts:
|
||||
- title: "Part 1"
|
||||
chapters:
|
||||
- title: "Chapter 1"
|
||||
url: "part1-chapter1"
|
||||
- title: "Chapter 2"
|
||||
url: "part1-chapter2"
|
||||
- title: "Part 2"
|
||||
chapters:
|
||||
- title: "Chapter 1"
|
||||
url: "part2-chapter1"
|
||||
- title: "Chapter 2"
|
||||
url: "part2-chapter2"
|
||||
...
|
||||
|
||||
12
resources/books/example/pages/part1-chapter1.md
Normal file
12
resources/books/example/pages/part1-chapter1.md
Normal file
@@ -0,0 +1,12 @@
|
||||
Part 1 Chapter 1
|
||||
=========================
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id massa felis. Nam eget risus sit amet ante tempor lacinia. Mauris ut nunc sem. Cras mattis, nibh quis fermentum porttitor, arcu tortor porttitor magna, ac adipiscing quam urna at lectus. Ut at dolor in elit tempor ultrices sagittis sed lacus. Nullam a lectus mauris. Pellentesque molestie, leo in auctor semper, magna sem mattis tellus, a consectetur nisl tellus volutpat quam. Etiam ultricies risus sed sapien convallis aliquet. Curabitur vehicula purus vitae justo commodo facilisis. Quisque at porta ipsum. Sed purus leo, mattis sed ultricies ac, ultricies eget lacus. Sed ac nibh est. Suspendisse sed orci nisl. Vestibulum ultrices metus sapien, sed interdum nunc. In arcu neque, sollicitudin ut porta eu, viverra at elit. Nam accumsan condimentum metus nec accumsan. Nunc porta consectetur nisi in ornare. Vestibulum tempor mollis dui quis luctus. Aliquam dolor enim, tristique a blandit eu, auctor ut odio.
|
||||
|
||||
Fusce molestie commodo nisi, bibendum dictum purus vehicula vel. Nulla mattis lobortis ipsum ac ornare. Integer sed erat vel mauris volutpat sodales nec auctor nulla. Aliquam ac adipiscing erat. Aliquam erat volutpat. Aenean fringilla congue odio non mattis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque porta vehicula diam, et placerat eros iaculis et. Cras nec ante ipsum, eu cursus sem. Suspendisse nec orci neque, ac egestas sapien.
|
||||
|
||||
Pellentesque augue neque, bibendum eu elementum non, aliquam non nunc. Sed eget dolor vel nibh tincidunt viverra. Pellentesque elementum magna id dolor sodales ut feugiat ligula volutpat. Proin ultricies, quam id viverra dictum, velit nulla varius eros, fringilla vestibulum felis arcu at felis. Vivamus neque metus, gravida non dictum vehicula, pulvinar a tortor. In tristique ullamcorper diam vel ultrices. Nam lobortis lectus eget tortor ullamcorper et suscipit sapien placerat. Cras urna neque, laoreet at dictum vel, elementum sed dolor. Duis sem eros, tincidunt quis venenatis in, facilisis non dolor. Phasellus leo diam, semper in tempus et, tempor vel sapien. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
|
||||
|
||||
Mauris et eros erat, elementum iaculis velit. Donec nec quam felis, sed consequat velit. Nam dolor velit, bibendum vitae convallis id, semper sit amet diam. Integer auctor ultrices metus luctus mattis. Nulla sagittis suscipit arcu, et consequat ipsum dignissim eu. Nulla laoreet libero eget erat fermentum id porttitor odio blandit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nullam eget nunc eget tortor pretium sodales. Curabitur dapibus tristique lorem nec dignissim. Nullam pretium laoreet arcu ut semper. Nam ac risus et lacus auctor tempor. Curabitur bibendum, est tristique fermentum mattis, quam libero rutrum enim, at interdum dolor nisi ac nisi. Morbi ac tellus sem. In ornare vehicula risus sit amet venenatis. Pellentesque magna tellus, suscipit ac dapibus ut, rhoncus nec ante. Nullam ac purus eu massa vestibulum luctus a sed erat.
|
||||
|
||||
Nam lobortis aliquam scelerisque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor nisl feugiat nunc iaculis malesuada. Vestibulum neque nunc, adipiscing lacinia vehicula ut, blandit at diam. Pellentesque lobortis, justo non sollicitudin vestibulum, est tortor mattis sem, at pulvinar ante felis non ligula. Integer consequat congue adipiscing. Proin ut sodales nunc. Ut eleifend venenatis aliquam. Phasellus et viverra mauris. Quisque commodo sodales feugiat. Proin dignissim mollis quam, vel tristique velit sodales in. Aliquam egestas euismod venenatis.
|
||||
12
resources/books/example/pages/part1-chapter2.rst
Normal file
12
resources/books/example/pages/part1-chapter2.rst
Normal file
@@ -0,0 +1,12 @@
|
||||
Part 1 Chapter 2
|
||||
=========================
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id massa felis. Nam eget risus sit amet ante tempor lacinia. Mauris ut nunc sem. Cras mattis, nibh quis fermentum porttitor, arcu tortor porttitor magna, ac adipiscing quam urna at lectus. Ut at dolor in elit tempor ultrices sagittis sed lacus. Nullam a lectus mauris. Pellentesque molestie, leo in auctor semper, magna sem mattis tellus, a consectetur nisl tellus volutpat quam. Etiam ultricies risus sed sapien convallis aliquet. Curabitur vehicula purus vitae justo commodo facilisis. Quisque at porta ipsum. Sed purus leo, mattis sed ultricies ac, ultricies eget lacus. Sed ac nibh est. Suspendisse sed orci nisl. Vestibulum ultrices metus sapien, sed interdum nunc. In arcu neque, sollicitudin ut porta eu, viverra at elit. Nam accumsan condimentum metus nec accumsan. Nunc porta consectetur nisi in ornare. Vestibulum tempor mollis dui quis luctus. Aliquam dolor enim, tristique a blandit eu, auctor ut odio.
|
||||
|
||||
Fusce molestie commodo nisi, bibendum dictum purus vehicula vel. Nulla mattis lobortis ipsum ac ornare. Integer sed erat vel mauris volutpat sodales nec auctor nulla. Aliquam ac adipiscing erat. Aliquam erat volutpat. Aenean fringilla congue odio non mattis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque porta vehicula diam, et placerat eros iaculis et. Cras nec ante ipsum, eu cursus sem. Suspendisse nec orci neque, ac egestas sapien.
|
||||
|
||||
Pellentesque augue neque, bibendum eu elementum non, aliquam non nunc. Sed eget dolor vel nibh tincidunt viverra. Pellentesque elementum magna id dolor sodales ut feugiat ligula volutpat. Proin ultricies, quam id viverra dictum, velit nulla varius eros, fringilla vestibulum felis arcu at felis. Vivamus neque metus, gravida non dictum vehicula, pulvinar a tortor. In tristique ullamcorper diam vel ultrices. Nam lobortis lectus eget tortor ullamcorper et suscipit sapien placerat. Cras urna neque, laoreet at dictum vel, elementum sed dolor. Duis sem eros, tincidunt quis venenatis in, facilisis non dolor. Phasellus leo diam, semper in tempus et, tempor vel sapien. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
|
||||
|
||||
Mauris et eros erat, elementum iaculis velit. Donec nec quam felis, sed consequat velit. Nam dolor velit, bibendum vitae convallis id, semper sit amet diam. Integer auctor ultrices metus luctus mattis. Nulla sagittis suscipit arcu, et consequat ipsum dignissim eu. Nulla laoreet libero eget erat fermentum id porttitor odio blandit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nullam eget nunc eget tortor pretium sodales. Curabitur dapibus tristique lorem nec dignissim. Nullam pretium laoreet arcu ut semper. Nam ac risus et lacus auctor tempor. Curabitur bibendum, est tristique fermentum mattis, quam libero rutrum enim, at interdum dolor nisi ac nisi. Morbi ac tellus sem. In ornare vehicula risus sit amet venenatis. Pellentesque magna tellus, suscipit ac dapibus ut, rhoncus nec ante. Nullam ac purus eu massa vestibulum luctus a sed erat.
|
||||
|
||||
Nam lobortis aliquam scelerisque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor nisl feugiat nunc iaculis malesuada. Vestibulum neque nunc, adipiscing lacinia vehicula ut, blandit at diam. Pellentesque lobortis, justo non sollicitudin vestibulum, est tortor mattis sem, at pulvinar ante felis non ligula. Integer consequat congue adipiscing. Proin ut sodales nunc. Ut eleifend venenatis aliquam. Phasellus et viverra mauris. Quisque commodo sodales feugiat. Proin dignissim mollis quam, vel tristique velit sodales in. Aliquam egestas euismod venenatis.
|
||||
12
resources/books/example/pages/part2-chapter1.md
Normal file
12
resources/books/example/pages/part2-chapter1.md
Normal file
@@ -0,0 +1,12 @@
|
||||
Part 2 Chapter 1
|
||||
=========================
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id massa felis. Nam eget risus sit amet ante tempor lacinia. Mauris ut nunc sem. Cras mattis, nibh quis fermentum porttitor, arcu tortor porttitor magna, ac adipiscing quam urna at lectus. Ut at dolor in elit tempor ultrices sagittis sed lacus. Nullam a lectus mauris. Pellentesque molestie, leo in auctor semper, magna sem mattis tellus, a consectetur nisl tellus volutpat quam. Etiam ultricies risus sed sapien convallis aliquet. Curabitur vehicula purus vitae justo commodo facilisis. Quisque at porta ipsum. Sed purus leo, mattis sed ultricies ac, ultricies eget lacus. Sed ac nibh est. Suspendisse sed orci nisl. Vestibulum ultrices metus sapien, sed interdum nunc. In arcu neque, sollicitudin ut porta eu, viverra at elit. Nam accumsan condimentum metus nec accumsan. Nunc porta consectetur nisi in ornare. Vestibulum tempor mollis dui quis luctus. Aliquam dolor enim, tristique a blandit eu, auctor ut odio.
|
||||
|
||||
Fusce molestie commodo nisi, bibendum dictum purus vehicula vel. Nulla mattis lobortis ipsum ac ornare. Integer sed erat vel mauris volutpat sodales nec auctor nulla. Aliquam ac adipiscing erat. Aliquam erat volutpat. Aenean fringilla congue odio non mattis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque porta vehicula diam, et placerat eros iaculis et. Cras nec ante ipsum, eu cursus sem. Suspendisse nec orci neque, ac egestas sapien.
|
||||
|
||||
Pellentesque augue neque, bibendum eu elementum non, aliquam non nunc. Sed eget dolor vel nibh tincidunt viverra. Pellentesque elementum magna id dolor sodales ut feugiat ligula volutpat. Proin ultricies, quam id viverra dictum, velit nulla varius eros, fringilla vestibulum felis arcu at felis. Vivamus neque metus, gravida non dictum vehicula, pulvinar a tortor. In tristique ullamcorper diam vel ultrices. Nam lobortis lectus eget tortor ullamcorper et suscipit sapien placerat. Cras urna neque, laoreet at dictum vel, elementum sed dolor. Duis sem eros, tincidunt quis venenatis in, facilisis non dolor. Phasellus leo diam, semper in tempus et, tempor vel sapien. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
|
||||
|
||||
Mauris et eros erat, elementum iaculis velit. Donec nec quam felis, sed consequat velit. Nam dolor velit, bibendum vitae convallis id, semper sit amet diam. Integer auctor ultrices metus luctus mattis. Nulla sagittis suscipit arcu, et consequat ipsum dignissim eu. Nulla laoreet libero eget erat fermentum id porttitor odio blandit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nullam eget nunc eget tortor pretium sodales. Curabitur dapibus tristique lorem nec dignissim. Nullam pretium laoreet arcu ut semper. Nam ac risus et lacus auctor tempor. Curabitur bibendum, est tristique fermentum mattis, quam libero rutrum enim, at interdum dolor nisi ac nisi. Morbi ac tellus sem. In ornare vehicula risus sit amet venenatis. Pellentesque magna tellus, suscipit ac dapibus ut, rhoncus nec ante. Nullam ac purus eu massa vestibulum luctus a sed erat.
|
||||
|
||||
Nam lobortis aliquam scelerisque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor nisl feugiat nunc iaculis malesuada. Vestibulum neque nunc, adipiscing lacinia vehicula ut, blandit at diam. Pellentesque lobortis, justo non sollicitudin vestibulum, est tortor mattis sem, at pulvinar ante felis non ligula. Integer consequat congue adipiscing. Proin ut sodales nunc. Ut eleifend venenatis aliquam. Phasellus et viverra mauris. Quisque commodo sodales feugiat. Proin dignissim mollis quam, vel tristique velit sodales in. Aliquam egestas euismod venenatis.
|
||||
12
resources/books/example/pages/part2-chapter2.rst
Normal file
12
resources/books/example/pages/part2-chapter2.rst
Normal file
@@ -0,0 +1,12 @@
|
||||
Part 2 Chapter 2
|
||||
=========================
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id massa felis. Nam eget risus sit amet ante tempor lacinia. Mauris ut nunc sem. Cras mattis, nibh quis fermentum porttitor, arcu tortor porttitor magna, ac adipiscing quam urna at lectus. Ut at dolor in elit tempor ultrices sagittis sed lacus. Nullam a lectus mauris. Pellentesque molestie, leo in auctor semper, magna sem mattis tellus, a consectetur nisl tellus volutpat quam. Etiam ultricies risus sed sapien convallis aliquet. Curabitur vehicula purus vitae justo commodo facilisis. Quisque at porta ipsum. Sed purus leo, mattis sed ultricies ac, ultricies eget lacus. Sed ac nibh est. Suspendisse sed orci nisl. Vestibulum ultrices metus sapien, sed interdum nunc. In arcu neque, sollicitudin ut porta eu, viverra at elit. Nam accumsan condimentum metus nec accumsan. Nunc porta consectetur nisi in ornare. Vestibulum tempor mollis dui quis luctus. Aliquam dolor enim, tristique a blandit eu, auctor ut odio.
|
||||
|
||||
Fusce molestie commodo nisi, bibendum dictum purus vehicula vel. Nulla mattis lobortis ipsum ac ornare. Integer sed erat vel mauris volutpat sodales nec auctor nulla. Aliquam ac adipiscing erat. Aliquam erat volutpat. Aenean fringilla congue odio non mattis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque porta vehicula diam, et placerat eros iaculis et. Cras nec ante ipsum, eu cursus sem. Suspendisse nec orci neque, ac egestas sapien.
|
||||
|
||||
Pellentesque augue neque, bibendum eu elementum non, aliquam non nunc. Sed eget dolor vel nibh tincidunt viverra. Pellentesque elementum magna id dolor sodales ut feugiat ligula volutpat. Proin ultricies, quam id viverra dictum, velit nulla varius eros, fringilla vestibulum felis arcu at felis. Vivamus neque metus, gravida non dictum vehicula, pulvinar a tortor. In tristique ullamcorper diam vel ultrices. Nam lobortis lectus eget tortor ullamcorper et suscipit sapien placerat. Cras urna neque, laoreet at dictum vel, elementum sed dolor. Duis sem eros, tincidunt quis venenatis in, facilisis non dolor. Phasellus leo diam, semper in tempus et, tempor vel sapien. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
|
||||
|
||||
Mauris et eros erat, elementum iaculis velit. Donec nec quam felis, sed consequat velit. Nam dolor velit, bibendum vitae convallis id, semper sit amet diam. Integer auctor ultrices metus luctus mattis. Nulla sagittis suscipit arcu, et consequat ipsum dignissim eu. Nulla laoreet libero eget erat fermentum id porttitor odio blandit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nullam eget nunc eget tortor pretium sodales. Curabitur dapibus tristique lorem nec dignissim. Nullam pretium laoreet arcu ut semper. Nam ac risus et lacus auctor tempor. Curabitur bibendum, est tristique fermentum mattis, quam libero rutrum enim, at interdum dolor nisi ac nisi. Morbi ac tellus sem. In ornare vehicula risus sit amet venenatis. Pellentesque magna tellus, suscipit ac dapibus ut, rhoncus nec ante. Nullam ac purus eu massa vestibulum luctus a sed erat.
|
||||
|
||||
Nam lobortis aliquam scelerisque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor nisl feugiat nunc iaculis malesuada. Vestibulum neque nunc, adipiscing lacinia vehicula ut, blandit at diam. Pellentesque lobortis, justo non sollicitudin vestibulum, est tortor mattis sem, at pulvinar ante felis non ligula. Integer consequat congue adipiscing. Proin ut sodales nunc. Ut eleifend venenatis aliquam. Phasellus et viverra mauris. Quisque commodo sodales feugiat. Proin dignissim mollis quam, vel tristique velit sodales in. Aliquam egestas euismod venenatis.
|
||||
Reference in New Issue
Block a user