===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