===JoseHelp / Joseayuda === En 1992 no se había popularizado todavía el hipertexto en España. Pero, viendo la ayuda de algunos programas, tuve la intuición de que pronto se emplearía para algo más que proporcionar ayuda a los usuarios. En efecto, poco después, al tener acceso a las bibliotecas de shareware en CD-ROM (y sobre todo cuando posteriormente empecé a usar la web), vi que había mucha gente que estaba empleando formatos similares para proporcionar información de diversos temas (como el lector de libros electrónicos DART.EXE, cuya reseña podéis ver [[http://www.ucalgary.ca/ejournal/archive/ej-3-3.txt|aquí]]) o crear ayudas a la programación residentes en memoria (como INT21.EXE). Personalmente yo usé este programa para una traducción propia del "Expert Set" de Dungeons & Dragons (la caja azul; en España solo se vendía en la época la caja roja del D&D básico, y ni hablar de conseguir el D&D avanzado), algo para lo que hoy en día usaría HTML. La sintaxis de los archivos debe mucho a la empleada por la ayuda del DOSSHELL que se incluía en el MS-DOS 5.0. En mis archivos encuentro dos versiones: * Versión llamada "Joseayud.a" (1/5/1992): DECLARE SUB Muestratema (NombreTema$) DECLARE FUNCTION NumeroTema! (NombreTema$) DECLARE SUB MueveCursor () DECLARE SUB MuestraPantalla () DECLARE SUB QuitaCursor (x!, y!) DECLARE SUB PonCursor (x!, y!) DECLARE SUB EjecutaTema (x!, y!) 'Información en línea v. 2.0 'Para QBasic 'Por J. G. M. Y. TYPE Tema nombre AS STRING * 3 localizacion AS LONG END TYPE DIM temas(100) AS Tema DIM Texto$(800) 'Introducción de nombre del fichero EntraNombre: INPUT "¿Qué archivo contiene la información a visualizar?"; a$ IF INSTR(a$, "*") > 0 THEN FILES a$: GOTO EntraNombre IF INSTR(a$, ".") < 1 THEN a$ = a$ + ".ENL" NombArc$ = a$ 'Lectura del archivo OPEN NombArc$ FOR INPUT AS #1 Linea = 1 TemaActual = 0 DO UNTIL EOF(1) INPUT #1, a$ IF INSTR(a$, "!>") > 0 THEN temas(TemaActual).nombre = MID$(a$, INSTR(a$, "!>") + 2, 3) temas(TemaActual).localizacion = Linea TemaActual = TemaActual + 1 END IF Linea = Linea + 1 LOOP CLOSE #1 FOR a = 0 TO TemaActual PRINT temas(a).nombre; temas(a).localizacion NEXT SLEEP 0 CLS Muestratema "T00" SUB EjecutaTema (x, y) SHARED Texto$(), PosicionInicioPantalla Linea = PosicionInicioPantalla + y - 1 a = x Linea$ = Texto$(Linea) DO UNTIL a > LEN(Linea$) IF MID$(Linea$, a, 1) = CHR$(17) THEN EXIT SUB 'EMPIEZA BOTON NUEVO IF MID$(Linea$, a, 1) = CHR$(16) THEN NombreTema$ = MID$(Linea$, a + 1, 3) Muestratema (NombreTema$) EXIT SUB END IF a = a + 1 LOOP END SUB SUB MuestraPantalla SHARED x, y, NLineaTexto, PosicionInicioPantalla SHARED Texto$() lin = 1 max = 20 IF NLineaTexto < 20 THEN max = NLineaTexto FOR f = PosicionInicioPantalla TO PosicionInicioPantalla + max LOCATE lin, 1 lin = lin + 1 a = INSTR(Texto$(f), CHR$(16)) a$ = Texto$(f) IF a > 0 THEN MID$(a$, a + 1, 3) = " " PRINT a$ NEXT END SUB SUB Muestratema (NombreTema$) SHARED temas() AS Tema, Texto$() SHARED NombArc$, NLineaTexto OPEN NombArc$ FOR INPUT AS #1 ntema = NumeroTema(NombreTema$) Buscar = temas(ntema).localizacion Linea = 1 DO UNTIL Buscar = Linea INPUT #1, a$ PRINT a$ LOOP LOCATE 25, 1 PRINT USING "(TEMA:\ \ LOCALIZACION: #####"; temas(ntema).nombre; temas(ntema).localizacion LOCATE 1, 1 Texto$(0) = a$ NLineaTexto = 1 DO UNTIL EOF(1) INPUT #1, a$ IF INSTR(a$, "!>") > 0 THEN EXIT DO Texto$(NLineaTexto) = a$ NLineaTexto = NLineaTexto + 1 LOOP CLOSE #1 MuestraPantalla DO MueveCursor LOOP END SUB SUB MueveCursor SHARED PosicionInicioPantalla, x, y IN$ = INKEY$ IF y < 1 THEN y = 1 IF x < 1 THEN x = 1 QuitaCursor x, y SELECT CASE IN$ CASE CHR$(0) + CHR$(72) IF y > 1 THEN y = y + 1 IF y = 1 AND PosicionInicioPantalla > 0 THEN PosicionInicioPantalla = PosicionInicioPantalla + 1 MuestraPantalla END IF CASE CHR$(0) + CHR$(80) IF y < 21 THEN y = y + 1 IF y = 21 AND PosicionInicioPantalla < NLineaTexto + 21 THEN PosicionInicioPantalla = PosicionInicioPantalla + 1 MuestraPantalla END IF CASE CHR$(0) + CHR$(75) IF x > 1 THEN x = x - 1 CASE CHR$(0) + CHR$(77) IF x < 80 THEN x = x + 1 CASE CHR$(13) EjecutaTema x, y END SELECT PonCursor x, y END SUB FUNCTION NumeroTema (NombreTema$) SHARED temas() AS Tema encontrado = 0 FOR a = 0 TO 100 IF temas(a).nombre = NombreTema$ THEN NumeroTema = a encontrado = -1 END IF NEXT IF NOT encontrado THEN NumeroTema = 0 END FUNCTION SUB PonCursor (x, y) LOCATE y, x PRINT "_" END SUB SUB QuitaCursor (x, y) SHARED PosicionInicioPantalla, Texto$() Linea$ = Texto$(PosicionInicioPantalla + y - 1) Caracter$ = MID$(Linea$, x, 1) SeEncuentra = INSTR(Linea$, CHR$(16)) IF SeEncuentra > 0 THEN IF (x - SeEncuentra) >= 1 AND (x - SeEncuentra) <= 3 THEN Caracter$ = " " END IF LOCATE y, x PRINT Caracter$ END SUB * Versión llamada "Josehelp.bas" () DECLARE SUB Muestratema (nombretema$) DECLARE FUNCTION NumeroTema! (nombretema$) DECLARE SUB Muevecursor () DECLARE SUB MuestraPantalla () DECLARE SUB QuitaCursor (x!, y!) DECLARE SUB PonCursor (x!, y!) DECLARE SUB Ejecutatema (x!, y!) 'Informaci¢n en l¡nea v. 2.0 'Para QBasic 'Por J. G. M. Y. TYPE tipotema tema AS STRING * 3 END TYPE '$STATIC DIM Texto$(800) DIM temaanterior(100) AS tipotema punterotema = 0 COLOR 7, 1: CLS 'Introducci¢n de nombre del fichero EntraNombre: INPUT "¨Qu‚ archivo contiene la informaci¢n a visualizar?"; a$ IF INSTR(a$, "*") > 0 THEN FILES a$: GOTO EntraNombre IF INSTR(a$, ".") < 1 THEN a$ = a$ + ".ENL" NombArc$ = a$ CLS Muestratema "T00" DO Muevecursor LOOP SUB Ejecutatema (x, y) SHARED Texto$(), PosicionInicioPantalla SHARED temaanterior() AS tipotema, punterotema Linea = PosicionInicioPantalla + y - 1 a = x Linea$ = Texto$(Linea) DO UNTIL a > LEN(Linea$) IF MID$(Linea$, a, 1) = CHR$(17) THEN EXIT SUB 'EMPIEZA BOTON NUEVO IF MID$(Linea$, a, 1) = CHR$(16) THEN nombretema$ = MID$(Linea$, a + 1, 3) temaanterior(punterotema).tema = nombretema$ punterotema = punterotema + 1 Muestratema (nombretema$) EXIT SUB END IF a = a + 1 LOOP END SUB SUB MuestraPantalla SHARED x, y, NLineaTexto, PosicionInicioPantalla SHARED Texto$() lin = 1 max = 20 IF NLineaTexto < 20 THEN max = NLineaTexto FOR f = PosicionInicioPantalla TO PosicionInicioPantalla + max LOCATE lin, 1 lin = lin + 1 a = INSTR(Texto$(f), CHR$(16)) a$ = Texto$(f) IF LEN(a$) < 80 THEN a$ = a$ + SPACE$(80 - LEN(a$)) IF a > 0 THEN MID$(a$, a + 1, 3) = " " PRINT a$ IF INSTR(a$, CHR$(16)) > 0 OR INSTR(a$, CHR$(17)) > 0 THEN FOR n = 1 TO 80 IF MID$(a$, n, 1) = CHR$(16) THEN COLOR 2, 1 LOCATE lin - 1, n PRINT CHR$(16) IF n - 3 < 80 THEN LOCATE lin - 1, n + 1: PRINT STRING$(3, " ") COLOR 7, 1 END IF IF MID$(a$, n, 1) = CHR$(17) THEN COLOR 2, 1 LOCATE lin - 1, n PRINT CHR$(17) COLOR 7, 1 END IF NEXT END IF NEXT END SUB SUB Muestratema (nombretema$) SHARED Texto$() SHARED NombArc$, NLineaTexto, PosicionInicioPantalla OPEN NombArc$ FOR INPUT AS #1 ERASE Texto$ Linea = 1 DO UNTIL INSTR(a$, "!>" + nombretema$) > 0 LINE INPUT #1, a$ 'PRINT a$ LOOP LOCATE 1, 1 Texto$(0) = a$ NLineaTexto = 1 DO UNTIL EOF(1) LINE INPUT #1, a$ IF INSTR(a$, "!>") > 0 THEN EXIT DO Texto$(NLineaTexto) = a$ NLineaTexto = NLineaTexto + 1 LOOP CLS CLOSE #1 PosicionInicioPantalla = 0 MuestraPantalla END SUB SUB Muevecursor SHARED PosicionInicioPantalla, x, y, NLineaTexto SHARED temaanterior() AS tipotema, punterotema, Texto$() IN$ = INKEY$ IF y < 1 THEN y = 1 IF x < 1 THEN x = 1 QuitaCursor x, y LOCATE 23, 60 IF NLineaTexto > 21 + PosicionInicioPantalla THEN PRINT "(SIGUE ABAJO)" ELSE PRINT SPACE$(14) LOCATE 1, 60 IF PosicionInicioPantalla > 1 THEN PRINT "(SIGUE ARRIBA)" ELSE PRINT SPACE$(15) SELECT CASE IN$ CASE CHR$(27) temaanterior(punterotema).tema = "T00" punterotema = punterotema + 1 Muestratema "T00" 'Muestra el tema-cero (Indice, normalmente) CASE CHR$(0) + CHR$(71) 'inicio x = 1 CASE CHR$(0) + CHR$(79) 'fin x = LEN(Texto$(y + PosicionInicioPantalla - 1)) IF x = 0 THEN x = 1 CASE CHR$(9) 'Tab: retroceder IF punterotema = 0 THEN PLAY "A32" ELSE punterotema = punterotema - 1 Muestratema temaanterior(punterotema).tema END IF CASE CHR$(0) + CHR$(73) 'ReP g IF PosicionInicioPantalla > 21 THEN PosicionInicioPantalla = PosicionInicioPantalla - 21 ELSE PosicionInicioPantalla = 1 END IF MuestraPantalla CASE CHR$(0) + CHR$(72) 'Arriba IF y > 1 THEN y = y - 1 IF y = 1 AND PosicionInicioPantalla > 0 THEN PosicionInicioPantalla = PosicionInicioPantalla - 1 MuestraPantalla END IF CASE CHR$(0) + CHR$(81) 'AvP g IF PosicionInicioPantalla + 21 < NLineaTexto THEN PosicionInicioPantalla = PosicionInicioPantalla + 21 ELSE PosicionInicioPantalla = NLineaTexto - 20 END IF MuestraPantalla CASE CHR$(0) + CHR$(80) 'Abajo IF y < 21 THEN y = y + 1 IF y = 21 AND PosicionInicioPantalla + 21 <= NLineaTexto THEN PosicionInicioPantalla = PosicionInicioPantalla + 1 MuestraPantalla END IF CASE CHR$(0) + CHR$(75) IF x > 1 THEN x = x - 1 CASE CHR$(0) + CHR$(77) IF x < 80 THEN x = x + 1 CASE CHR$(13) Ejecutatema x, y END SELECT PonCursor x, y END SUB SUB PonCursor (x, y) LOCATE y, x PRINT CHR$(219) END SUB SUB QuitaCursor (x, y) SHARED PosicionInicioPantalla, Texto$() Linea$ = Texto$(PosicionInicioPantalla + y - 1) caracter$ = MID$(Linea$, x, 1) SeEncuentra = INSTR(Linea$, CHR$(16)) IF caracter$ = "" OR caracter$ = CHR$(0) THEN caracter$ = CHR$(32) IF SeEncuentra > 0 THEN IF x <= 4 THEN cad1$ = MID$(Linea$, 1, x) ELSE cad1$ = MID$(Linea$, x - 4, 4) END IF IF INSTR(cad1$, CHR$(16)) > 1 THEN caracter$ = " " '(x - SeEncuentra) >= 1 AND (x - SeEncuentra) <= 3 THEN caracter$ = " " END IF LOCATE y, x IF caracter$ = CHR$(16) OR caracter$ = CHR$(17) THEN COLOR 2, 1 PRINT caracter$ COLOR 7, 1 END SUB