javascript - code - ¿Cómo ocultar el código de las celdas en el cuaderno de ipython visualizado con nbviewer?
jupyter hide cell (15)
Tengo un cuaderno de ipython / jupyter que visualizo usando NBviewer.
¿Cómo puedo ocultar todo el código del cuaderno representado por NBviewer, de modo que solo se muestre la salida del código (por ejemplo, gráficos y tablas) y las celdas de reducción?
Aquí hay otra solución sugerida por p3trus :
$([IPython.events]).on(''notebook_loaded.Notebook'', function(){
IPython.toolbar.add_buttons_group([
{
''label'' : ''toggle input cells'',
''icon'' : ''icon-refresh'',
''callback'': function(){$(''.input'').slideToggle()}
}
]);
});
Como lo describe
p3trus
: "[Se] agrega un botón a la barra de herramientas del cuaderno de ipython para ocultar / mostrar la celda del código de entrada. Para usarlo, debe colocar el archivo custom.js en su
.ipython_<profile name>/static/custom/
carpeta, donde
es el perfil de ipython en uso ".
Mis propios comentarios: verifiqué esta solución y funciona con iPython 3.1.0.
Aquí se proporciona una buena solución que funciona bien para portátiles exportados a HTML. El sitio web incluso enlaza aquí con esta publicación SO, ¡pero no veo la solución de Chris aquí! (Chris, ¿dónde estás?)
Esta es básicamente la misma solución que la respuesta aceptada de harshil, pero tiene la ventaja de ocultar el código de alternancia en el HTML exportado. También me gusta que este enfoque evite la necesidad de la función HTML de IPython.
Para implementar esta solución, agregue el siguiente código a una celda ''Raw NBConvert'' en la parte superior de su computadora portátil:
<script>
function code_toggle() {
if (code_shown){
$(''div.input'').hide(''500'');
$(''#toggleButton'').val(''Show Code'')
} else {
$(''div.input'').show(''500'');
$(''#toggleButton'').val(''Hide Code'')
}
code_shown = !code_shown
}
$( document ).ready(function(){
code_shown=false;
$(''div.input'').hide()
});
</script>
<form action="javascript:code_toggle()">
<input type="submit" id="toggleButton" value="Show Code">
</form>
Luego simplemente exporte el cuaderno a HTML. Habrá un botón de alternar en la parte superior del cuaderno para mostrar u ocultar el código.
Chris también proporciona un ejemplo here .
Puedo verificar que esto funciona en Jupyter 5.0.0
Actualización
: también es conveniente mostrar / ocultar los elementos
div.prompt
junto con los elementos
div.input
.
Esto elimina el texto
In [##]:
y
Out: [##]
y reduce los márgenes a la izquierda.
Con todas las soluciones anteriores a pesar de que está ocultando el código, aún obtendrá la
[<matplotlib.lines.Line2D at 0x128514278>]
encima de su figura que probablemente no desee.
Si realmente desea deshacerse de la entrada en lugar de solo ocultarla, creo que la solución más limpia es guardar sus figuras en el disco en celdas ocultas, y luego simplemente incluir las imágenes en las celdas Markdown usando, por ejemplo
![Caption](figure1.png)
.
Convierta la celda a Markdown y use la etiqueta HTML5
<details>
como en el ejemplo de
joyrexus
:
https://gist.github.com/joyrexus/16041f2426450e73f5df9391f7f7ae5f
## collapsible markdown?
<details><summary>CLICK ME</summary>
<p>
#### yes, even hidden code blocks!
```python
print("hello world!")
```
</p>
</details>
Escribí un código que lo logra y agrega un botón para alternar la visibilidad del código.
Lo siguiente va en una celda de código en la parte superior de un cuaderno:
from IPython.display import display
from IPython.display import HTML
import IPython.core.display as di # Example: di.display_html(''<h3>%s:</h3>'' % str, raw=True)
# This line will hide code by default when the notebook is exported as HTML
di.display_html(''<script>jQuery(function() {if (jQuery("body.notebook_app").length == 0) { jQuery(".input_area").toggle(); jQuery(".prompt").toggle();}});</script>'', raw=True)
# This line will add a button to toggle visibility of code blocks, for use with the HTML export version
di.display_html(''''''<button onclick="jQuery(''.input_area'').toggle(); jQuery(''.prompt'').toggle();">Toggle code</button>'''''', raw=True)
Puede ver un ejemplo de cómo se ve esto en NBviewer aquí .
Actualización: Esto tendrá un comportamiento divertido con las celdas Markdown en Jupyter, pero funciona bien en la versión de exportación HTML del cuaderno.
Esto ahora es posible directamente desde nbconvert a partir de la versión 5.2.1 : el contenido se puede filtrar utilizando las opciones de exclusión de exportador de plantillas incorporadas. Por ejemplo:
jupyter nbconvert --to pdf --TemplateExporter.exclude_input=True my_notebook.ipynb
excluirá las celdas de "código de entrada", es decir, el código mismo. Existen opciones similares para excluir solicitudes, celdas de reducción, o salidas, o entradas y salidas.
(Estas opciones deberían funcionar independientemente del formato de salida).
Esto generará una salida de notebook IPython. Sin embargo, notará que podrá ver el código de entrada. Puede copiar un cuaderno y luego agregar este código si es necesario para compartirlo con alguien que no necesita ver el código.
from IPython.display import HTML
HTML(''''''<script> $(''div .input'').hide()'''''')
Esto se puede hacer usando un widget IPython
ToggleButton
y un poco de JavaScript.
El siguiente código debe colocarse en una celda de código en la parte superior del documento:
import ipywidgets as widgets
from IPython.display import display, HTML
javascript_functions = {False: "hide()", True: "show()"}
button_descriptions = {False: "Show code", True: "Hide code"}
def toggle_code(state):
"""
Toggles the JavaScript show()/hide() function on the div.input element.
"""
output_string = "<script>$(/"div.input/").{}</script>"
output_args = (javascript_functions[state],)
output = output_string.format(*output_args)
display(HTML(output))
def button_action(value):
"""
Calls the toggle_code function and updates the button description.
"""
state = value.new
toggle_code(state)
value.owner.description = button_descriptions[state]
state = False
toggle_code(state)
button = widgets.ToggleButton(state, description = button_descriptions[state])
button.observe(button_action, "value")
display(button)
Esto crea el siguiente botón para alternar mostrar / ocultar el código para el Jupyter Notebook, predeterminado en el estado "ocultar":
Cuando se establece en el estado "mostrar", puede ver el código para el Jupyter Notebook:
Por otro lado, si bien gran parte de este código debe colocarse al comienzo del Notebook, la ubicación del botón de alternancia es opcional.
Personalmente, prefiero mantenerlo al final del documento.
Para hacerlo, simplemente mueva la línea de
display(button)
a una celda de código separada en la parte inferior de la página:
La solución aceptada también funciona en julia Jupyter / IJulia con las siguientes modificaciones:
display("text/html", """<script>
code_show=true;
function code_toggle() {
if (code_show){
/$("div.input").hide();
} else {
/$("div.input").show();
}
code_show = !code_show
}
/$( document ).ready(code_toggle);
</script>
<form action="javascript:code_toggle()"><input type="submit" value="Click here to toggle on/off the raw code."></form>""")
nota en particular:
-
usar la función de
display
-
escapar del signo
$
(de lo contrario visto como una variable)
La versión más reciente del notebook IPython ya no permite ejecutar javascript en celdas de rebajas, por lo que agregar una nueva celda de rebajas con el siguiente código de javascript ya no funcionará para ocultar las celdas de código (consulte este enlace )
Cambie ~ / .ipython / profile_default / static / custom / custom.js como se muestra a continuación:
code_show=true;
function code_toggle() {
if (code_show){
$(''div.input'').hide();
} else {
$(''div.input'').show();
}
code_show = !code_show
}
$([IPython.events]).on("app_initialized.NotebookApp", function () {
$("#view_menu").append("<li id=/"toggle_toolbar/" title=/"Show/Hide code cells/"><a href=/"javascript:code_toggle()/">Toggle Code Cells</a></li>")
});
Para una mejor visualización con un documento impreso o un informe, también necesitamos eliminar el botón y la capacidad de mostrar u ocultar ciertos bloques de código. Esto es lo que uso (simplemente copie y pegue esto en su primera celda):
# This is a cell to hide code snippets from displaying
# This must be at first cell!
from IPython.display import HTML
hide_me = ''''
HTML(''''''<script>
code_show=true;
function code_toggle() {
if (code_show) {
$(''div.input'').each(function(id) {
el = $(this).find(''.cm-variable:first'');
if (id == 0 || el.text() == ''hide_me'') {
$(this).hide();
}
});
$(''div.output_prompt'').css(''opacity'', 0);
} else {
$(''div.input'').each(function(id) {
$(this).show();
});
$(''div.output_prompt'').css(''opacity'', 1);
}
code_show = !code_show
}
$( document ).ready(code_toggle);
</script>
<form action="javascript:code_toggle()"><input style="opacity:0" type="submit" value="Click here to toggle on/off the raw code."></form>'''''')
Luego en tus siguientes celdas:
hide_me
print "this code will be hidden"
y
print "this code will be shown"
here
hay un buen artículo (el mismo que publicó @Ken) sobre cómo pulir los cuadernos Jpuyter (el nuevo IPython) para su presentación.
Hay innumerables formas de extender Jupyter usando JS, HTML y CSS, incluida la capacidad de comunicarse con el núcleo de Python del portátil desde javascript.
Hay decoradores mágicos para
%%HTML
y
%%javascript
por lo que puede hacer algo como esto en una celda por sí mismo:
%%HTML
<script>
function code_toggle() {
if (code_shown){
$(''div.input'').hide(''500'');
$(''#toggleButton'').val(''Show Code'')
} else {
$(''div.input'').show(''500'');
$(''#toggleButton'').val(''Hide Code'')
}
code_shown = !code_shown
}
$( document ).ready(function(){
code_shown=false;
$(''div.input'').hide()
});
</script>
<form action="javascript:code_toggle()"><input type="submit" id="toggleButton" value="Show Code"></form>
También puedo garantizar que los métodos de Chris funcionan en jupyter 4.XX
hide_input_all
de
nbextensions
(
https://github.com/ipython-contrib/IPython-notebook-extensions
).
Así es cómo:
-
Averigüe dónde está su directorio IPython:
from IPython.utils.path import get_ipython_dir print get_ipython_dir()
-
Descargue nbextensions y muévalo al directorio de IPython.
-
Edite su archivo custom.js en algún lugar del directorio IPython (el mío estaba en profile_default / static / custom ) para que sea similar al custom.example.js en el directorio nbextensions .
-
Agregue esta línea a custom.js :
IPython.load_extensions(''usability/hide_input_all'')
IPython Notebook ahora tendrá un botón para alternar celdas de código, sin importar el libro de trabajo.
(Papel) Imprimir o guardar como HTML
Para aquellos de ustedes que desean imprimir en papel las salidas, las respuestas anteriores parecen no dar una buena salida final. Sin embargo, tomar el código de @Max Masnick y agregar lo siguiente le permite a uno imprimirlo en una página A4 completa.
from IPython.display import display
from IPython.display import HTML
import IPython.core.display as di
di.display_html(''<script>jQuery(function() {if (jQuery("body.notebook_app").length == 0) { jQuery(".input_area").toggle(); jQuery(".prompt").toggle();}});</script>'', raw=True)
CSS = """#notebook div.output_subarea {max-width:100%;}""" #changes output_subarea width to 100% (from 100% - 14ex)
HTML(''<style>{}</style>''.format(CSS))
La razón de la sangría es que la sección de solicitud eliminada por Max Masnick significa que todo se desplaza a la izquierda en la salida.
Sin embargo, esto no hizo nada para el ancho máximo de la salida que estaba restringido a
max-width:100%-14ex;
.
Esto cambia el ancho máximo de output_subarea a
max-width:100%;
.
from IPython.display import HTML
HTML(''''''<script>
code_show=true;
function code_toggle() {
if (code_show){
$(''div.input'').hide();
} else {
$(''div.input'').show();
}
code_show = !code_show
}
$( document ).ready(code_toggle);
</script>
<form action="javascript:code_toggle()"><input type="submit" value="Click here to toggle on/off the raw code."></form>'''''')