Skip to content

Commit

Permalink
Add EPUB
Browse files Browse the repository at this point in the history
  • Loading branch information
dotzero committed May 16, 2016
1 parent e2919a8 commit 665a547
Show file tree
Hide file tree
Showing 46 changed files with 2,054 additions and 0 deletions.
Binary file added Kingpin.epub
Binary file not shown.
64 changes: 64 additions & 0 deletions build_epub.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import zipfile
from glob import glob
from markdown import Markdown

""" Paths """
APP_PATH = os.path.dirname(os.path.realpath(__file__))
MARKDOWN_PATH = os.path.join(APP_PATH, 'markdown/*.md')
EPUB_PATH = os.path.join(APP_PATH, 'epub/OPS')
CHAPTERS = sorted([os.path.join(APP_PATH, f) for f in glob(MARKDOWN_PATH)])

""" Markdown to XHTML """
TEMPLATE = """<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" xmlns:epub="http://www.idpf.org/2007/ops">
<head><link href="epub.css" media="all" rel="stylesheet" type="text/css" /><title></title></head>
<body>
%s
</body>
</html>
"""

md = Markdown(
output_format="xhtml1",
extensions=['markdown.extensions.smarty'],
extension_configs={
'markdown.extensions.smarty': {
'substitutions': {
'left-single-quote': '&sbquo;', # sb is not a typo!
'right-single-quote': '&lsquo;',
'left-double-quote': '&laquo;',
'right-double-quote': '&raquo;'
}
}
})

for chapter in CHAPTERS:
bodyhtml = md.reset().convert(open(chapter, 'r').read().decode('utf-8'))
xhtml = TEMPLATE % bodyhtml

filename = os.path.splitext(os.path.basename(chapter))[0] + '.xhtml'
filepath = os.path.join(EPUB_PATH, filename)

with open(filepath, 'w') as f:
f.write(xhtml.encode('utf-8'))


""" XHTML to EPUB """
def zipdir(path, ziph):
# ziph is zipfile handle
for root, dirs, files in os.walk(path):
for file in files:
if not file.startswith('.'):
fullpath = os.path.join(root, file)
ziph.write(fullpath, fullpath.replace(path, ''))

zipf = zipfile.ZipFile(os.path.join(APP_PATH, 'Kingpin.epub'), 'w', zipfile.ZIP_DEFLATED)
zipdir(os.path.join(APP_PATH, 'epub'), zipf)
zipf.close()
print 'PDF file Kingpin.epub generated.'
6 changes: 6 additions & 0 deletions epub/META-INF/container.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
<rootfiles>
<rootfile full-path="OPS/content.opf" media-type="application/oebps-package+xml"/>
</rootfiles>
</container>
21 changes: 21 additions & 0 deletions epub/OPS/00.xhtml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" xmlns:epub="http://www.idpf.org/2007/ops">
<head><link href="epub.css" media="all" rel="stylesheet" type="text/css" /><title></title></head>
<body>
<h1>Пролог</h1>
<p>Такси стояло у порога небольшого магазинчика в даунтауне Сан-Франциско, пока Макс расплачивался с водителем и извлекал свою двухметровую тушу с заднего сиденья автомобиля, его густые тёмные волосы были собраны в гладкий хвост за затылке. Он вошел в магазин и подождал, пока машина, привезшая его, не уехала вниз по улице, прежде чем он решился проделать путь до своего убежища, расположенного в двух кварталах отсюда.</p>
<p>Мелкие магазинчики, новостные стойки и киоски, окружавшие его, пробуждались под рассветным небом, офисный планктон сползался в бизнес-центры, возвышавшиеся над ним. Макс тоже собирался работать, и его работа не оставляла ему ни малейшего шанса остаться дома после девяти для здорового полноценного сна. Последние несколько дней он провел в полном уединении. Стоило ему воплотить свой план в жизнь, и он понял, что пути домой не будет. Не будет возможности сбегать куда-нибудь перекусить в обеденное время. Не будет ночных посиделок у мультиплекса. Не будет ничего, пока он не закончит начатое.</p>
<p>Это был день объявления войны. Длительная прогулка по улице, вдоль которой толпились дома с одинаковыми оконными проёмами и отделкой цвета Голден Гейт Бридж, привела его к Пост Стрит Тауэрс. В течение нескольких месяцев он приходил в этот квартирный комплекс, делая все возможное, чтобы не выделяться из толпы иностранных студентов, привлечённых сюда возможностью снять жильё на короткие сроки по разумным ценам. Никто не знал его имени — во всяком случае, настоящего. И никто не знал его прошлого.</p>
<p>Здесь он был не Максом Батлером, смутьяном из небольшого городка, одержимым ломающим жизни насилием, и он не был Максом, самопровозглашенным компьютерным экспертом, которому платили 100 долларов в час за укрепление безопасности сетей компаний Кремниевой долины. Поднимаясь в лифте жилого дома, Макс становился кем-то другим: «Iceman`ом» — восходящим лидером криминальной экономики, ответственным за миллиарды долларов, украденных у американских компаний и их клиентов.</p>
<p>И Iceman был сыт по горло. Месяцами он «имел» продавцов по всей стране, получая кучи номеров кредиток, которые могли стоить сотни тысяч долларов на черном рынке. Но рынок был разрушен. Два года назад агенты секретных служб проехались виртуальным бульдозером сквозь главное место сбора компьютерного подполья, арестовывая главарей под дулом пистолета, и отправляя остальных суетиться в чатах и маленьких веб-форумах, пронизанных дырами в безопасности и кишащих агентами спецслужб и стукачами. Это был полнейший хаос.</p>
<p>Знали они того или нет, но подполью нужен был сильный лидер, чтобы объединить всех. Чтобы навести порядок.</p>
<p>Выйдя из лифта и украдкой заглянув в коридор, чтобы проверить, нет ли кого на хвосте, Макс зашел в свою квартиру и слился с угнетающей духотой арендованной студии. Жара была самой большой проблемой этого места. Она знойной волной исходила от серверов и ноутбуков, втиснутых в любое сколь-нибудь свободное пространство. Как-то летом Макс принес туда несколько вентиляторов, но они помогли не сильно и настолько взвинтили счета за электричество, что хозяин квартиры начал подозревать его в выращивании травки. Однако это были всего лишь машины, вплетенные в одну большую сеть проводами, самые значимые из которых тянулись к гигантской параболической антенне, высунутой из окна, как снайперская винтовка.</p>
<p>Не обращая внимания на все неудобства, Макс сел за клавиатуру и принялся мониторить те сайты, на которых собирались киберпреступники — виртуальные площадки вроде Darkmarket или TalkCash. Два дня, что он занимался хакерством, его пальцы летали над клавиатурой с невероятной скоростью: он взламывал защиту сайтов, воровал их контент, логины, пароли и адреса электронной почты. Когда он уставал, он падал на складную кровать в своей комнате на час-другой, и затем с замутнённым взглядом опять возвращался к работе.</p>
<p>Несколько заключительных ударов по кнопкам клавиатуры, совершённые с той лёгкостью, с которой факир зажигает спичку, уничтожили базы данных сайтов. 16 августа 2006 года он слил беспрецедентное количество электронных адресов пользователям сайтов, которые он взломал: теперь все они были участниками CardersMarket.com, принадлежащего Iceman`у и внезапно ставшего самым большим криминальным рынком в мире, насчитывающим 6 тысяч пользователей и являющимся самым лучшим в своём роде.</p>
<p>Одним выстрелом Макс убил двух зайцев: подорвал годы усердной работы правоохранительных органов и воскресил преступное подполье, в чьих руках были сосредоточены миллиарды долларов.</p>
<p>Во всей России, Украине, Турции и Великобритании, в каждом доме, в каждом офисе, в каждой квартире Америки преступники были ошеломлены известием об этом первом враждебном захвате, произошедшем в подпольном мире. Некоторые из них держали в тумбочках оружие, чтобы защитить свои награбленные миллионы, но они не смогли сделать это. ФБР и агенты Секретной Службы США, потратившие месяцы или даже годы на проникновение в ныне развалившиеся подпольные форумы, с равным ужасом читали сообщение, и на минуту все они: виртуозы хакинга, головорезы русской мафии, мастера поддельных удостоверений и полицейские, поклявшиеся ловить их — были объединены одной мыслью.</p>
<p>Кто такой <em>Iceman</em>?</p>
</body>
</html>
Loading

0 comments on commit 665a547

Please sign in to comment.