mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
436 lines
13 KiB
HTML
436 lines
13 KiB
HTML
{% extends "!layout.html" %}
|
|
|
|
{%- block extrahead %}
|
|
{% if not embedded %}
|
|
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
<script async src="https://www.googletagmanager.com/gtag/js?id=G-YMW4X5CSKP"></script>
|
|
<script>
|
|
window.dataLayer = window.dataLayer || [];
|
|
function gtag(){dataLayer.push(arguments);}
|
|
gtag('js', new Date());
|
|
|
|
gtag('config', 'G-YMW4X5CSKP');
|
|
</script>
|
|
<!-- InMobi Choice. Consent Manager Tag v3.0 (for TCF 2.2) -->
|
|
<script type="text/javascript" async=true>
|
|
(function() {
|
|
var host = window.location.hostname;
|
|
var element = document.createElement('script');
|
|
var firstScript = document.getElementsByTagName('script')[0];
|
|
var url = 'https://cmp.inmobi.com'
|
|
.concat('/choice/', '593Yp13RM2k2D', '/', host, '/choice.js?tag_version=V3');
|
|
var uspTries = 0;
|
|
var uspTriesLimit = 3;
|
|
element.async = true;
|
|
element.type = 'text/javascript';
|
|
element.src = url;
|
|
|
|
firstScript.parentNode.insertBefore(element, firstScript);
|
|
|
|
function makeStub() {
|
|
var TCF_LOCATOR_NAME = '__tcfapiLocator';
|
|
var queue = [];
|
|
var win = window;
|
|
var cmpFrame;
|
|
|
|
function addFrame() {
|
|
var doc = win.document;
|
|
var otherCMP = !!(win.frames[TCF_LOCATOR_NAME]);
|
|
|
|
if (!otherCMP) {
|
|
if (doc.body) {
|
|
var iframe = doc.createElement('iframe');
|
|
|
|
iframe.style.cssText = 'display:none';
|
|
iframe.name = TCF_LOCATOR_NAME;
|
|
doc.body.appendChild(iframe);
|
|
} else {
|
|
setTimeout(addFrame, 5);
|
|
}
|
|
}
|
|
return !otherCMP;
|
|
}
|
|
|
|
function tcfAPIHandler() {
|
|
var gdprApplies;
|
|
var args = arguments;
|
|
|
|
if (!args.length) {
|
|
return queue;
|
|
} else if (args[0] === 'setGdprApplies') {
|
|
if (
|
|
args.length > 3 &&
|
|
args[2] === 2 &&
|
|
typeof args[3] === 'boolean'
|
|
) {
|
|
gdprApplies = args[3];
|
|
if (typeof args[2] === 'function') {
|
|
args[2]('set', true);
|
|
}
|
|
}
|
|
} else if (args[0] === 'ping') {
|
|
var retr = {
|
|
gdprApplies: gdprApplies,
|
|
cmpLoaded: false,
|
|
cmpStatus: 'stub'
|
|
};
|
|
|
|
if (typeof args[2] === 'function') {
|
|
args[2](retr);
|
|
}
|
|
} else {
|
|
if(args[0] === 'init' && typeof args[3] === 'object') {
|
|
args[3] = Object.assign(args[3], { tag_version: 'V3' });
|
|
}
|
|
queue.push(args);
|
|
}
|
|
}
|
|
|
|
function postMessageEventHandler(event) {
|
|
var msgIsString = typeof event.data === 'string';
|
|
var json = {};
|
|
|
|
try {
|
|
if (msgIsString) {
|
|
json = JSON.parse(event.data);
|
|
} else {
|
|
json = event.data;
|
|
}
|
|
} catch (ignore) {}
|
|
|
|
var payload = json.__tcfapiCall;
|
|
|
|
if (payload) {
|
|
window.__tcfapi(
|
|
payload.command,
|
|
payload.version,
|
|
function(retValue, success) {
|
|
var returnMsg = {
|
|
__tcfapiReturn: {
|
|
returnValue: retValue,
|
|
success: success,
|
|
callId: payload.callId
|
|
}
|
|
};
|
|
if (msgIsString) {
|
|
returnMsg = JSON.stringify(returnMsg);
|
|
}
|
|
if (event && event.source && event.source.postMessage) {
|
|
event.source.postMessage(returnMsg, '*');
|
|
}
|
|
},
|
|
payload.parameter
|
|
);
|
|
}
|
|
}
|
|
|
|
while (win) {
|
|
try {
|
|
if (win.frames[TCF_LOCATOR_NAME]) {
|
|
cmpFrame = win;
|
|
break;
|
|
}
|
|
} catch (ignore) {}
|
|
|
|
if (win === window.top) {
|
|
break;
|
|
}
|
|
win = win.parent;
|
|
}
|
|
if (!cmpFrame) {
|
|
addFrame();
|
|
win.__tcfapi = tcfAPIHandler;
|
|
win.addEventListener('message', postMessageEventHandler, false);
|
|
}
|
|
};
|
|
|
|
makeStub();
|
|
|
|
function makeGppStub() {
|
|
const CMP_ID = 10;
|
|
const SUPPORTED_APIS = [
|
|
'2:tcfeuv2',
|
|
'6:uspv1',
|
|
'7:usnatv1',
|
|
'8:usca',
|
|
'9:usvav1',
|
|
'10:uscov1',
|
|
'11:usutv1',
|
|
'12:usctv1'
|
|
];
|
|
|
|
window.__gpp_addFrame = function (n) {
|
|
if (!window.frames[n]) {
|
|
if (document.body) {
|
|
var i = document.createElement("iframe");
|
|
i.style.cssText = "display:none";
|
|
i.name = n;
|
|
document.body.appendChild(i);
|
|
} else {
|
|
window.setTimeout(window.__gpp_addFrame, 10, n);
|
|
}
|
|
}
|
|
};
|
|
window.__gpp_stub = function () {
|
|
var b = arguments;
|
|
__gpp.queue = __gpp.queue || [];
|
|
__gpp.events = __gpp.events || [];
|
|
|
|
if (!b.length || (b.length == 1 && b[0] == "queue")) {
|
|
return __gpp.queue;
|
|
}
|
|
|
|
if (b.length == 1 && b[0] == "events") {
|
|
return __gpp.events;
|
|
}
|
|
|
|
var cmd = b[0];
|
|
var clb = b.length > 1 ? b[1] : null;
|
|
var par = b.length > 2 ? b[2] : null;
|
|
if (cmd === "ping") {
|
|
clb(
|
|
{
|
|
gppVersion: "1.1", // must be “Version.Subversion”, current: “1.1”
|
|
cmpStatus: "stub", // possible values: stub, loading, loaded, error
|
|
cmpDisplayStatus: "hidden", // possible values: hidden, visible, disabled
|
|
signalStatus: "not ready", // possible values: not ready, ready
|
|
supportedAPIs: SUPPORTED_APIS, // list of supported APIs
|
|
cmpId: CMP_ID, // IAB assigned CMP ID, may be 0 during stub/loading
|
|
sectionList: [],
|
|
applicableSections: [-1],
|
|
gppString: "",
|
|
parsedSections: {},
|
|
},
|
|
true
|
|
);
|
|
} else if (cmd === "addEventListener") {
|
|
if (!("lastId" in __gpp)) {
|
|
__gpp.lastId = 0;
|
|
}
|
|
__gpp.lastId++;
|
|
var lnr = __gpp.lastId;
|
|
__gpp.events.push({
|
|
id: lnr,
|
|
callback: clb,
|
|
parameter: par,
|
|
});
|
|
clb(
|
|
{
|
|
eventName: "listenerRegistered",
|
|
listenerId: lnr, // Registered ID of the listener
|
|
data: true, // positive signal
|
|
pingData: {
|
|
gppVersion: "1.1", // must be “Version.Subversion”, current: “1.1”
|
|
cmpStatus: "stub", // possible values: stub, loading, loaded, error
|
|
cmpDisplayStatus: "hidden", // possible values: hidden, visible, disabled
|
|
signalStatus: "not ready", // possible values: not ready, ready
|
|
supportedAPIs: SUPPORTED_APIS, // list of supported APIs
|
|
cmpId: CMP_ID, // list of supported APIs
|
|
sectionList: [],
|
|
applicableSections: [-1],
|
|
gppString: "",
|
|
parsedSections: {},
|
|
},
|
|
},
|
|
true
|
|
);
|
|
} else if (cmd === "removeEventListener") {
|
|
var success = false;
|
|
for (var i = 0; i < __gpp.events.length; i++) {
|
|
if (__gpp.events[i].id == par) {
|
|
__gpp.events.splice(i, 1);
|
|
success = true;
|
|
break;
|
|
}
|
|
}
|
|
clb(
|
|
{
|
|
eventName: "listenerRemoved",
|
|
listenerId: par, // Registered ID of the listener
|
|
data: success, // status info
|
|
pingData: {
|
|
gppVersion: "1.1", // must be “Version.Subversion”, current: “1.1”
|
|
cmpStatus: "stub", // possible values: stub, loading, loaded, error
|
|
cmpDisplayStatus: "hidden", // possible values: hidden, visible, disabled
|
|
signalStatus: "not ready", // possible values: not ready, ready
|
|
supportedAPIs: SUPPORTED_APIS, // list of supported APIs
|
|
cmpId: CMP_ID, // CMP ID
|
|
sectionList: [],
|
|
applicableSections: [-1],
|
|
gppString: "",
|
|
parsedSections: {},
|
|
},
|
|
},
|
|
true
|
|
);
|
|
} else if (cmd === "hasSection") {
|
|
clb(false, true);
|
|
} else if (cmd === "getSection" || cmd === "getField") {
|
|
clb(null, true);
|
|
}
|
|
//queue all other commands
|
|
else {
|
|
__gpp.queue.push([].slice.apply(b));
|
|
}
|
|
};
|
|
window.__gpp_msghandler = function (event) {
|
|
var msgIsString = typeof event.data === "string";
|
|
try {
|
|
var json = msgIsString ? JSON.parse(event.data) : event.data;
|
|
} catch (e) {
|
|
var json = null;
|
|
}
|
|
if (typeof json === "object" && json !== null && "__gppCall" in json) {
|
|
var i = json.__gppCall;
|
|
window.__gpp(
|
|
i.command,
|
|
function (retValue, success) {
|
|
var returnMsg = {
|
|
__gppReturn: {
|
|
returnValue: retValue,
|
|
success: success,
|
|
callId: i.callId,
|
|
},
|
|
};
|
|
event.source.postMessage(msgIsString ? JSON.stringify(returnMsg) : returnMsg, "*");
|
|
},
|
|
"parameter" in i ? i.parameter : null,
|
|
"version" in i ? i.version : "1.1"
|
|
);
|
|
}
|
|
};
|
|
if (!("__gpp" in window) || typeof window.__gpp !== "function") {
|
|
window.__gpp = window.__gpp_stub;
|
|
window.addEventListener("message", window.__gpp_msghandler, false);
|
|
window.__gpp_addFrame("__gppLocator");
|
|
}
|
|
};
|
|
|
|
makeGppStub();
|
|
|
|
var uspStubFunction = function() {
|
|
var arg = arguments;
|
|
if (typeof window.__uspapi !== uspStubFunction) {
|
|
setTimeout(function() {
|
|
if (typeof window.__uspapi !== 'undefined') {
|
|
window.__uspapi.apply(window.__uspapi, arg);
|
|
}
|
|
}, 500);
|
|
}
|
|
};
|
|
|
|
var checkIfUspIsReady = function() {
|
|
uspTries++;
|
|
if (window.__uspapi === uspStubFunction && uspTries < uspTriesLimit) {
|
|
console.warn('USP is not accessible');
|
|
} else {
|
|
clearInterval(uspInterval);
|
|
}
|
|
};
|
|
|
|
if (typeof window.__uspapi === 'undefined') {
|
|
window.__uspapi = uspStubFunction;
|
|
var uspInterval = setInterval(checkIfUspIsReady, 6000);
|
|
}
|
|
})();
|
|
</script>
|
|
<!-- End InMobi Choice. Consent Manager Tag v3.0 (for TCF 2.2) -->
|
|
<script data-cfasync="false" type="text/javascript">
|
|
var freestar = freestar || {};
|
|
freestar.hitTime = Date.now();
|
|
freestar.queue = freestar.queue || [];
|
|
freestar.config = freestar.config || {};
|
|
freestar.debug = window.location.search.indexOf('fsdebug') === -1 ? false : true;
|
|
freestar.config.enabled_slots = [];
|
|
!function(a,b){var c=b.getElementsByTagName("script")[0],d=b.createElement("script"),e="https://a.pub.network/manual-calibre-ebook-com";e+=freestar.debug?"/qa/pubfig.min.js":"/pubfig.min.js",d.async=!0,d.src=e,c.parentNode.insertBefore(d,c)}(window,document);
|
|
freestar.initCallback = function () { (freestar.config.enabled_slots.length === 0) ? freestar.initCallbackCalled = false : freestar.newAdSlots(freestar.config.enabled_slots) }
|
|
</script>
|
|
|
|
<style type="text/css">
|
|
@media screen and (max-width: 875px) {
|
|
body {
|
|
padding-top: 0;
|
|
padding-bottom: 0;
|
|
}
|
|
div.related { display: none; }
|
|
ul { margin-left: 0.75em; } /* fix bullets being displayed outside container */
|
|
}
|
|
|
|
@media screen and (min-width: 876px) {
|
|
body {
|
|
display: grid;
|
|
grid-template-rows: [top] 3.5ex [r] auto;
|
|
grid-template-columns: [left] 220px [c] auto;
|
|
height: 100vh; width: 100vw;
|
|
max-height: 100vh; max-width: 100vw;
|
|
}
|
|
div.related {
|
|
height: 3.5ex;
|
|
display: flex;
|
|
align-items: center;
|
|
box-sizing: border-box;
|
|
grid-row-start: top; grid-row-end: span 1;
|
|
grid-column-start: left; grid-column-end: span 2;
|
|
}
|
|
div.documentwrapper {
|
|
grid-row-start: r; grid-row-end: span 1;
|
|
grid-column-start: c; grid-column-end: span 1;
|
|
overflow: auto;
|
|
}
|
|
div.related > ul { flex-grow: 10; }
|
|
div.sphinxsidebar {
|
|
overflow-y: auto;
|
|
grid-row-start: r; grid-row-end: span 1;
|
|
grid-column-start: left; grid-column-end: span 2;
|
|
position: static;
|
|
}
|
|
div.document { margin-top: 0; }
|
|
}
|
|
|
|
div.document, div.footer {
|
|
width: auto; /* fix horizontal scrollbar if screen is less that 940px */
|
|
}
|
|
|
|
</style>
|
|
{% endif %}
|
|
{% endblock %}
|
|
|
|
{%- block relbar1 %}{{ relbar() }}{% endblock %}
|
|
|
|
{%- block content %}
|
|
{{ sidebar() }}
|
|
{%- block document %}
|
|
<div class="documentwrapper">
|
|
<div class="body" role="main">
|
|
{% if not embedded %}
|
|
<div id="ad-container" style="text-align:center">
|
|
<div align="center" data-freestar-ad="__970x90 __336x280" id="manualcalibre-ebook_leaderboard_atf">
|
|
<script data-cfasync="false" type="text/javascript">
|
|
freestar.config.enabled_slots.push({ placementName: "manualcalibre-ebook_leaderboard_atf", slotId: "manualcalibre-ebook_leaderboard_atf" });
|
|
</script>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
{% block body %} {% endblock %}
|
|
<div class="footer" role="contentinfo">
|
|
{%- if show_copyright %}
|
|
{%- if hasdoc('copyright') %}
|
|
{% trans path=pathto('copyright'), copyright=copyright|e %}© <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
|
|
{%- else %}
|
|
{% trans copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}
|
|
{%- endif %}
|
|
{%- endif %}
|
|
{%- if last_updated %}
|
|
{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
|
|
{%- endif %}
|
|
{%- if show_sphinx %}
|
|
{% trans sphinx_version=sphinx_version|e %}Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
|
|
{%- endif %}
|
|
</div> <!-- end content-footer -->
|
|
</div> <!-- end class="body" -->
|
|
</div> <!-- end documentwrapper -->
|
|
{%- endblock document %}
|
|
{%- endblock content %}
|
|
|
|
{%- block footer -%} {%- endblock footer -%}
|