Come faccio ad aggiungere contenuto prima di </body> nella pagina estesa?(Modelli KID)
-
22-09-2019 - |
Domanda
Ho master.kid (semplificato):
<html>
<head py:match="item.tag == 'head'">
<title>My Site</title>
</head>
<body py:match="item.tag == 'body'">
<h1>My Site</h1>
<div py:replace="item[:]"></div>
<p id="footer">Copyright Blixt 2010</p>
</body>
</html>
E miapagina.kid:
<html>
<head></head>
<body>
<p>Hello World!</p>
</body>
</html>
Ora voglio che sia possibile aggiungere più contenuti prima del file </body>
tag nell'HTML risultante, specifico per mypage.kid.
Fondamentalmente il risultato dovrebbe essere qualcosa di questo:
<html>
<head>
<title>My Site</title>
</head>
<body>
<h1>My Site</h1>
<p>Hello World!</p>
<p id="footer">Copyright Blixt 2010</p>
<script type="text/javascript">alert('Hello World!');</script>
</body>
</html>
IL <script>
il tag deve essere specificato in mypage.kid.Va bene se devo modificare master.kid in facoltativamente supportare contenuti aggiuntivi prima del </body>
tag, ma qual è il contenuto ha da specificare in mypage.kid.
All'inizio ho pensato di aggiungere un elemento prima di </body>
tagga in master.kid con py:match="item.tag == 'bodyend'"
funzionerebbe.Il problema è che utilizza la posizione dell'elemento in mypage.kid e non la posizione dell'elemento che fa py:match
.Quindi se metto il <bodyend>
etichetta prima </body>
in mypage.kid, viene importato prima <p id="footer">
, e se lo metto qui sotto </body>
resterà lì.
Come faccio a configurare master.kid e mypage.kid per supportare l'aggiunta di contenuti immediatamente prima del file </body>
etichetta?
Soluzione
La migliore soluzione che ho trovato è la seguente:
maestro.bambino:
<html>
<head py:match="item.tag == 'head'">
<title>My Site</title>
</head>
<body py:match="item.tag == 'body'">
<h1>My Site</h1>
<div py:replace="item[:]"></div>
<p id="footer">Copyright Blixt 2010</p>
<div py:if="defined('body_end')" py:replace="body_end()"></div>
</body>
</html>
miapagina.kid:
<html>
<head></head>
<body>
<p>Hello World!</p>
<div py:def="body_end()" py:strip="True">
<script type="text/javascript">alert('Hello World!');</script>
</div>
</body>
</html>
La pagina master.kid verifica la presenza di una variabile definita come body_end
, e se esiste una variabile del genere, la chiamerà, sostituendo il contenuto dell'elemento precedente </body>
(altrimenti non produrrà nulla).
Qualsiasi pagina che deve prima generare contenuti </body>
definirà il body_end
funzione utilizzando py:def="body_end()"
.IL py:strip="True"
è lì per rimuovere l'involucro <div>
.