bookmaker 0.5.0 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -3,7 +3,7 @@ bookmaker
3
3
 
4
4
  Bookmaker provides authors a free, ruby-based production toolchain for self-published paper and electronic books using the [LaTeX](http://www.latex-project.org/) document preparation system. The code base borrows heavily from [Kitabu](https://github.com/fnando/kitabu), while replacing [Prince](http://princexml.com) as the PDF generator (due to licensing issues).
5
5
 
6
- Bookmaker requires familiarity with LaTeX. Many TeX features are lacking when exporting to HTML, EPUB or MOBI.
6
+ Bookmaker requires familiarity with LaTeX. Many TeX features are lacking when compiling to HTML, EPUB or MOBI.
7
7
 
8
8
  What Does Bookmaker Provide?
9
9
  ----------------------------
@@ -18,7 +18,7 @@ Installation
18
18
 
19
19
  To install Bookmaker, you’ll need a working [Ruby](http://www.ruby-lang.org) 1.9+ installation.
20
20
 
21
- gem install bookmaker
21
+ $ gem install bookmaker
22
22
 
23
23
  <!--
24
24
 
@@ -37,7 +37,7 @@ dependencies.
37
37
  Not installed.
38
38
 
39
39
  There's no requirements here; just make sure you cleared the correct dependency based
40
- on the formats you want to export to.
40
+ on the formats you want to compile to.
41
41
 
42
42
  -->
43
43
 
@@ -46,7 +46,7 @@ How to Use Bookmaker
46
46
 
47
47
  To create a new Bookmaker project, execute the following on the command line:
48
48
 
49
- $ bookmaker new mybook
49
+ $ bookmaker new mybook
50
50
 
51
51
  This command creates a directory <tt>mybook</tt> with the following structure:
52
52
 
@@ -87,14 +87,33 @@ Now it's time to write your e-book. All your book content will be placed on the
87
87
 
88
88
  Please note, **Kitabu** allows multiple file formats. **Bookmaker** only allows <tt>.tex</tt>.
89
89
 
90
- You'll want to see your progress eventually; it's time for you to generate the book PDF. Run the command <tt>bookmaker export</tt> and your book will be created on the <tt>output</tt> directory.
90
+ When you're ready to view your progress, the commands below will compile the book into the <tt>output/</tt> directory in the appropriate format:
91
91
 
92
- Bookmaker can generate a Table of Contents (TOC) based on your h2-h6 tags. The h1 tag is discarded because it's meant to be the book title.
92
+ Compile into: PDF, HTML, Epub, Mobi
93
+
94
+ $ bookmaker compile
95
+
96
+ Compile into a specific format:
97
+
98
+ $ bookmaker compile --only [pdf|html|epub|mobi]
99
+
100
+ When compiling into HTML, Epub or Mobi, **Bookmaker** generates the Table of Contents (TOC) based on the h2-h6 tags. The h1 tag is discarded because it's meant to be the book title.
93
101
 
94
102
  To print the TOC, you need to print a variable called +toc+, using the eRb tag.
95
103
 
96
- <%= toc %>
104
+ <%= toc %>
105
+
106
+ To create valid Mobi for Kindle, you need an appropriate cover image. **Bookmaker** looks for <tt>image/cover.jpg</tt>, and compiles it into the Epub and Mobi files. Refer to the Kindle documentation for the cover requirements.
107
+
108
+ ### Dependencies
109
+
110
+ **Bookmaker** needs the following dependencies satisfied:
97
111
 
112
+ * [xelatex](en.wikipedia.org/wiki/XeTeX), available on via MacTeX (Mac) and MiKTex (Windows, unconfirmed).
113
+ * LaTex to HTML conversion done within the gem itself.
114
+ * HTML to EPUB via [Merovex-EeePub](https://github.com/Merovex/eeepub). Install it directly from Github
115
+ * EPUB to Mobi via [Kindlegen](http://kindlegen.s3.amazonaws.com)
116
+ * Patience - This was developed for my own writing purposes, and is likely incomplete as of this writing.
98
117
 
99
118
  ### References
100
119
 
@@ -123,7 +142,7 @@ included in all copies or substantial portions of the Software.
123
142
 
124
143
  THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
125
144
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
126
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
145
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
127
146
  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
128
147
  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
129
148
  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
@@ -25,7 +25,8 @@ module Bookmaker
25
25
  generator.invoke_all
26
26
  end
27
27
 
28
- desc "export [OPTIONS]", "Export e-book"
28
+ desc "compile [OPTIONS]", "Export e-book"
29
+ map %w(compile export) => :export
29
30
  method_option :only, :type => :string, :desc => "Can be one of: #{FORMATS.join(", ")}"
30
31
  method_option :open, :type => :boolean, :desc => "Automatically open PDF (Preview.app for Mac OS X and xdg-open for Linux)"
31
32
  def export
@@ -13,17 +13,20 @@ module Bookmaker
13
13
  end
14
14
  def copy_templates
15
15
  copy_file "latex.erb", "templates/pdf/layout.erb"
16
+ copy_file "dp-logo.png", "images/dp-logo.png"
16
17
 
17
18
  copy_file "html.erb", "templates/html/layout.erb"
18
19
  copy_file "user.css", "templates/html/user.css"
19
20
  copy_file "layout.css", "templates/html/layout.css"
20
21
  copy_file "syntax.css", "templates/html/syntax.css"
21
22
 
23
+ copy_file "cover.html", "templates/epub/cover.html"
22
24
  copy_file "epub.erb", "templates/epub/page.erb"
23
25
  copy_file "epub.css", "templates/epub/user.css"
26
+ copy_file "cover.jpg", "images/cover.jpg"
24
27
  end
25
28
  def copy_sample_text
26
- copy_file "sample.md" , "text/01-Welcome.md"
29
+ copy_file "sample.tex" , "text/01_First-Chapter/01-Welcome.tex"
27
30
  end
28
31
  def create_directories
29
32
  empty_directory "output"
@@ -25,12 +25,10 @@ module Bookmaker
25
25
  if cover_image.nil?
26
26
  puts " - Consider adding a cover images in /images."
27
27
  else
28
- epub.cover cover_image
28
+ epub.cover cover_image
29
29
  end
30
30
  write_sections!
31
- write_toc! #
32
- # ap cover_page + sections.map(&:filepath) + assets
33
- # exit
31
+ write_toc!
34
32
  epub.files cover_page + sections.map(&:filepath) + assets
35
33
  epub.nav navigation
36
34
 
@@ -100,7 +98,6 @@ module Bookmaker
100
98
  @assets ||= begin
101
99
  assets = Dir[root_dir.join("templates/epub/*.css")]
102
100
  assets += Dir[root_dir.join("images/**/*.{jpg,png,gif}")]
103
- assets += # Dir[root_dir.join("templates/epub/cover.html")]
104
101
  assets
105
102
  end
106
103
  end
@@ -11,8 +11,6 @@ module Bookmaker
11
11
  sections << "<p>#{read_content(section)[0].split(/\n{2,}/).map do |s|
12
12
  s.gsub!(/%.*/, '')
13
13
  s.squish
14
- # s.gsub!("\n", ' ')
15
- # s.chomp
16
14
  end.join("</p>\n\n<p>")}</p>"
17
15
  end
18
16
  text << sections.join("\n\n<hr />\n\n")
@@ -29,7 +27,9 @@ module Bookmaker
29
27
  :toc => toc.to_html,
30
28
  })
31
29
  output = render_template(root_dir.join("templates/html/layout.erb"), locals)
32
- File.open(root_dir.join("output/#{name}.html"), 'w').write(output)
30
+ f = File.open(root_dir.join("output/#{name}.html"), 'w')
31
+ f.write(output)
32
+ f.close
33
33
  true
34
34
  rescue Exception
35
35
  p $!, $@
@@ -22,13 +22,19 @@ module Bookmaker
22
22
  locals['copyright'].gsub!("(C)", "\\copyright{}")
23
23
  output = render_template(root_dir.join("templates/pdf/layout.erb"), locals)
24
24
  File.open(root_dir.join(tex_file), 'w').write(output)
25
+ puts " - Pass 1"
25
26
  spawn_command ["xelatex", tex_file.to_s,]
27
+ puts " - Pass 2"
26
28
  spawn_command ["xelatex", tex_file.to_s,]
27
- spawn_command ["makeindex #{name}.idx"]
28
- # spawn_command ["makeglossaries #{name}.glo"]
29
- spawn_command ["xelatex", tex_file.to_s,]
29
+ if config['is_final'].to_i == 0
30
+ puts " - Pass 3 - Indexing"
31
+ spawn_command ["makeindex #{name}.idx"]
32
+ # spawn_command ["makeglossaries #{name}.glo"]
33
+ spawn_command ["xelatex", tex_file.to_s,]
34
+ spawn_command ["rm *ilg *ind "]
35
+ end
30
36
 
31
- spawn_command ["rm *.glo *.idx *.log *.out *.toc *aux *ilg *ind *ist"]
37
+ spawn_command ["rm *.glo *.idx *.log *.out *.toc *aux *ist"]
32
38
  spawn_command ["mv #{name}.pdf output/#{name}.pdf"]
33
39
  true
34
40
  rescue Exception
@@ -1,3 +1,3 @@
1
1
  module Bookmaker
2
- VERSION = "0.5.0"
2
+ VERSION = "0.5.2"
3
3
  end
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <title>Cover</title>
5
+ <style type="text/css"> img { max-width: 100%; } </style>
6
+ </head>
7
+ <body>
8
+ <div id="cover-image">
9
+ <img src="cover.jpg" alt="Title of this Thing, Second Edition"/>
10
+ </div>
11
+ </body>
12
+ </html>
Binary file
Binary file
@@ -1,5 +1,5 @@
1
1
  \NeedsTeXFormat{LaTeX2e}[1996/06/01]
2
- \documentclass[11pt,twoside,makeidx,hidelinks]{memoir}
2
+ \documentclass[12pt,twoside,makeidx,hidelinks]{memoir}
3
3
  \usepackage{layouts}[2001/04/29]
4
4
  \def\isfinal{<%= is_final %>}
5
5
 
@@ -119,6 +119,8 @@
119
119
  \chapter{#1}
120
120
  \setcounter{section}{\value{renewsection}}
121
121
  }
122
+ \chapterstyle{<%= chapter_style || 'ell'%>}
123
+
122
124
 
123
125
  % Section
124
126
  %---------
@@ -145,7 +147,7 @@
145
147
  \pbreak
146
148
  }%
147
149
 
148
- \newcommand{\smee}[1]{\Dash{}\textsc{\small#1}}
150
+ \newcommand{\smee}[1]{\${-} \textsc{\small#1}}
149
151
  \whenfinal%
150
152
  {\newcommand{\pbreak}{\pfbreak}}%
151
153
  {\newcommand{\pbreak}{\begin{center} \# \# \# \end{center}}}
@@ -216,6 +218,7 @@
216
218
  \vspace*{\fill}
217
219
 
218
220
  \vspace*{\fill}
221
+ \includegraphics[width=0.25\textwidth]{images/dp-logo.png}\\[0cm]
219
222
  \hspace*{\fill}\textsf{Dausha}\hspace*{\fill}\newline%
220
223
  \textsf{Communications}
221
224
  \end{center}
@@ -0,0 +1,7 @@
1
+ \section{Welcome to Bookmaker}
2
+
3
+ Bookmaker provides authors a free, ruby-based production toolchain for self-published paper and electronic books using the LaTeX document preparation system. The code base borrows heavily from Kitabu, while replacing Prince as the PDF generator (due to licensing issues).
4
+
5
+ Bookmaker requires familiarity with LaTeX. Many TeX features are lacking when compiling to HTML, EPUB or MOBI.
6
+
7
+ \textbf{You can safely remove this page and start writing your own novel.}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bookmaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2013-03-03 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &2152975100 !ruby/object:Gem::Requirement
16
+ requirement: &2152979800 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152975100
24
+ version_requirements: *2152979800
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: aruba
27
- requirement: &2152974500 !ruby/object:Gem::Requirement
27
+ requirement: &2152978980 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2152974500
35
+ version_requirements: *2152978980
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: cucumber
38
- requirement: &2152973980 !ruby/object:Gem::Requirement
38
+ requirement: &2152978500 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2152973980
46
+ version_requirements: *2152978500
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: eeepub
49
- requirement: &2152973460 !ruby/object:Gem::Requirement
49
+ requirement: &2152977980 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2152973460
57
+ version_requirements: *2152977980
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: kramdown
60
- requirement: &2152972380 !ruby/object:Gem::Requirement
60
+ requirement: &2152977300 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *2152972380
68
+ version_requirements: *2152977300
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: thor
71
- requirement: &2152971600 !ruby/object:Gem::Requirement
71
+ requirement: &2152976660 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *2152971600
79
+ version_requirements: *2152976660
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: nokogiri
82
- requirement: &2152970760 !ruby/object:Gem::Requirement
82
+ requirement: &2152958140 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *2152970760
90
+ version_requirements: *2152958140
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: notifier
93
- requirement: &2152969440 !ruby/object:Gem::Requirement
93
+ requirement: &2152957520 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,7 +98,7 @@ dependencies:
98
98
  version: '0'
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *2152969440
101
+ version_requirements: *2152957520
102
102
  description: ! 'ODO: Write a gem description'
103
103
  email:
104
104
  - dausha@gmail.com
@@ -135,12 +135,15 @@ files:
135
135
  - lib/bookmaker/toc/html.rb
136
136
  - lib/bookmaker/version.rb
137
137
  - templates/config.erb
138
+ - templates/cover.html
139
+ - templates/cover.jpg
140
+ - templates/dp-logo.png
138
141
  - templates/epub.css
139
142
  - templates/epub.erb
140
143
  - templates/html.erb
141
144
  - templates/latex.erb
142
145
  - templates/layout.css
143
- - templates/sample.md
146
+ - templates/sample.tex
144
147
  - templates/syntax.css
145
148
  - templates/user.css
146
149
  homepage: http://dausha.net
@@ -1,24 +0,0 @@
1
- Welcome to Bookmaker
2
- ====================
3
-
4
- [Bookmaker](http://dausha.net/bookmaker) is easy-to-use e-book framework. You can generate PDF, e-Pub and Mobi files from [Markdown](http://en.wikipedia.org/wiki/Markdown), or plain HTML files.
5
-
6
- You can safely remove this page and start writing your own novel.
7
-
8
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae arcu magna. Curabitur massa augue, scelerisque non ullamcorper ut, molestie sed enim. In quam orci, malesuada sit amet tincidunt in, ultricies sed sem. Ut nisl nulla, tempor quis fermentum nec, consectetur iaculis purus. Maecenas mi libero, convallis ut scelerisque sed, eleifend sed lacus. Ut id turpis leo, sit amet fermentum dolor. Duis scelerisque aliquam nulla in placerat. Etiam aliquam tempor nunc id viverra. Ut molestie sollicitudin odio, cursus laoreet purus hendrerit non. Vestibulum ullamcorper, est nec ultrices scelerisque, orci leo aliquam urna, vel sodales ligula erat ut mi. Cras porta odio in ligula vehicula id feugiat mauris adipiscing. Etiam luctus, arcu id ornare mattis, tortor orci ultrices enim, et dignissim diam risus at dui. In et dui enim. Sed eget vestibulum nulla. Aliquam fermentum, sapien ac egestas elementum, velit dui elementum quam, vitae dictum orci erat eu enim.
9
-
10
- Nulla mi elit, lacinia quis lacinia at, consequat eu dolor. Mauris interdum est quam. In ac ipsum urna. Cras felis est, elementum id suscipit vitae, rutrum ut nisi. Nulla ornare leo ut nisl rhoncus sit amet porta diam gravida. In hac habitasse platea dictumst. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam placerat diam non tellus fermentum ac adipiscing eros pharetra. Vestibulum eleifend eleifend velit sit amet porttitor. Quisque congue vehicula eros eu commodo. Phasellus dictum, massa vel suscipit volutpat, justo sapien iaculis nulla, sit amet condimentum lacus justo in nunc. Vestibulum eget ornare leo. Nulla vehicula fringilla fermentum. Ut vel eros erat.
11
-
12
- Quisque feugiat blandit orci, et faucibus justo rhoncus id. Vestibulum facilisis varius leo, quis facilisis neque vehicula in. Donec eros purus, bibendum vel varius consequat, aliquam sed risus. Sed mattis mattis mi nec cursus. In nec nunc est, ut volutpat arcu. Sed ut suscipit dui. Curabitur sed egestas nisi. Donec id nibh ante. Vivamus id neque nec ligula eleifend semper. Sed vitae justo et sem suscipit porttitor.
13
-
14
- Duis quis dapibus tortor. Sed in tincidunt justo. Nunc in odio tortor. Maecenas eu ipsum magna. Phasellus et justo imperdiet sem volutpat egestas ac id felis. Nulla orci sapien, pellentesque euismod sollicitudin eu, gravida in nisl. Sed in quam felis. Cras in metus eu nisi volutpat eleifend. Quisque eget diam nisi.
15
-
16
- Vestibulum sapien sapien, sodales volutpat tincidunt a, malesuada ut nisl. Phasellus sapien mauris, lacinia feugiat fermentum non, auctor eu arcu. Duis pharetra lobortis tristique. Vivamus ultricies, elit eget lobortis ornare, elit turpis tristique nunc, ut semper libero lacus sit amet justo. Ut at nisi ut urna fermentum scelerisque id et lorem. Fusce massa lectus, lobortis sed semper quis, luctus at tellus. Proin quis leo dui. Cras orci sem, rutrum in tristique ut, facilisis sit amet lorem. Quisque elementum ipsum sed tortor facilisis faucibus dapibus arcu molestie. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
17
-
18
- Sed dapibus tortor ut massa facilisis ac tempor dolor venenatis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed egestas pretium metus ac imperdiet. Proin dictum lectus eget tellus fermentum eu rutrum nisi rutrum. Sed diam tellus, rutrum vitae posuere quis, molestie eget quam. Pellentesque in leo eget lacus ultrices blandit. Sed nec ante a lectus lobortis viverra id et purus. Sed non felis quam. Nulla ac lacus ante, vitae tristique mauris. Maecenas commodo, erat eu pretium interdum, metus justo adipiscing orci, quis rhoncus metus sem at dui. Suspendisse bibendum tincidunt facilisis. Cras interdum suscipit urna, ut pharetra lacus tincidunt non. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras diam purus, porta eget suscipit quis, sodales at orci. Sed suscipit, magna ut lacinia condimentum, diam elit cursus ligula, id sollicitudin purus est sed eros. Cras pulvinar congue augue, at aliquet nisl condimentum ut.
19
-
20
- Aenean at arcu vestibulum velit ultrices pulvinar. Duis sodales hendrerit arcu eget condimentum. Sed id consectetur ipsum. Aliquam tempor sodales erat, aliquet porttitor orci gravida eget. Vivamus odio magna, egestas ac bibendum eu, ornare tempus tortor. Ut pharetra ante libero, quis imperdiet sapien. Nullam malesuada elit vel mauris adipiscing quis auctor ipsum dictum. Quisque sapien eros, molestie eu accumsan quis, porttitor non lorem. Proin ornare ullamcorper mauris, eu ornare turpis tempus et. Praesent aliquam nibh vitae mauris mattis quis pretium magna malesuada. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent id felis ut erat aliquet ultrices. Suspendisse eget placerat augue.
21
-
22
- Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi laoreet tortor vitae augue imperdiet adipiscing. Nullam eget mi metus. Quisque et leo tempor mi luctus malesuada vitae a nunc. Phasellus eleifend lorem sit amet leo rutrum feugiat. Maecenas magna ligula, accumsan sed luctus quis, faucibus in dui. Integer sapien lectus, interdum malesuada iaculis eu, scelerisque nec lorem. Vestibulum mollis vehicula dui, eu ornare lectus consequat sed. Vivamus quis dolor id dolor aliquet vehicula. Vivamus nisi nisl, sagittis non blandit sed, pretium eget lacus. Suspendisse ut neque at tortor scelerisque congue in at tortor.
23
-
24
- Sed sed fermentum risus. Quisque ac orci vel nibh suscipit eleifend eget iaculis libero. Cras et urna vitae turpis interdum tristique. Sed tellus nisi, ultricies at fermentum eget, semper non est. Morbi risus tortor, rutrum ut pulvinar cursus, tempor vel ipsum. Aenean tincidunt pretium justo ut rutrum. Suspendisse vel viverra sapien. Vestibulum eget volutpat nisi. Morbi blandit, odio interdum tempor volutpat, turpis felis egestas dolor, vel ullamcorper augue nulla sed urna. Integer commodo sodales imperdiet.