Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/basi-del-linguaggio/input.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ variabile = input("Messaggio per l'utente: ")

### Esempio

```py live_py
```py live
name = input("Come ti chiami? ")
print(f"Ciao, {name}!")
```
Expand Down Expand Up @@ -44,15 +44,15 @@ Se si inserisce un valore non valido per la conversione (ad esempio, testo anzic

### Esempio con numeri interi:

```py live_py
```py live
age = input("Quanti anni hai? ")
year_of_birth = 2025 - int(age) # Converte la stringa in un intero
print(f"Sei nato nell'anno {year_of_birth}.")
```

### Esempio con numeri decimali:

```py live_py
```py live
height = input("Qual è la tua altezza in metri? ")
height = float(height) # Converte la stringa in un numero decimale
print(f"La tua altezza in centimetri è {height * 100}.")
Expand Down
14 changes: 7 additions & 7 deletions docs/basi-del-linguaggio/le-stringhe.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ hacker = "Kevin \"Condor\" Mitnick"
## Unire più stringhe: la concatenazione
La **concatenazione** di stringhe è una pratica comune in programmazione e consiste nell'unire due o più stringhe per formarne una più lunga. Questa operazione è utile quando si desidera costruire un messaggio o una frase combinando parti di testo. Python offre diverse modalità per eseguire la concatenazione, una delle quali è l'utilizzo dell'operatore `+`. Ecco un esempio:

```py live_py
```py live
# Esempio di concatenazione di stringhe
greeting = "It's-a me"
name = "Mario"
Expand All @@ -33,7 +33,7 @@ print(message)
```

Oltre all'operatore `+`, in alcune occasioni può essere utile l'operatore `*`, che consente di ripetere una stringa un certo numero di volte. Ad esempio:
```py live_py
```py live
lol = "😂" * 10
print(lol)
```
Expand All @@ -49,7 +49,7 @@ f"Testo normale {espressione} altro testo"
```
Dove `{espressione}` può essere sostituito con qualsiasi espressione Python valida, comprese variabili, operazioni, chiamate di funzioni, ecc.

```py live_py
```py live
name1 = "Tony"
name2 = "Steve"
message = f"{name1} and {name2} are BFFs"
Expand All @@ -64,7 +64,7 @@ In Python, come in molti altri linguaggi di programmazione, gli indici delle seq
:::

La sintassi per accedere a un carattere di una stringa è `stringa[indice]`. Ad esempio:
```py live_py
```py live
name = "Luigi"
first_letter = name[0]
print(first_letter)
Expand All @@ -77,7 +77,7 @@ Vediamo di seguito alcune delle più utili e comuni.

### `len()`
La funzione `len(stringa)` restituisce la lunghezza di una stringa, ovvero il numero di caratteri che la compongono. Ad esempio:
```py live_py
```py live
motto = "supercalifragilistichespiralidoso"
print(f"{motto} ha {len(motto)} caratteri")
```
Expand All @@ -87,14 +87,14 @@ A differenza degli altri metodi, `len()` è una funzione propria di Python e non

### `upper()` e `lower()`
Le funzioni `upper()` e `lower()`, che al contrario di `len()` sono funzioni specifiche delle stringhe, permettono di convertire una stringa in maiuscolo o minuscolo rispettivamente. Ad esempio:
```py live_py
```py live
message = "A vEry sTrAnge mEsSaGe"
print(f"'{message.upper()}' is the same as '{message.lower()}'")
```

### `replace()`
La funzione `replace(old, new)` serve a rimpiazzare una parte di una stringa con un'altra. Questa funzione ha una particolarità: riceve in input due parametri e non uno solo. I parametri vanno elencati separandoli con una virgola. Il parametro `old` rappresenta la parte della stringa da cercare e sostituire, mentre `new` rappresenta la parte di stringa nuova. Ad esempio:
```py live_py
```py live
name = "Mario"
print(name.replace("M", "W"))
```
Expand Down
4 changes: 2 additions & 2 deletions docs/basi-del-linguaggio/le-variabili.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -96,15 +96,15 @@ condizione = True # tipo bool

Se vuoi conoscere il tipo di una variabile, puoi usare la funzione `type()`:

```py live_py
```py live
esempio1 = 10
esempio2 = "10"
print(type(esempio1))
print(type(esempio2))
```

Conoscere il tipo di una variabile è importante perché determina le operazioni che possono essere eseguite su quella variabile. Osserva il seguente esempio:
```py live_py
```py live
esempio1 = 10
esempio2 = "10"
print(esempio1 * 10)
Expand Down
4 changes: 2 additions & 2 deletions docs/basi-del-linguaggio/output.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Avrai notato la prima riga nel codice qui sopra: è un **commento**. In Python,
### Prova tu
All'interno di questo libro troverai spesso esempi di codice che potrai eseguire direttamente nel tuo browser. Prova a completare il codice qui sotto per visualizzare il tuo primo output in Python.

```py live_py
```py live
# Completa il codice per stampare il tuo nome
print("Benvenuti al corso di Python!")
print()
Expand All @@ -41,7 +41,7 @@ Il comando `print()` accetta un parametro opzionale chiamato `end`, che consente

Prova a eseguire il codice: cosa succede se modifichi il valore del parametro `end`?

```py live_py
```py live
print("1", end=", ")
print("2", end=", ")
print("3")
Expand Down
121 changes: 121 additions & 0 deletions docs/pyrunner-test.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
---
unlisted: true
title: PyRunner — pagina di test
description: Sandbox di verifica del componente PyRunner (PR1)
---

# PyRunner — sandbox di test

Pagina temporanea per validare la PR1 del nuovo PyRunner. Non è linkata dalla sidebar (`unlisted: true`).

## 1. Fence inline `py live` — esempio base

```py live
nome = "Lia"
print(f"Ciao, {nome}!")
print("Questo è il primo esempio.")
```

## 2. Da file `.py` esterno

import PyRunner from '@theme/PyRunner';

<PyRunner src="_test/hello.py" />

## 3. File `.py` con `### PRE` / `### POST`

Il blocco `PRE` definisce `risultato_atteso`, il blocco `POST` non c'è. Solo il corpo è visibile/editabile.

<PyRunner src="_test/somma.py" title="Test PRE/POST" />

## 4. Fence con errore runtime (deve mostrare stderr in rosso)

```py live
def dividi(a, b):
return a / b

print(dividi(10, 2))
print(dividi(5, 0)) # ZeroDivisionError
```

## 5. Snippet a una riga (no line numbers attesi)

```py live
print("Una riga sola, niente gutter.")
```

## 6. Readonly

```py live readonly
# Questo non si edita.
for i in range(3):
print(f"iterazione {i}")
```

## 7. maxLines piccolo per forzare scroll interno

`maxLines=5` limita l'altezza dell'editor: il codice qui ha ~15 righe, quindi
deve comparire una scrollbar verticale interna al box, senza espandere la pagina.
Quando l'editor scrolla, deve comparire anche il bottone _fullscreen_ in toolbar.

```py live maxLines=5
def saluta(nome):
print(f"Ciao, {nome}!")

def somma(a, b):
return a + b

def fattoriale(n):
if n <= 1:
return 1
return n * fattoriale(n - 1)

saluta("Lia")
saluta("Marco")
print("2 + 3 =", somma(2, 3))
print("5! =", fattoriale(5))
```

## 8. "Spiegamelo facile" — prompt di default

Cliccando l'icona ✨ in toolbar viene copiato negli appunti un prompt didattico
che usa il titolo di questa pagina come `{contextTitle}` e il codice corrente
(edit-aware).

```py live
parola = "ciao"
print(parola.upper())
print(parola[::-1])
```

## 9. "Spiegamelo facile" con prompt custom

```py live
n = 5
print(sum(range(n + 1)))
```

import PyRunnerCustom from '@theme/PyRunner';

<PyRunnerCustom
code={`# Lezione sulle list comprehension
quadrati = [x * x for x in range(5)]
print(quadrati)`}
explainPrompt={`Sto imparando le list comprehension in Python. Spiega il codice qui sotto in 3 frasi, in italiano, indicando come si tradurrebbe nello stesso codice scritto con un ciclo \`for\` esplicito.\n\nCodice:\n\`\`\`python\n{code}\n\`\`\`\n`}
/>

## 10. `noExplain` — niente icona spiega

```py live noExplain
print("Niente bottone bacchetta magica qui.")
```

## 11. Fullscreen forzato (`maxLines=3` per attivare overflow)

```py live maxLines=3
print("Riga 1")
print("Riga 2")
print("Riga 3")
print("Riga 4")
print("Riga 5")
```
110 changes: 83 additions & 27 deletions docusaurus.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ import { themes as prismThemes } from 'prism-react-renderer';
import type { Config } from '@docusaurus/types';
import type * as Preset from '@docusaurus/preset-classic';

// eslint-disable-next-line @typescript-eslint/no-require-imports
const remarkPyRunner = require('./plugins/pyrunner/remark.js');

const config: Config = {
title: 'Python Doesn\'t Byte',
tagline: 'Il libro di testo, reinventato.',
Expand Down Expand Up @@ -45,6 +48,7 @@ const config: Config = {
// Please change this to your repo.
// Remove this to remove the "edit this page" links.
editUrl: 'https://github.com/marcofarina/python-doesnt-byte',
beforeDefaultRemarkPlugins: [remarkPyRunner],
},
blog: {
showReadingTime: true,
Expand Down Expand Up @@ -77,6 +81,54 @@ const config: Config = {

clientModules: ['./src/fonts.ts'],

plugins: [
'./plugins/pyrunner/index.js',
[
'@docusaurus/plugin-content-docs',
{
id: 'programmatore',
path: 'volumes/programmatore',
routeBasePath: 'programmatore',
sidebarPath: './sidebars/programmatore.ts',
editUrl: 'https://github.com/marcofarina/python-doesnt-byte',
beforeDefaultRemarkPlugins: [remarkPyRunner],
},
],
[
'@docusaurus/plugin-content-docs',
{
id: 'artefice',
path: 'volumes/artefice',
routeBasePath: 'artefice',
sidebarPath: './sidebars/artefice.ts',
editUrl: 'https://github.com/marcofarina/python-doesnt-byte',
beforeDefaultRemarkPlugins: [remarkPyRunner],
},
],
[
'@docusaurus/plugin-content-docs',
{
id: 'archivista',
path: 'volumes/archivista',
routeBasePath: 'archivista',
sidebarPath: './sidebars/archivista.ts',
editUrl: 'https://github.com/marcofarina/python-doesnt-byte',
beforeDefaultRemarkPlugins: [remarkPyRunner],
},
],
[
'@docusaurus/plugin-content-docs',
{
id: 'apprendista',
path: 'volumes/apprendista',
routeBasePath: 'apprendista',
sidebarPath: './sidebars/apprendista.ts',
editUrl: 'https://github.com/marcofarina/python-doesnt-byte',
beforeDefaultRemarkPlugins: [remarkPyRunner],
},
],
],

themeConfig: {
// Replace with your project's social card
image: 'img/docusaurus-social-card.jpg',
Expand All @@ -93,36 +145,43 @@ const config: Config = {
},
items: [
{
type: 'docSidebar',
sidebarId: 'docs',
type: 'dropdown',
label: 'Libri',
position: 'left',
label: 'Libro',
items: [
{
type: 'doc',
docId: 'intro',
docsPluginId: 'programmatore',
label: 'Manuale del Programmatore',
},
{
type: 'doc',
docId: 'intro',
docsPluginId: 'artefice',
label: 'Manuale dell\'Artefice',
},
{
type: 'doc',
docId: 'intro',
docsPluginId: 'archivista',
label: 'Manuale dell\'Archivista',
},
{
type: 'doc',
docId: 'intro',
docsPluginId: 'apprendista',
label: 'Biblioteca dell\'Apprendista',
},
],
},
/* {
to: '/blog',
label: 'Blog',
position: 'left'},*/
{
to: '/support/',
label: 'Support',
position: 'right',
className: 'sponsorship-link',
},
{
to: 'https://github.com/marcofarina/python-doesnt-byte',
label: 'GitHub',
position: 'right',
target: '_blank',
className: 'github-link',
'aria-label': 'GitHub repository',
},
{
to: 'https://www.rainbowbits.cloud',
label: 'Rainbow Bits',
position: 'right',
target: '_blank',
className: 'rainbowbits-link',
},
// GitHub e "Offrimi un caffè" sono renderizzati come icone+popup
// (NavbarIconButton) dal swizzle src/theme/Navbar/Content, non
// tramite navbar items standard.
],
},
footer: {
Expand Down Expand Up @@ -172,9 +231,6 @@ const config: Config = {
darkTheme: prismThemes.dracula,
},
} satisfies Preset.ThemeConfig,
themes: [
'docusaurus-live-brython'
],
};

export default config;
Loading
Loading