lektor-website/docs/api/environment/virtualpathresolver/index.html

329 lines
14 KiB
HTML
Raw Normal View History

2022-02-20 15:15:38 +01:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
2022-02-23 01:16:10 +01:00
<link rel="stylesheet" href="../../../../static/styles.css?h=7041cc50">
2022-02-20 15:15:38 +01:00
<link rel="stylesheet" href="../../../../static/pygments.css">
<link rel="shortcut icon" href="../../../../static/favicon.png?h=fa09bedd">
<title>virtualpathresolver | Documentation | Lektor Static Content Management System</title>
</head>
<body class="default">
<nav class="navbar navbar-inverse navbar-static-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#navbar"
aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="../../../../">Lektor</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><a href="../../../../downloads/">Download</a></li>
<li class="active"><a href="../../../">Documentation</a></li>
<li><a href="../../../../showcase/">Showcase</a></li>
<li><a href="../../../../plugins/">Plugins</a></li>
<li><a href="../../../../community/">Community</a></li>
<li><a href="../../../../blog/">Blog</a></li>
</ul>
</div>
</div>
</nav>
<div class="body-wrapper">
<div class="container">
<div class="row">
<div class="col-sm-3">
<ul class="tree-nav nocontent">
<li><a href="../../../">Welcome</a></li>
<li><a href="../../../what/">What is Lektor</a>
<li><a href="../../../installation/">Installation</a>
<li><a href="../../../quickstart/">Quickstart</a>
<li><a href="../../../project/">Project</a>
<li><a href="../../../content/">Content</a>
<li><a href="../../../templates/">Templates</a>
<li><a href="../../../themes/">Themes</a>
<li><a href="../../../guides/">Guides</a>
<li><a href="../../../deployment/">Deployment</a>
<li><a href="../../../plugins/">Plugins</a>
<li><a href="../../../models/">Data Modelling</a>
<li><a href="../../../cli/">Command Line</a>
<li><a href="../../">API</a>
<ul>
<li><a href="../../build/">Build System</a>
<li><a href="../../databags/">Databags</a>
<li><a href="../../db/">Database</a>
<li><a href="../">Environment</a>
<ul>
<li><a href="../add-build-program/">add_build_program()</a>
<li><a href="../add-publisher/">add_publisher()</a>
<li><a href="../add-type/">add_type()</a>
<li><a href="../generator/">generator()</a>
<li><a href="../jinja-env/">jinja_env</a>
<li><a href="../load-config/">load_config()</a>
<li><a href="../load-plugins/">load_plugins()</a>
<li><a href="../new-pad/">new_pad()</a>
<li><a href="../render-template/">render_template()</a>
<li><a href="../urlresolver/">urlresolver()</a>
<li class="active"><a href="./">virtualpathresolver()</a>
<ul></ul>
</ul>
<li><a href="../../plugins/">Plugins</a>
<li><a href="../../project/">Project</a>
<li><a href="../../publisher/">Publisher</a>
<li><a href="../../templates/">Template API</a>
<li><a href="../../utils/">Utilities</a>
</ul>
<li><a href="../../../search/">Search</a>
</ul>
<div class="visible-md-block visible-lg-block">
<h4>This Page</h4>
<ul class="toc">
<li><a href="#example">Example</a></li>
</ul>
</div>
</div>
<div class="col-sm-9 doc-styling">
<h1><i class="glyphicon glyphicon-cog"></i> <code class="obj">virtualpathresolver</code> <span class="sig">(<code>prefix</code>)</span></h1>
<ul class=page-meta>
<li>Method of <a href="../">Environment</a></li>
<li>New in Lektor Version <em>2.0</em></li>
</ul>
<p>When implementing <a href="../../db/obj/" class="ref">Virtual Source Objects</a> it's important
that you can locate them. While virtual sources do not appear as children of
pages they can be navigated to through the database pad. This is achieved
through custom virtual path resolvers.</p>
<p>Each source object needs to be a unique prefix which identifies all instances
of it. For instance if you want to implement a special page (like a feed)
that would exist for specific pages, then you can register the virtual path
prefix <code>feed</code> with your plugin. Though you should use more descriptive names
for your plugins as these paths are shared.</p>
<p>If a user then resolves the page <code>/my-page@feed</code> it would invoke your URL
resolver with the record <code>my-page</code> and an empty list (rest of the path
segments). If they would request <code>/my-page@feed/recent</code> then it would
pass <code>['recent']</code> as path segments.</p>
<h2 id="example">Example</h2><p>Here an example that would implement a virtual source for feeds and an
associated virtual path resolver:</p>
2022-02-23 01:16:10 +01:00
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">lektor.sourceobj</span> <span class="kn">import</span> <span class="n">VirtualSourceObject</span>
2022-02-20 15:15:38 +01:00
<span class="kn">from</span> <span class="nn">lektor.utils</span> <span class="kn">import</span> <span class="n">build_url</span>
<span class="k">class</span> <span class="nc">Feed</span><span class="p">(</span><span class="n">VirtualSourceObject</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">,</span> <span class="n">version</span><span class="o">=</span><span class="s1">&#39;default&#39;</span><span class="p">):</span>
<span class="n">VirtualSourceObject</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">version</span> <span class="o">=</span> <span class="n">version</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">path</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">@feed</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">record</span><span class="o">.</span><span class="n">path</span><span class="p">,</span>
<span class="s1">&#39;/&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">version</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">version</span> <span class="o">!=</span> <span class="s1">&#39;default&#39;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
<span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">url_path</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">build_url</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">record</span><span class="o">.</span><span class="n">url_path</span><span class="p">,</span> <span class="s1">&#39;feed.xml&#39;</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">on_setup_env</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span>
<span class="nd">@self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">virtualpathresolver</span><span class="p">(</span><span class="s1">&#39;feed&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">resolve_virtual_path</span><span class="p">(</span><span class="n">record</span><span class="p">,</span> <span class="n">pieces</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">pieces</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Feed</span><span class="p">(</span><span class="n">record</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">pieces</span> <span class="o">==</span> <span class="p">[</span><span class="s1">&#39;recent&#39;</span><span class="p">]:</span>
<span class="k">return</span> <span class="n">Feed</span><span class="p">(</span><span class="n">record</span><span class="p">,</span> <span class="n">version</span><span class="o">=</span><span class="s1">&#39;recent&#39;</span><span class="p">)</span>
</pre></div>
<div class="comment-box">
<h2>Comments</h2>
<div id="disqus_thread"></div>
<script>
var disqus_config = function() { this.page.identifier = "/docs/api/environment/virtualpathresolver"; this.page.url = "https://www.getlektor.com/docs/api/environment/virtualpathresolver/"; };
(function() {
var d = document, s = d.createElement('script');
s.src = '//lektordocumentation.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>
Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript"
rel="nofollow">comments powered by Disqus.</a>
</noscript>
</div>
</div>
</div>
</div>
</div>
<div class="bottomsummary">
<div class="container">
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-4 icon-bar">
<a href="https://github.com/lektor/lektor/" title="Lektor on GitHub"
><i class="fa fa-github"></i></a>
<a href="https://github.com/lektor/lektor/issues/" title="Report Issues for Lektor"
><i class="fa fa-bug"></i></a>
<a href="https://twitter.com/getlektor" title="Find Lektor on Twitter"
><i class="fa fa-twitter"></i></a>
<a href="https://gitter.im/lektor/lektor" title="Chat on Gitter"
><i class="fa fa-comment"></i></a>
<a href="https://github.com/lektor/lektor-website/tree/master/content/docs/api/environment/virtualpathresolver/contents.lr" title="View source for this page"><i class="fa fa-code"></i></a>
</div>
<div class="col-sm-8">
<a href="../../../../license/">License & Copyright</a>
<a href="../../../../contact/">Contact</a>
Made with <i class="fa fa-fw fa-heart" title="Heart"><span hidden>Heart</span></i> in Carinthia
</div>
</div>
</div>
</footer>
2022-02-23 01:16:10 +01:00
<script type=text/javascript src="../../../../static/app.js?h=d85eb4b1" charset="utf-8"></script>
2022-02-20 15:15:38 +01:00
<script>
((window.gitter = {}).chat = {}).options = {
room: 'lektor/lektor',
activationElement: null
};
document.write('<button class="js-gitter-toggle-chat-button">Toggle Chat</button>');
var dnt = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
if (dnt != "1" && dnt != "yes") {
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-70822533-1', 'auto');
ga('set', 'anonymizeIp', true);
ga('send', 'pageview');
} else {
console.debug("Respecting Do-Not-Track, not running analytics.");
}
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
<script async defer id="github-bjs" src="https://buttons.github.io/buttons.js"></script>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
<script src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer></script>
</body>
</html>