/*REXX*/ 'ISREDIT MACRO(PARMS)' /* TRACE I */ /*-------------------------------------------------------------------*/ /* This SPF Macro is used to check the html syntax of the file */ /* being edited. */ /* Uses Tidy.exe program (freeware) for HTML */ /* Uses PHP Windows Binaries for PHP */ /* Uses Jlint for Java */ /* */ /* By Mark McDonald 20001112 */ /*-------------------------------------------------------------------*/ /*--- Determine REXX ---*/ TSPF = XDETREXX() /*--- SPF REXX v4/5 ---*/ IF (TSPF = 4 | TSPF = 5) THEN DO FILENAME = YESSPF() END /*--- Not SPF REXX - Use for stand-alone REXX - DOSREXX OR OOREXX etc. ---*/ IF (TSPF = 0 | TSPF = 6) THEN DO PARSE ARG FILENAME FULLNAME = FILENAME END /*--- Get Arguments(If Any)---*/ OPT1 = TRANSLATE(PARMS) /*--- Get Path ---*/ T = LASTPOS('\',FILENAME,1) PATH = LEFT(FILENAME,T) /*--- Get Extenstion of File Name ---*/ EXNT = SUBSTR(FILENAME,POS('.',FILENAME)+1,3) EXNT = TRANSLATE(EXNT) /*--- Declare Variable Constants and Flags ---*/ FOUND_ONE = 0 /*--- Set Name of Compile Result File ---*/ RESULT = 'C:\TEMP\DRET.TXT' /*--- Call Tidy HTML Syntax Checker ---*/ IF EXNT = "HTM" | EXNT = "HTML" THEN CALL TIDY IF EXNT = "PHP" THEN CALL PHP IF EXNT = "JS" THEN CALL JS /*--- Exit SPF Macro ---*/ EXIT 0 /*--------------------------------------------------------------------*/ /* Subroutines */ /*--------------------------------------------------------------------*/ /*--- JS Lint --*/ JS: RESULT = "C:\TEMP\DRET.JS" TRESULT = "C:\TEMP\DRET.JS" TR = LINEOUT('C:\TEMP\DRET.BAT','H:\U\JLINT\JSLINT.BAT 'FILENAME' 'TRESULT,1) TR = LINEOUT('C:\TEMP\DRET.BAT','EXIT') TR = LINEOUT('C:\TEMP\DRET.BAT') CALL TOSCMD 'C:\TEMP\DRET.BAT' /* CALL TOSCMD 'H:\U\JLINT\JLINT.BAT 'FILENAME' 'RESULT */ /* CALL TOSCMD 'H:\U\JLINT\jsl.exe -conf h:\u\jlint\jsl.default.conf -process 'FILENAME' > 'RESULT */ CALL INERROR TRESULT EXNT FILENAME TSPF RETURN /*--- PHP Windows Binary --*/ PHP: RESULT = "C:\TEMP\DRET.TXT" TRESULT = "C:\TEMP\DRET.TXT" CALL TOSCMD "ECHO -- > "RESULT CALL TOSCMD 'h:\u\php\php-win.exe 'FILENAME CALL INERROR TRESULT EXNT FILENAME TSPF RETURN /*--- Tidy HTML Cleaner ----------------------------------------------*/ TIDY: TRESULT = "C:\TEMP\DRET.TXT" RESULT = "C:\TEMP\DRET.TXT" CALL TOSCMD 'H:\U\TIDY.EXE -f 'TRESULT' 'FILENAME CALL INERROR TRESULT EXNT FILENAME TSPF RETURN /*--------------------------------------------------------------------*/ INERROR: PROCEDURE PARSE ARG RESULT EXNT FILENAME TSPF /*--- Not SPF REXX - Use for stand-alone REXX - DOSREXX OR OOREXX etc. ---*/ IF (TSPF = 0 | TSPF = 6) THEN DO CALL NOSPF RESULT EXNT FILENAME END TCNT = 0 /*--- Reset Error Flag ---*/ FOUND_ONE = 0 /*--- Loop Through Compile Result File - Put Into Array ---*/ CNT = 0 DO WHILE LINES(RESULT) > 0 CNT = CNT + 1 DATA.CNT = LINEIN(RESULT) END TCNT = CNT REAL2FLG = 0 /*--- Close input file ---*/ TR = LINEOUT(RESULT) /*--- IS SPFPC Loop Through Array - Position Error Messages With Source Code ---*/ DO CNT = 1 TO TCNT IF (CNT = 1 & EXNT = "PHP") THEN ITERATE IF (CNT < 5 & EXNT = "JS") THEN ITERATE DATALINE = DATA.CNT LINENO = 0 /*--- Javascript - Extract Source Code Line Number ---*/ IF EXNT = "JS" & WORDS(DATALINE) > 4 & WORD(DATALINE,4) = "):" THEN DO LINENO = WORD(DATALINE,3) FOUND_ONE = 1 CALL FIXQUOTES END /*--- PHP - Extract Source Code Line Number ---*/ IF EXNT = "PHP" THEN DO LINENO = WORD(DATALINE,WORDS(DATALINE)) FOUND_ONE = 1 CALL FIXQUOTES END /*--- HTML - Extract Source Code Line Number ---*/ IF (EXNT = 'HTM' | EXNT = 'HTML') & WORD(DATALINE,1) = "line" THEN DO LINENO = WORD(DATALINE,2) FOUND_ONE = 1 CALL FIXQUOTES END END /* --- Determine If Error Found/Do Appropriate Condition ---*/ CALL IFERROR RETURN /*--------------------------------------------------------------------*/ SEPLINE1: ERRLINE = COPIES('=',69) "ISREDIT LINE_BEFORE " LINENO "= NOTELINE " ERRLINE RETURN /*--------------------------------------------------------------------*/ SEPLINE2: ERRLINE = COPIES('=',69) "ISREDIT LINE_AFTER " LINENO "= NOTELINE " ERRLINE RETURN /*--------------------------------------------------------------------*/ /*--- Change quotes(single/double) to tildes - prevents REXX errors --*/ FIXQUOTES: ERRLINE = TRANSLATE(DATALINE,"~","'") ERRLINE = TRANSLATE(ERRLINE,'~','"') "ISREDIT LINE_BEFORE " LINENO "= NOTELINE '"ERRLINE"'" RETURN /*-------------------------------------------------------------------*/ /*--- Positions Cursor to first error line and exits macro ----------*/ IFERROR: IF FOUND_ONE = 1 THEN DO ZEDSMSG = "ERRORS FOUND" 'ISREDIT LOCATE FIRST SPECIAL' END ELSE DO ZEDSMSG = "CHECK SUCCESSFUL" ZEDLMSG = "CHECK FOUND NO SYNTAX ERRORS DURING COMPILE." END 'ISPEXEC SETMSG MSG(ISRZ000)' EXIT 0 /*Returns to Source Code*/ RETURN /*-----------------------------------------------------------------*/ NOSPF: PROCEDURE PARSE ARG RESULT EXNT FILENAME CNT = 0 TCNT = 0 DO WHILE LINES(RESULT) > 0 CNT = CNT + 1 DATA.CNT = LINEIN(RESULT) END TCNT = CNT REAL2FLG = 0 /*--- Close input file ---*/ TR = LINEOUT(RESULT) RESULT = "C:\TEMP\DRET2.TXT" SP = LASTPOS('\', FILENAME,1) + 1 TFILE = XFILESPEC("N",FILENAME) TR = LINEOUT(RESULT,FILENAME,1) DO CNT = 1 TO TCNT BY 1 /*--- Javascript - Extract Source Code Line Number ---*/ IF EXNT = "JS" THEN DO LINENO = WORD(DATA.CNT,3) SP = POS("):", DATA.CNT,1) IF SP > 0 THEN DO TR = LINEOUT(RESULT,WORD(DATA.CNT,1)' ('LINENO',1) : 'SUBSTR(DATA.CNT,SP+2)) END END /*--- HTML? ---*/ IF EXNT = "HTM" | EXNT = "HTML" THEN DO IF SUBSTR(TRANSLATE(DATA.CNT),1,4) = "LINE" THEN DO ESP = 0 ESP = POS(" - ", DATA.CNT) IF ESP > 0 THEN DO TR = LINEOUT(RESULT,TFILE' ('WORD(DATA.CNT,2)','WORD(DATA.CNT,4)') : 'SUBSTR(DATA.CNT,ESP)) END END END /*--- PHP? ---*/ IF EXNT = "PHP" THEN DO ESP = 0 ESP = POS("ERROR:", TRANSLATE(DATA.CNT)) IF ESP > 0 THEN DO TR = LINEOUT(RESULT,TFILE' ('WORD(DATA.CNT,WORDS(DATA.CNT))',1) : 'SUBSTR(DATA.CNT,ESP+7)) END END END TR = LINEOUT(RESULT) EXIT 0 RETURN /*----------------------------------------------------*/ YESSPF: PROCEDURE /*--- Get rid of previous error lines ---*/ 'ISREDIT RESET SPECIAL' /*--- If source has not been saved, save it ---*/ 'ISREDIT (MODIFIED) = DATA_CHANGED' IF (MODIFIED=YES) THEN 'ISREDIT SAVE' /*--- Retrieve Path/File Name of Source File ---*/ 'ISREDIT (FILENAME) = DATASET' /*C:\TEMP\FILE.EXE*/ RETURN (FILENAME) /*----------------------------------------------------------------- Determine which REXX interpreter is being used ---------------------------------------------------------------*/ XDETREXX: PROCEDURE parse version name level date1 date2 date3 TSPF = 0 /* Using a stand-alone REXX Interpreter DOSREXX*/ IF name = "REXXSAA" & date3 = "1994" THEN TSPF = 0 /* Using PCDOS REXX*/ IF name = "REXX-r4" THEN TSPF = 1 /* Using R4 */ IF name = "REXXPC88" & date3 = "1987" THEN TSPF = 2 /* Using REXXIBM (1987)*/ IF name = "REXX/Personal" & date3 = "1992" THEN TSPF = 3 /* Using Personal REXX v4*/ IF name = "REXX/2" & date3 = "1995" THEN TSPF = 4 /* Using SPFPC v4 */ IF name = "REXX/2" & date3 = "1996" THEN TSPF = 5 /* Using SPFPRO */ IF name = "REXX-ooRexx_3.2.0(MT)" THEN TSPF = 6 /* Using OOREXX */ RETURN (TSPF) /*-- Pass Command to OS --------------------------------------------------*/ TOSCMD: PROCEDURE PARSE ARG TCMD TSPF = XDETREXX() IF TSPF = 0 THEN ADDRESS COMMAND TCMD /*DOSREXX*/ IF (TSPF = 4 | TSPF = 5) THEN ADDRESS DOS TCMD /*SPFPC4/SPFPRO - Delete if using OOREXX*/ IF TSPF = 6 THEN TCMD /*OOREXX*/ RETURN /*---------------------------------------------------------------*/ /* Removes Leftmost n characters */ /* T = XTRIML("--ONE",2) returns "ONE" */ /*---------------------------------------------------------------*/ XTRIML: PROCEDURE PARSE ARG X, N IF LENGTH(X) - 1 >= N THEN XR = RIGHT(X,LENGTH(X) - N) ELSE XR = X RETURN (XR) /*---------------------------------------------------------------*/ /* Breaks Variable Down into Drive:\Path\filespec.ext components*/ /* T = "D:\PATH1\PATH2\FILESPEC.EXT" */ /* R = XFILESPEC(OPTION,T) */ /* Option Returns */ /* D D: */ /* P \PATH1\PATH2\ */ /* N FILESPEC.EXT */ /* F FILESPEC */ /* E EXT */ /* H D:\PATH1\PATH2\ */ /* M D:\PATH1\PATH2\FILESPEC */ /* W D: \PATH1\PATH2\ FILESPEC EXT */ /* C D:,\PATH1\PATH2\,FILESPEC,EXT */ /* Uses XTRIML */ /*---------------------------------------------------------------*/ XFILESPEC: PROCEDURE PARSE ARG OPT,X XR = "" XDRV = "" XPATH = "" XNAME = "" XSPEC = "" XEXT = "" /* --- Drive Letter Present? ---*/ IF POS(":",X,1) > 0 THEN DO XDRV = LEFT(X,2) /* --- Remove Drive Letter: ---*/ X = XTRIML(X,2) END /* --- Path Present? ---*/ IF POS("\",X,1) > 0 THEN DO SP = POS("\",X,1) EP = LASTPOS("\",X) IF SP <> EP THEN XPATH = SUBSTR(X,SP,EP-SP+1) IF SP = EP THEN XPATH = "\" /* --- Remove Path ---*/ X = XTRIML(X,EP) END /* --- Get File Spec ---*/ XNAME = X SP = POS(".",X,1) IF SP > 0 THEN DO XSPEC = LEFT(X,SP-1) X = XTRIML(X,SP) XEXT = X END IF OPT = "D" THEN XR = STRIP(XDRV) IF OPT = "P" THEN XR = STRIP(XPATH) IF OPT = "N" THEN XR = STRIP(XNAME) IF OPT = "F" THEN XR = STRIP(XSPEC) IF OPT = "E" THEN XR = STRIP(XEXT) IF OPT = "H" THEN XR = STRIP(XDRV""XPATH) IF OPT = "M" THEN XR = STRIP(XDRV""XPATH""XSPEC) IF OPT = "W" THEN XR = STRIP(XDRV" "XPATH" "XSPEC" "XEXT) IF OPT = "C" THEN XR = STRIP(XDRV","XPATH","XSPEC","XEXT) RETURN (XR)