├── .gitignore
├── .travis.yml
├── LICENCIA
├── README.md
├── TODO.md
├── code-es6
├── count-server.js
├── express-count.js
├── github-get-largo.js
├── package.json
├── servidor-var.js
├── servidor.js
└── sumar_formulario.html
├── code
├── Nuevo_partido.js
├── Partido.js
├── Quiniela.js
├── Resultado.js
├── Resultados.js
├── Un_Partido.js
├── aap-nav.user.js
├── bg-1.user.js
├── bg-2.js
├── bg-2.user.js
├── bg-3.js
├── bg-3.user.js
├── blogalia.user.js
├── calc.gm.js
├── calc.user.js
├── check-with-all.sh
├── contadores.js
├── count-server-var.js
├── count-server.js
├── crea-contadores.js
├── create-attachment.js
├── create-doc-bulk.js
├── create-doc-simple.js
├── cuenta-ajax.js
├── cuenta-jquery.js
├── di_resultado.js
├── docwrite.html
├── express-count.js
├── express-rest-server.js
├── formulario-jquery.html
├── funciones-anon.js
├── funciones.js
├── g.js
├── geonames_call.js
├── get-doc.js
├── github-get-largo.js
├── github-get.js
├── guenas-nave.js
├── guenas.js
├── hola-all.js
├── hola-browser-2.js
├── hola-browser.js
├── hola-g.js
├── hola-js-2.html
├── hola-js-3.html
├── hola-js.cgi
├── hola-js.html
├── hola.js
├── holak.js
├── holakase.js
├── holasincabecera.js
├── inc-contadores.js
├── index.html
├── inserta-resultados.js
├── json-geonames.html
├── jsr_class.js
├── kk-1.user.js
├── lee-quiniela.js
├── lee_quiniela.js
├── liga.js
├── liga2.js
├── liga3.js
├── list-quiniela.js
├── location.html
├── map.js
├── node-server-example.js
├── node_quiniela.js
├── node_twitter.js
├── onload.html
├── partidos.datos
├── peticion.js
├── putBloque.js
├── quiniela
├── quiniela-view.js
├── quiniela.datos
├── quiniela.js
├── quiniela2.js
├── ready-simple.html
├── ready.html
├── request.js
├── rest-client-js.html
├── rest-client.js
├── rest-minimo.js
├── rest-server-js.html
├── rest-server.js
├── selectores.html
├── servidor-var.js
├── servidor.js
├── sumar_formulario.html
├── tabla-final.js
├── tabla.js
├── tabla1.js
├── tabla2.js
├── usa_partido.js
└── windowopen.html
├── js.css
├── metadata.xml
├── txt
├── 1-intro.md
├── 1-oo.md
├── 2-JQuery.md
├── 2-js-navegador.md
├── 3-node.md
├── 4-rest-ajax.md
├── 99-glosario.md
├── aprendeJS.txt
├── imagenes
│ ├── AAP-DOM.png
│ ├── by-sa.png
│ ├── chromium-consola.png
│ ├── firefox-consola.png
│ ├── gjs-consola.png
│ ├── node-consola.png
│ └── nuevonodo.png
├── prologo.md
├── snippet.css
└── words.dic
└── utils
├── md2epub
├── md2html
└── md2pdf
/.gitignore:
--------------------------------------------------------------------------------
1 | *~
2 | *.epub
3 | txt/html
4 | txt/pdf
5 | *.pdf
6 | *.temp
7 | code/highlight.css
8 | intro.html
9 | .idea
10 | code/node_modules/
11 | code-es6/node_modules/
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | sudo: required
2 | dist: trusty
3 | branches:
4 | except:
5 | - gh-pages
6 | language: perl
7 | perl:
8 | - "5.16"
9 | before_install:
10 | - sudo apt-get update -qq
11 | - sudo apt-get -y install libhunspell-1.3-0 libhunspell-dev
12 | - curl https://raw.githubusercontent.com/JJ/Test-Text/master/data/Spanish.aff -o Spanish.aff
13 | - curl https://raw.githubusercontent.com/SublimeText/Dictionaries/master/Spanish.dic -o Spanish.dic
14 | - echo "use Test::Text;just_check( 'txt','.', 'Spanish' );" > just_check.t
15 | install: cpanm ExtUtils::PkgConfig Test::Text TAP::Harness
16 | script: perl -MTAP::Harness -e 'use utf8; my $harness = TAP::Harness->new( { verbosity => 0} ); die "FAIL" if $harness->runtests( "just_check.t" )->failed;'
17 |
18 |
--------------------------------------------------------------------------------
/LICENCIA:
--------------------------------------------------------------------------------
1 | Licencia
2 | ====
3 |
4 | This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Introducción a JavaScript
2 | ========
3 |
4 | [](https://travis-ci.org/JJ/curso-js)
5 |
6 | Curso de
7 | [JavaScript cliente-servidor para el CEV-UGR](http://cevug.ugr.es/javascript). Cuarta edición en octubre de 2015, termina el 11 de diciembre. Si estás interesado en asistir al curso virtual, escríbenos o mantente informado en la página del curso en la web del [centro de enseñanzas virtuales de la UGR](http://cevug.ugr.es/javascript/).
8 |
9 | Ahora también disponible como [libro en Amazon](https://www.amazon.es/dp/B00HXL8QA0?tag=atalaya-21&camp=3634&creative=24822&linkCode=as4&creativeASIN=B00HXL8QA0&adid=1CR706WQ1340FXERHCDH&).
10 |
11 | 
12 |
13 | ## Instrucciones para generar
14 |
15 | El [directorio `utils`](utils/) incluye herramientas para su
16 | generación en diferentes formatos.
17 |
--------------------------------------------------------------------------------
/TODO.md:
--------------------------------------------------------------------------------
1 | #Cosas que hacer
2 |
3 | * [X] Generar automáticamente diferentes formatos con pandoc
4 | * [ ] Añadir integración continua con corrección ortográfica.
5 | * [X] Dividir el texto en diferentes capítulos para más fácil corrección.
6 | * [ ] Terminar la conversión a Markdown desde HTML.
7 | * [ ] Corregir errores en el texto.
8 | * [ ] Añadir documentación.
9 | * [ ] Añadir jshints
10 | * [ ] Añadir Gruntfile
11 |
--------------------------------------------------------------------------------
/code-es6/count-server.js:
--------------------------------------------------------------------------------
1 | /* jshint esversion: 6 */
2 | 'use strict';
3 |
4 | const fs = require('fs'),
5 | express = require('express'),
6 | app = express();
7 |
8 | let contadores = [],
9 | portada = fs.readFileSync('sumar_formulario.html', 'utf8');
10 |
11 | const getPortada = (req, res) => res.send(portada);
12 |
13 | const getPage = (req, res) => {
14 | let js = fs.readFileSync(req.params.page);
15 | res.contentType('text/javascript');
16 | res.send(js);
17 | };
18 |
19 | const putContador = (req, res) => {
20 | contadores[req.params.id] = 0;
21 | res.send('Creado contador ' + req.params.id);
22 | };
23 |
24 | const postContador = (req, res) => {
25 | contadores[req.params.id]++;
26 | res.contentType('application/json');
27 | res.send({resultado: contadores[req.params.id]});
28 | console.log({post: contadores});
29 | };
30 |
31 | const getContador = (req, res) => {
32 | res.contentType('application/json');
33 | res.send({ resultado: contadores[req.params.id]});
34 | };
35 |
36 | const getSuma = (req, res) => res.send({
37 | resultado: contadores[req.params.id1] + contadores[req.params.id2]
38 | });
39 |
40 | app.get('/', getPortada);
41 | app.get('/js/:page', getPage);
42 | app.put('/contador/:id', putContador);
43 | app.post('/contador/:id', postContador);
44 | app.get('/contador/:id', getContador);
45 | app.get('/suma/:id1/:id2', getSuma);
46 |
47 | app.listen(8080);
48 | console.log('Server running at http://127.0.0.1:8080/');
--------------------------------------------------------------------------------
/code-es6/express-count.js:
--------------------------------------------------------------------------------
1 | /* jshint esversion: 6 */
2 | 'use strict';
3 |
4 | const express = require('express'),
5 | app = express(),
6 | puerto = process.argv[2] ? process.argv[2] : 8080;
7 |
8 | let contadores = [];
9 |
10 | /* Funciones */
11 | const getAll = (req, res) => res.send('Portada');
12 |
13 | const putOne = (req, res) => {
14 | contadores[req.params.id] = 0;
15 | res.send({creado: req.params.id});
16 | };
17 |
18 | const getOne = (req, res) => res.send('{ ' + req.params.id + ': ' + contadores[req.params.id] + '}');
19 |
20 | const postOne = (req, res) => {
21 | contadores[req.params.id]++;
22 | res.send('{ ' + req.params.id + ': ' + contadores[req.params.id] + '}');
23 | };
24 |
25 | /* Rutas */
26 | app.get('/', getAll);
27 | app.put('/contador/:id', putOne);
28 | app.get('/contador/:id', getOne);
29 | app.post('/contador/:id', postOne);
30 |
31 | /* Puesta en marcha del servidor */
32 | app.listen(puerto);
33 | console.log('Server running at http://127.0.0.1:' + puerto + '/');
--------------------------------------------------------------------------------
/code-es6/github-get-largo.js:
--------------------------------------------------------------------------------
1 | /* jshint esversion: 6 */
2 |
3 | const https = require('https'),
4 | state = process.argv[2] ? process.argv[2] : 'open',
5 | options = {
6 | host: 'api.github.com',
7 | path: 'https://api.github.com/repos/jj/curso-js/issues?state=' + state,
8 | method: 'GET',
9 | headers: {'user-agent': 'PruebaNode'}
10 | };
11 |
12 |
13 | const parseFunction = (res) => {
14 | let datos_JSON_acc = '';
15 |
16 | res.setEncoding('utf8');
17 | res.on('data', (datos_JSON) => datos_JSON_acc += datos_JSON);
18 | res.on('end', () => {
19 | let datos = JSON.parse(datos_JSON_acc);
20 | if (Array.isArray(datos)) {
21 | for (let i = 0, len = datos.length; i < len; i++) {
22 | console.log('Issue: ' + datos[i].title + '\nUser: ' + datos[i].user.login + '\n');
23 | }
24 | } else {
25 | console.log('Issue: ' + datos.title + '\nUser: ' + datos.user.login + '\n');
26 | }
27 | });
28 | };
29 |
30 | const req = https.get(options, parseFunction);
31 |
32 | req.end();
33 |
--------------------------------------------------------------------------------
/code-es6/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "code-es6",
3 | "version": "0.0.1",
4 | "dependencies": {
5 | "express": "^4.14.1",
6 | "fs": "0.0.1-security",
7 | "http": "0.0.0",
8 | "https": "^1.0.0"
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/code-es6/servidor-var.js:
--------------------------------------------------------------------------------
1 | /* jshint esversion: 6 */
2 |
3 | const http = require('http');
4 |
5 | const createServer = (req, res) => {
6 | res.writeHead(200, {'Content-Type': 'text/plain'});
7 | res.end('Ahí estamos ' + req.url);
8 | };
9 |
10 | http.createServer(createServer).listen(8081, '127.0.0.1');
11 |
12 | console.log('Servidor ejecutándose en http://127.0.0.1:8081/');
--------------------------------------------------------------------------------
/code-es6/servidor.js:
--------------------------------------------------------------------------------
1 | /* jshint esversion: 6 */
2 |
3 | const http = require('http');
4 |
5 | const createServer = (req, res) => {
6 | res.writeHead(200, {'Content-Type': 'text/plain'});
7 | res.end('Ahí estamos\n');
8 | };
9 |
10 | http.createServer(createServer).listen(8080, '127.0.0.1');
11 |
12 | console.log('Servidor ejecutándose en http://127.0.0.1:8080/');
--------------------------------------------------------------------------------
/code-es6/sumar_formulario.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Sumador usando Ajax
5 |
6 |
7 |
8 |
9 | Prueba AJAX
10 |
11 | Inserta el nombre del contador para mostrar su valor.
12 |
13 | Contador:
14 |
15 |
16 |
17 |
Juan J. Merelo
18 |
19 | Last modified: Sun May 12 18:06:21 CEST 2013
20 |
21 |
22 |
--------------------------------------------------------------------------------
/code/Nuevo_partido.js:
--------------------------------------------------------------------------------
1 | // Definición de la clase Partido
2 | function Nuevo_partido(local,visitante, resultado) {
3 | this.local = local;
4 | this.visitante=visitante;
5 | this.resultado=resultado;
6 | this.setResultado = setResultado;
7 | this.toString = toString;
8 | this.set_to_string = set_to_string;
9 | this.impresor = _toString;
10 | }
11 |
12 | function setResultado( esteResultado ) {
13 | if ( esteResultado == '1' || esteResultado=='x' || esteResultado=='2' )
14 | this.resultado = esteResultado;
15 | }
16 |
17 | function toString() {
18 | return this.impresor(this.local, this.visitante, this.resultado);
19 | }
20 |
21 | function _toString( local, visitante ) {
22 | return ": " + this.local + " - " + this.visitante + " = "+ this.resultado;
23 | }
24 |
25 | function set_to_string ( impresor ) {
26 | this.impresor = impresor;
27 | }
--------------------------------------------------------------------------------
/code/Partido.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JJ/curso-js/8d3ea9afe28aa112bd92f3766ecc9b2bfde3ff2a/code/Partido.js
--------------------------------------------------------------------------------
/code/Quiniela.js:
--------------------------------------------------------------------------------
1 | // Definición de la clase Partido
2 | function Partido(_local,_visitante) {
3 | this.local = _local;
4 | this.visitante=_visitante;
5 | this.resultado=null;
6 | }
7 |
8 | var equipos= new Array('Madrid', 'Barça', 'Atleti', 'Geta', 'Betis', 'Depor', 'Sevilla', 'Graná');
9 |
10 | var midsize = equipos.length/2;
11 | var quiniela = new Array( midsize );
12 | for ( i=0; i < midsize ; i++ ) {
13 | var equipo1 = equipos.splice(Math.floor( equipos.length*Math.random()) , 1);
14 | var equipo2 = equipos.splice(Math.floor( equipos.length*Math.random()), 1);
15 | quiniela[i] = new Partido( equipo1, equipo2 );
16 | }
17 |
18 | for ( i in quiniela ) {
19 | print( "Partido " + (parseInt(i)+1)+": " + quiniela[i].local + " - " + quiniela[i].visitante);
20 | }
21 |
--------------------------------------------------------------------------------
/code/Resultado.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JJ/curso-js/8d3ea9afe28aa112bd92f3766ecc9b2bfde3ff2a/code/Resultado.js
--------------------------------------------------------------------------------
/code/Resultados.js:
--------------------------------------------------------------------------------
1 | // Lee los resultados de un fichero y los devuelve como array.
2 | function lee_resultados( file_name ) {
3 | var FileReader = java.io.FileReader;
4 | var BufferedReader =java.io.BufferedReader;
5 | var f = new FileReader(file_name);
6 | var br = new BufferedReader( f );
7 | var resultados= new Array;
8 | var line = new String;
9 | if ( !resultados[resultado[0]] ) {
10 | resultados[resultado[0]]=0;
11 | }
12 | if ( !resultados[resultado[1]] ) {
13 | resultados[resultado[1]]=0;
14 | }
15 | while ((line = br.readLine()) != null) {
16 | var estaLinea = new String( line );
17 | var resultado = estaLinea.split(" ");
18 | switch (resultado[2]) {
19 | case '1':
20 | resultados[resultado[0]]+=3;
21 | break;
22 | case 'x':
23 | resultados[resultado[0]]+=1;
24 | resultados[resultado[1]]+=1;
25 | break;
26 | default:
27 | resultados[resultado[1]]+=3;
28 | break
29 | }
30 | }
31 |
32 | return resultados;
33 | }
34 |
35 |
--------------------------------------------------------------------------------
/code/Un_Partido.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JJ/curso-js/8d3ea9afe28aa112bd92f3766ecc9b2bfde3ff2a/code/Un_Partido.js
--------------------------------------------------------------------------------
/code/aap-nav.user.js:
--------------------------------------------------------------------------------
1 | // ==UserScript==
2 | // @name AAP-Nav
3 | // @namespace http://geneura.org/projects/greasemonkey
4 | // @description Navegación por las secciones de AAP
5 | // @include http://geneura.ugr.es/~jmerelo/asignaturas/*
6 | // ==/UserScript==
7 |
8 | GM_log('Entrando en AAP-Nav');
9 | var h2 = document.getElementsByTagName('h2');
10 | var a_nodes = new Array;
11 | var anchors = new Array;
12 | for ( var secs = 0; secs < h2.length; secs ++ ) {
13 | var thisA = h2[secs].getElementsByTagName('a');
14 | a_nodes[secs] = thisA[0];
15 | anchors[secs] = thisA[0].getAttribute('name');
16 | GM_log('Anchor ' + secs + " " + anchors[secs]);
17 | }
18 |
19 | for ( var secs = 0; secs < h2.length; secs ++ ) {
20 | var span = document.createElement('span');
21 | span.setAttribute('style','background:lightblue');
22 | if ( secs > 0 ) {
23 | var ahref = document.createElement('a');
24 | ahref.setAttribute('href','#'+anchors[secs-1]);
25 | var txt=document.createTextNode('^');
26 | ahref.appendChild(txt);
27 | span.appendChild(ahref);
28 | }
29 | if ( secs < h2.length -1 ) {
30 | span.appendChild(document.createTextNode(' | '));
31 | var ahref = document.createElement('a');
32 | ahref.setAttribute('href','#'+anchors[secs+1]);
33 | var txt=document.createTextNode('v');
34 | ahref.appendChild(txt);
35 | span.appendChild(ahref);
36 | }
37 | a_nodes[secs].parentNode.insertBefore(span,a_nodes[secs]);
38 | }
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/code/bg-1.user.js:
--------------------------------------------------------------------------------
1 | // ==UserScript==
2 | // @name Blogalia
3 | // @namespace http://geneura.org/projects/greasemonkey
4 | // @description Cambia cosas en la portada de blogalia
5 | // @include http://www.blogalia.com/
6 | // @include http://blogalia.com/
7 | // ==/UserScript==
8 |
9 | GM_log('Aquí estoy');
10 | var table = document.getElementById('historias');
11 | GM_log('table ' + table );
12 | //var blogs = document.evaluate("tr",
13 | // document.getElementById('historias'),
14 | // null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
15 | var blogs = table.getElementsByTagName('tr');
16 | GM_log('blogs.length ' + blogs.length );
17 | //var info;
18 | //for ( var i = 0; i < blogs.snapshotLength; i ++ ) {
19 | // GM_log(blogs.snapshotItem(i).textContent);
20 | //}
21 |
22 | for ( var row = 0; row < blogs.length; row ++ ) {
23 | var columns = blogs[row].getElementsByTagName('td');
24 | // for ( var column = 0; column < columns.length; column++ ) {
25 | // GM_log(row + " - " + column + " - " + columns[column].textContent);
26 | // }
27 | columns[0].style.background='yellow';
28 | }
29 |
--------------------------------------------------------------------------------
/code/bg-2.js:
--------------------------------------------------------------------------------
1 | // ==UserScript==
2 | // @name Blogalia
3 | // @namespace http://geneura.org/projects/greasemonkey
4 | // @description Cambia cosas en la portada de blogalia
5 | // @include http://www.blogalia.com/
6 | // @include http://blogalia.com/
7 | // ==/UserScript==
8 |
9 | GM_log('Aquí estoy');
10 | var table = document.getElementById('historias');
11 | GM_log('table ' + table );
12 | //var blogs = document.evaluate("tr",
13 | // document.getElementById('historias'),
14 | // null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
15 | var blogs = table.getElementsByTagName('tr');
16 | GM_log('blogs.length ' + blogs.length );
17 | //var info;
18 | //for ( var i = 0; i < blogs.snapshotLength; i ++ ) {
19 | // GM_log(blogs.snapshotItem(i).textContent);
20 | //}
21 |
22 | for ( var row = 0; row < blogs.length; row ++ ) {
23 | var columns = blogs[row].getElementsByTagName('td');
24 | // for ( var column = 0; column < columns.length; column++ ) {
25 | // GM_log(row + " - " + column + " - " + columns[column].textContent);
26 | // }
27 | var thisA = columns[0].getElementsByTagName('a');
28 | var span = document.createElement('span');
29 | span.style='background:blue';
30 | var txt = document.createTextNode(' ');
31 | span.appendChild(txt);
32 | thisA.parentNode.insertBefore(span, thisA);
33 | }
34 |
--------------------------------------------------------------------------------
/code/bg-2.user.js:
--------------------------------------------------------------------------------
1 | // ==UserScript==
2 | // @name Blogalia
3 | // @namespace http://geneura.org/projects/greasemonkey
4 | // @description Cambia cosas en la portada de blogalia
5 | // @include http://www.blogalia.com/
6 | // @include http://blogalia.com/
7 | // ==/UserScript==
8 |
9 |
10 | var table = document.getElementById('historias');
11 | var blogs = table.getElementsByTagName('tr');
12 |
13 | for ( var row = 0; row < blogs.length; row ++ ) {
14 | var columns = blogs[row].getElementsByTagName('td');
15 | var thisA = columns[0].getElementsByTagName('a');
16 | var span = document.createElement('span');
17 | span.setAttribute('style','background:blue');
18 | var txt = document.createTextNode('*');
19 | span.appendChild(txt);
20 | thisA[0].parentNode.insertBefore(span, thisA[0]);
21 | }
22 |
--------------------------------------------------------------------------------
/code/bg-3.js:
--------------------------------------------------------------------------------
1 | // ==UserScript==
2 | // @name Blogalia
3 | // @namespace http://geneura.org/projects/greasemonkey
4 | // @description Cambia cosas en la portada de blogalia
5 | // @include http://www.blogalia.com/
6 | // @include http://blogalia.com/
7 | // ==/UserScript==
8 |
9 |
10 | var table = document.getElementById('historias');
11 | var blogs = table.getElementsByTagName('tr');
12 | var request;
13 |
14 | request = new XMLHttpRequest();
15 |
16 | request.open('GET', 'http://geneura.ugr.es/~jmerelo/atalaya/chismes/comentarios_xml.cgi', true);
17 | request.onreadystatechange= putComentarios ;
18 | request.send(null);
19 | var comentarios;
20 |
21 | function putComentarios(){
22 | if ( request.readyState == 4 ) {
23 | if ( request.status == 200 ) {
24 | var doc = request.responseXML;
25 | var root=doc.documentElement;
26 | var html="
";
27 | var nds = root.childNodes;
28 | for ( var i = 0; i < nds.length; i ++ ) {
29 | // alert(nds[i].toString());
30 | // html += ""+ nds[i].firstChild.attributes[0].value + " - " + nds[i].firstChild.value + " \n";
31 | if ( nds[i].nodeName == 'blog' ) {
32 | comentarios[nds[i].attributes[0].value] = nds[i].firstChild.nodeValue;
33 | }
34 | }
35 | }
36 | }
37 | }
38 | for ( var row = 0; row < blogs.length; row ++ ) {
39 | var columns = blogs[row].getElementsByTagName('td');
40 | var thisA = columns[0].getElementsByTagName('a');
41 | var span = document.createElement('span');
42 | span.setAttribute('style','background:blue');
43 | var txt = document.createTextNode('*');
44 | span.appendChild(txt);
45 | GM_log(thisA[0].href);
46 | thisA[0].parentNode.insertBefore(span, thisA[0]);
47 | }
48 |
--------------------------------------------------------------------------------
/code/bg-3.user.js:
--------------------------------------------------------------------------------
1 | // ==UserScript==
2 | // @name Blogalia
3 | // @namespace http://geneura.org/projects/greasemonkey
4 | // @description Cambia cosas en la portada de blogalia
5 | // @include http://www.blogalia.com/
6 | // @include http://blogalia.com/
7 | // ==/UserScript==
8 |
9 | function putComentarios( results ){
10 | GM_log(results.responseText);
11 | var comentarios;
12 | eval( "comentarios = " + results.responseText );
13 | var table = document.getElementById('historias');
14 | var blogs = table.getElementsByTagName('tr');
15 | for ( var row = 0; row < blogs.length; row ++ ) {
16 | var columns = blogs[row].getElementsByTagName('td');
17 | var thisA = columns[0].getElementsByTagName('a');
18 | var span = document.createElement('span');
19 | span.setAttribute('style','background:blue');
20 | var comstar='';
21 | for ( var i=0; i < comentarios[thisA[0].href]/5; i++ ) {
22 | comstar +='*';
23 | }
24 | GM_log(comstar);
25 | var txt = document.createTextNode(comstar);
26 | span.appendChild(txt);
27 | thisA[0].parentNode.insertBefore(span, thisA[0]);
28 | }
29 |
30 | }
31 |
32 | GM_log('Haciendo petición');
33 | GM_xmlhttpRequest({method:'GET',
34 | url:'http://geneura.ugr.es/~jmerelo/atalaya/chismes/comentarios_js.cgi',
35 | onload:putComentarios});
36 | GM_log('Petición hecha');
37 |
38 |
39 |
--------------------------------------------------------------------------------
/code/blogalia.user.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JJ/curso-js/8d3ea9afe28aa112bd92f3766ecc9b2bfde3ff2a/code/blogalia.user.js
--------------------------------------------------------------------------------
/code/calc.gm.js:
--------------------------------------------------------------------------------
1 | // ==UserScript==
2 | // @name Calculadora
3 | // @namespace http://geneura.org/projects/greasemonkey
4 | // @description Añade una minicalculadora
5 | // @include http://*
6 | // @exclude http://*.google.tld/*
7 | // ==/UserScript==
8 |
9 |
10 |
11 | var elmSearchDiv = document.createElement('div');
12 |
13 | elmSearchDiv.innerHTML =
14 |
15 | ' ';
20 |
21 | document.body.insertBefore(elmSearchDiv, document.body.firstChild);
22 |
23 | elmSearchDiv.style.fontSize = 'small';
24 |
25 | elmSearchDiv.style.textAlign = 'right';
26 |
27 | elmSearchDiv.style.borderBottom = '1px solid silver';
28 |
--------------------------------------------------------------------------------
/code/calc.user.js:
--------------------------------------------------------------------------------
1 | // ==UserScript==
2 | // @name Calculadora
3 | // @namespace http://geneura.org/projects/greasemonkey
4 | // @description Añade una minicalculadora
5 | // @include http://*
6 | // @exclude http://*.google.tld/*
7 | // ==/UserScript==
8 |
9 |
10 |
11 | var elmSearchDiv = document.createElement('div');
12 |
13 | elmSearchDiv.innerHTML =
14 |
15 | '
';
20 |
21 | document.body.insertBefore(elmSearchDiv, document.body.firstChild);
22 |
23 | elmSearchDiv.style.fontSize = 'small';
24 |
25 | elmSearchDiv.style.textAlign = 'right';
26 |
27 | elmSearchDiv.style.borderBottom = '1px solid silver';
28 |
--------------------------------------------------------------------------------
/code/check-with-all.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | declare -a arr=("js" "js24" "gjs" "rhino")
4 |
5 | for i in "${arr[@]}"
6 | do
7 | echo "$i"
8 | $i hola-all.js
9 | done
10 |
--------------------------------------------------------------------------------
/code/contadores.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JJ/curso-js/8d3ea9afe28aa112bd92f3766ecc9b2bfde3ff2a/code/contadores.js
--------------------------------------------------------------------------------
/code/count-server-var.js:
--------------------------------------------------------------------------------
1 |
2 | // variable front page
3 | var fs = require('fs');
4 | var express=require('express');
5 | var app = express.createServer();
6 | var contadores = new Array;
7 | var portada = fs.readFileSync(process.argv[2]+'.html','utf8');
8 |
9 | app.get('/', function (req, res) {
10 | res.send(portada);
11 | });
12 |
13 | app.get('/js/:page', function (req, res) {
14 | var js = fs.readFileSync(req.params.page);
15 | res.contentType('text/javascript');
16 | res.send(js);
17 | });
18 |
19 | app.put('/contador/:id', function( req,res ) {
20 | contadores[req.params.id] = 0;
21 | res.send('Creado contador '+ req.params.id );
22 | });
23 |
24 | app.post('/contador/:id', function (req, res) {
25 | contadores[req.params.id]++;
26 | res.contentType('application/json');
27 | res.send( { resultado: contadores[req.params.id] } );
28 | console.log( { 'Post': contadores} );
29 | });
30 |
31 | app.get('/contador/:id', function (req, res) {
32 | res.contentType('application/json');
33 | res.send( { resultado: contadores[req.params.id] } );
34 | });
35 |
36 | app.get('/suma/:id1/:id2', function (req, res) {
37 | res.send( { resultado: contadores[req.params.id1] + contadores[req.params.id2]} );
38 | });
39 |
40 | app.listen(8080);
41 | console.log('Server running at http://127.0.0.1:8080/');
--------------------------------------------------------------------------------
/code/count-server.js:
--------------------------------------------------------------------------------
1 |
2 | var fs = require('fs');
3 | var express=require('express');
4 | var app = express();
5 | var contadores = new Array;
6 | var portada = fs.readFileSync('sumar_formulario.html','utf8');
7 |
8 | app.get('/', function (req, res) {
9 | res.send(portada);
10 | });
11 |
12 | app.get('/js/:page', function (req, res) {
13 | var js = fs.readFileSync(req.params.page);
14 | res.contentType('text/javascript');
15 | res.send(js);
16 | });
17 |
18 | app.put('/contador/:id', function( req,res ) {
19 | contadores[req.params.id] = 0;
20 | res.send('Creado contador '+ req.params.id );
21 | });
22 |
23 | app.post('/contador/:id', function (req, res) {
24 | contadores[req.params.id]++;
25 | res.contentType('application/json');
26 | res.send( { resultado: contadores[req.params.id] } );
27 | console.log( { 'Post': contadores} );
28 | });
29 |
30 | app.get('/contador/:id', function (req, res) {
31 | res.contentType('application/json');
32 | res.send( "{ 'resultado': " + contadores[req.params.id] + "}\n" );
33 | });
34 |
35 |
36 | app.get('/suma/:id1/:id2', function (req, res) {
37 | res.send( { resultado: contadores[req.params.id1] + contadores[req.params.id2]} );
38 | });
39 |
40 | app.listen(8080);
41 | console.log('Server running at http://127.0.0.1:8080/');
--------------------------------------------------------------------------------
/code/crea-contadores.js:
--------------------------------------------------------------------------------
1 |
2 | var rest = require('restler');
3 | var url = 'http://127.0.0.1:8080/contador/';
4 | process.argv.forEach(function (val, index, array) {
5 | if ( index > 1 ) {
6 | rest.put( url + val ).on('complete', function( data ) {
7 | console.log( data );
8 | } );
9 | }
10 | });
--------------------------------------------------------------------------------
/code/create-attachment.js:
--------------------------------------------------------------------------------
1 | #!/usr/local/bin/node
2 |
3 | var fs=require('fs');
4 | var file = fs.readFileSync('index.html');
5 | var id =process.argv[2]; // undef if not present
6 | var nano = require('nano')('http://localhost:5984/');
7 | var db_name = "ahora_no";
8 | var db = nano.use(db_name);
9 | var document = { name: 'Documento',
10 | breadcrumb: 'index',
11 | type: 'html' };
12 | if (id ) {
13 | document.id = id;
14 | }
15 | console.log(document);
16 |
17 | db.insert( document,
18 | function (error,http_body,http_headers) {
19 | if ( !id ) {
20 | document.id = http_body.id;
21 | }
22 | db.get(document.id, function(error,body) {
23 | db.attachment.insert( document.id, 'index.html', file, 'text/html',
24 | {rev: body._rev},
25 | function(err,body ) {
26 | console.log(body);
27 | } ) ;
28 | } );
29 | } );
30 |
--------------------------------------------------------------------------------
/code/create-doc-bulk.js:
--------------------------------------------------------------------------------
1 | #!/usr/local/bin/node
2 |
3 | var url = process.argv[2],
4 | db_name=process.argv[3],
5 | id=process.argv[4],
6 | how_many=process.argv[5];
7 | var db = require('nano')(url).use(db_name);
8 | var all_docs = new Array;
9 | for ( var j = 0; j < how_many; j ++ ) {
10 | var doc = new Object;
11 | doc._id = id+"_"+j;
12 | doc.vector = new Array;
13 | for ( var i = 0; i < 5; i++ ) {
14 | doc.vector[i] = Math.random();
15 | }
16 | console.log( doc );
17 | all_docs.push( doc );
18 | }
19 |
20 | console.log(all_docs);
21 | db.bulk( { 'docs' : all_docs},
22 | function (error,http_body,http_headers) {
23 | console.log(http_body);
24 | }
25 | );
26 |
--------------------------------------------------------------------------------
/code/create-doc-simple.js:
--------------------------------------------------------------------------------
1 | #!/usr/local/bin/node
2 |
3 | var nano = require('nano')('http://localhost:5984/');
4 | var db_name = "ahora_no";
5 | var db = nano.use(db_name);
6 | db.insert( { _id : 'expid_instanceid',
7 | vector: [ 11,22,33],
8 | type: 'mine' },
9 | function (error,http_body,http_headers) {
10 | console.log(http_body);
11 | }
12 | );
13 |
--------------------------------------------------------------------------------
/code/cuenta-ajax.js:
--------------------------------------------------------------------------------
1 | var request;
2 | function cuenta() {
3 | request = new XMLHttpRequest();
4 | var contador=document.getElementById('contador').value;
5 | var peticion_str = '/contador/'+contador;
6 | request.open('POST', peticion_str , true);
7 | request.onreadystatechange= escribe_resultado ;
8 | request.send(null);
9 | }
10 |
11 | function escribe_resultado(){
12 | if ( request.readyState == 4 ) {
13 | if ( request.status == 200 ) {
14 | var json;
15 | eval ( 'json = '+ request.responseText );
16 | console.log(json);
17 | document.getElementById('Resultado').innerHTML= 'Resultado = '+
18 | json.resultado
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/code/cuenta-jquery.js:
--------------------------------------------------------------------------------
1 | $(document).ready(function() {
2 | $("#formulario").change(function(){
3 | $.get('/contador/'+$('#contador').val(), function( data) {
4 | $('#Resultado').html('Resultado '+ data.resultado);
5 | });
6 | });
7 | } );
8 |
9 |
--------------------------------------------------------------------------------
/code/di_resultado.js:
--------------------------------------------------------------------------------
1 | load('/usr/lib/js/prototype.js'); // Funciona con rhino solo
2 | load('Resultados.js');
3 |
4 | if (arguments.lenght == 0 ) {
5 | print("Uso: di_resultado.js
");
6 | }
7 |
8 | var results_file=arguments[0];
9 | var equipo = arguments[1];
10 |
11 | var resultados = $H( lee_resultados( results_file ));
12 |
--------------------------------------------------------------------------------
/code/docwrite.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Prueba document.write
5 |
10 |
11 |
12 |
13 | Prueba document.write
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | Juan J. Merelo
25 |
26 |
27 | Last modified: Sun Feb 25 18:57:52 CET 2007
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/code/express-count.js:
--------------------------------------------------------------------------------
1 | var express=require('express');
2 | var app = express();
3 | var contadores = new Array;
4 | var puerto=process.argv[2]?process.argv[2]:8080;
5 |
6 | app.get('/', function (req, res) {
7 | res.send('Portada');
8 | });
9 |
10 | app.put('/contador/:id', function( req,res ) {
11 | contadores[req.params.id] = 0;
12 | res.send( { creado: req.params.id } );
13 | });
14 |
15 | app.get('/contador/:id', function (req, res) {
16 | res.send( "{ "+req.params.id+": "+ contadores[req.params.id] + "}" );
17 | });
18 |
19 | app.post('/contador/:id', function (req, res) {
20 | contadores[req.params.id]++;
21 | res.send( "{ "+req.params.id+": "+ contadores[req.params.id] + "}" );
22 | });
23 |
24 | app.listen(puerto);
25 | console.log('Server running at http://127.0.0.1:'+puerto+'/');
--------------------------------------------------------------------------------
/code/express-rest-server.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | var express=require('express');
4 | var app = express.createServer();
5 |
6 | app.get('/', function (req, res) {
7 | res.send('Portada');
8 | });
9 |
10 | app.get('/proc', function (req, res) {
11 | res.send('No es la portada');
12 | });
13 |
14 | app.listen(8080);
15 | console.log('Server running at http://127.0.0.1:8080/');
--------------------------------------------------------------------------------
/code/formulario-jquery.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Sumador usando Ajax
5 |
6 |
7 |
8 |
9 |
10 | Prueba AJAX
11 |
12 | Inserta el nombre del contador para mostrar su valor.
13 |
14 | Contador:
15 |
16 |
17 |
18 |
Juan J. Merelo
19 |
20 | Last modified: Sun May 12 18:06:21 CEST 2013
21 |
22 |
23 |
--------------------------------------------------------------------------------
/code/funciones-anon.js:
--------------------------------------------------------------------------------
1 | // Definición de la clase Partido
2 | function Nuevo_partido(local,visitante) {
3 | this.local = local;
4 | this.visitante=visitante;
5 | this.resultado=null;
6 | this.setResultado = setResultado;
7 | this.to_string = to_string;
8 | this.set_to_string = set_to_string;
9 | this.impresor = _toString;
10 | }
11 |
12 | function setResultado( esteResultado ) {
13 | if ( esteResultado == '1' || esteResultado=='x' || esteResultado=='2' )
14 | this.resultado = esteResultado;
15 | }
16 |
17 | function to_string() {
18 | return this.impresor(this.local, this.visitante, this.resultado);
19 | }
20 |
21 | function _toString( local, visitante ) {
22 | return ": " + local + " - " + visitante + " = "+ resultado;
23 | }
24 |
25 | function set_to_string ( impresor ) {
26 | this.impresor = impresor;
27 | }
28 |
29 | /// El programa empieza aquí
30 | var equipos= new Array('Madrid', 'Barça', 'Atleti', 'Geta', 'Betis', 'Depor', 'Sevilla', 'Graná');
31 |
32 | function jornada( estosEquipos ) {
33 | var equiposAqui = new Array;
34 | var imprime = function( local, visitante, resultado ) {
35 | console.log("Imprimiendo \n");
36 | return "- " + local + " vs. " + visitante + " resultado "+ resultado;
37 | };
38 | equiposAqui = equiposAqui.concat(estosEquipos);
39 | var midsize = equiposAqui.length/2;
40 | var quiniela = new Array( midsize );
41 | var unox2 = new Array( '1','x','2');
42 | for ( var i=0; i < midsize ; i++ ) {
43 | var equipo1 = equiposAqui.splice(Math.floor( equiposAqui.length*Math.random()) , 1);
44 | var equipo2 = equiposAqui.splice(Math.floor( equiposAqui.length*Math.random()), 1);
45 | quiniela[i] = new Nuevo_partido( equipo1, equipo2 );
46 | quiniela[i].setResultado( unox2[Math.floor( 3*Math.random()) ]);
47 | quiniela[i].set_to_string( function( local, visitante, resultado ) {
48 | console.log("Imprimiendo \n");
49 | return "- " + local + " vs. " + visitante + " resultado "+ resultado;
50 | } );
51 | }
52 | return quiniela;
53 | }
54 |
55 | var quinielas = new Array;
56 | for ( var i = 0; i < 10; i ++ ) {
57 | quinielas[i] = jornada( equipos );
58 | }
59 |
60 | var resultados= new Array;
61 | for ( var i in equipos ) {
62 | resultados[equipos[i]]=0;
63 | }
64 |
65 | for ( var i = 0; i < quinielas.length; i ++ ) {
66 | for ( var j = 0;j < quinielas[i].length; j ++ ) {
67 | var local = quinielas[i][j].local;
68 | var visitante = quinielas[i][j].visitante;
69 | var resultado = quinielas[i][j].resultado;
70 | console.log(quinielas[i][j].to_string());
71 | switch (resultado) {
72 | case '1':
73 | resultados[local]+=3;
74 | break;
75 | case 'x':
76 | resultados[local]+=1;
77 | resultados[visitante]+=1;
78 | break;
79 | default:
80 | resultados[visitante]+=3;
81 | }
82 | }
83 | }
84 |
85 | for ( var i in resultados ) {
86 | console.log( i + ": " + resultados[i])
87 | }
--------------------------------------------------------------------------------
/code/funciones.js:
--------------------------------------------------------------------------------
1 | // Definición de la clase Partido
2 | function Nuevo_partido(local,visitante) {
3 | this.local = local;
4 | this.visitante=visitante;
5 | this.resultado=null;
6 | this.setResultado = setResultado;
7 | this.toString = toString;
8 | this.set_to_string = set_to_string;
9 | this.impresor = _toString;
10 | }
11 |
12 | function setResultado( esteResultado ) {
13 | if ( esteResultado == '1' || esteResultado=='x' || esteResultado=='2' )
14 | this.resultado = esteResultado;
15 | }
16 |
17 | function toString() {
18 | return this.impresor(this.local, this.visitante, this.resultado);
19 | }
20 |
21 | function _toString( local, visitante, resultado ) {
22 | return ": " + local + " - " + visitante + " = "+ resultado;
23 | }
24 |
25 | function set_to_string ( impresor ) {
26 | this.impresor = impresor;
27 | }
28 |
29 | /// El programa empieza aquí
30 | var equipos= new Array('Madrid', 'Barça', 'Atleti', 'Geta', 'Betis', 'Depor', 'Sevilla', 'Graná');
31 |
32 | function jornada( estosEquipos ) {
33 | var equiposAqui = new Array;
34 | var imprime = function( local, visitante, resultado ) {
35 | console.log("Imprimiendo \n");
36 | return "- " + local + " vs. " + visitante + " resultado "+ resultado;
37 | };
38 | equiposAqui = equiposAqui.concat(estosEquipos);
39 | var midsize = equiposAqui.length/2;
40 | var quiniela = new Array( midsize );
41 | var unox2 = new Array( '1','x','2');
42 | for ( var i=0; i < midsize ; i++ ) {
43 | var equipo1 = equiposAqui.splice(Math.floor( equiposAqui.length*Math.random()) , 1);
44 | var equipo2 = equiposAqui.splice(Math.floor( equiposAqui.length*Math.random()), 1);
45 | quiniela[i] = new Nuevo_partido( equipo1, equipo2 );
46 | quiniela[i].setResultado( unox2[Math.floor( 3*Math.random()) ]);
47 | quiniela[i].set_to_string( imprime );
48 | }
49 | return quiniela;
50 | }
51 |
52 | var quinielas = new Array;
53 | for ( var i = 0; i < 10; i ++ ) {
54 | quinielas[i] = jornada( equipos );
55 | }
56 |
57 | var resultados= new Array;
58 | for ( var i in equipos ) {
59 | resultados[equipos[i]]=0;
60 | }
61 |
62 | for ( var i = 0; i < quinielas.length; i ++ ) {
63 | for ( var j = 0;j < quinielas[i].length; j ++ ) {
64 | var local = quinielas[i][j].local;
65 | var visitante = quinielas[i][j].visitante;
66 | var resultado = quinielas[i][j].resultado;
67 | switch (resultado) {
68 | case '1':
69 | resultados[local]+=3;
70 | break;
71 | case 'x':
72 | resultados[local]+=1;
73 | resultados[visitante]+=1;
74 | break;
75 | default:
76 | resultados[visitante]+=3;
77 | }
78 | }
79 | }
80 |
81 | for ( var i in resultados ) {
82 | console.log( i + ": " + resultados[i])
83 | }
--------------------------------------------------------------------------------
/code/g.js:
--------------------------------------------------------------------------------
1 | // De Diego Toral en http://pastebin.com/Md65QLnT
2 | // Funciona con gjs g.js
3 |
4 | const Gtk = imports.gi.Gtk;
5 | const GLib = imports.gi.GLib;
6 |
7 | // Initialize the gtk
8 | Gtk.init(null, 0);
9 |
10 | let mwindow = new Gtk.Window ({type : Gtk.WindowType.TOPLEVEL});
11 | let label = new Gtk.Label ({label : "Hola k ase"});
12 |
13 | // Set the window title
14 | mwindow.title = "Hola k ase";
15 | mwindow.connect ("destroy", function(){Gtk.main_quit()});
16 |
17 | // Add the label
18 | mwindow.add (label);
19 |
20 | // Show the widgets
21 | label.show ();
22 | mwindow.show();
23 |
24 | Gtk.main();
--------------------------------------------------------------------------------
/code/geonames_call.js:
--------------------------------------------------------------------------------
1 | // this function will be called by our JSON callback
2 | // the parameter jData will contain an array with geonames objects
3 | function getLocation(jData) {
4 | if (jData == null) {
5 | // There was a problem parsing search results
6 | return;
7 | }
8 |
9 | var html = '
';
10 | var geonames = jData.geonames;
11 | for (i=0;i< geonames.length;i++) {
12 | var name = geonames[i];
13 | // we create a simple html list with the geonames objects
14 | // the link will call the center() javascript method with lat/lng as parameter
15 | html = html+""+name.name+ " - Latitud: " + name.lat +', longitud: ' + name.lng+ " ";
16 | }
17 | html+=" ";
18 | document.getElementById('resultDiv').innerHTML = html;
19 | }
20 |
21 | // calls the geonames JSON webservice with the search term
22 | function search() {
23 | request = 'http://ws.geonames.org/searchJSON?country=ES&q=' + encodeURIComponent(document.getElementById('q').value) + '&maxRows=10&callback=getLocation';
24 |
25 | // Create a new script object
26 | // Implementación en jsr_class.js
27 | aObj = new JSONscriptRequest(request);
28 | // Build the script tag
29 | aObj.buildScriptTag();
30 | // Execute (add) the script tag
31 | aObj.addScriptTag();
32 | }
33 |
--------------------------------------------------------------------------------
/code/get-doc.js:
--------------------------------------------------------------------------------
1 |
2 | var id = process.argv[2];
3 |
4 | var db = require('nano')('http://localhost:5984/')
5 | .use("ahora_no");
6 | db.get( id, null, do_stuff );
7 |
8 | // -------------------------------------------------------------------------------
9 | function do_stuff( error,data) {
10 | console.log(data);
11 | var result = 0;
12 | for (var i in data.vector) {
13 | result += data.vector[i];
14 | }
15 | data.result = result;
16 | console.log( 'Resultado ' + result );
17 | db.insert( data, { rev: data._rev },
18 | function(error,resp) {
19 | console.log( resp );
20 | } );
21 | }
22 |
--------------------------------------------------------------------------------
/code/github-get-largo.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/node
2 |
3 | var https = require('https');
4 | var state =process.argv[2]?process.argv[2]:'open';
5 | var options = {
6 | host: 'api.github.com',
7 | path: 'https://api.github.com/repos/jj/curso-js/issues?state='+state,
8 | method: 'GET',
9 | headers: {'user-agent': 'PruebaNode'}
10 | };
11 |
12 |
13 | var req = https.get(options, function(res) {
14 | res.setEncoding('utf8');
15 | var datos_JSON_acc='';
16 | res.on('data', function (datos_JSON) {
17 | datos_JSON_acc += datos_JSON;
18 | });
19 | res.on('end', function () {
20 | // console.log(datos_JSON_acc); // descomentar para ver todo el resultado
21 | var datos=JSON.parse(datos_JSON_acc);
22 | if (Array.isArray(datos)) // Comprobamos si tenemos un array de resultado o solo 1
23 | {
24 | for(var i=0;i
2 |
3 | Hola, mundo en JS
4 |
5 |
6 |
7 |
8 |