v1.0.0 RC 1
This commit is contained in:
267
inc/reader.php
Normal file
267
inc/reader.php
Normal file
@@ -0,0 +1,267 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Abap Reader
|
||||
* @author franzz
|
||||
*/
|
||||
class Reader
|
||||
{
|
||||
//objects
|
||||
//private $oMask;
|
||||
|
||||
//general
|
||||
private $sCode;
|
||||
private $bImprovedColoring;
|
||||
|
||||
//Special Wors / Chars
|
||||
private $asAbap;
|
||||
|
||||
//constants
|
||||
const CASE_SENSITIVE = false;
|
||||
const NOT_FOUND = '* Code introuvable...';
|
||||
|
||||
function __construct($sCode, $bImprovedColoring = false)
|
||||
{
|
||||
//settings
|
||||
$this->bImprovedColoring = $bImprovedColoring;
|
||||
|
||||
//get code in db
|
||||
$this->sCode = $sCode;
|
||||
if($this->sCode=='')
|
||||
{
|
||||
$this->sCode = self::NOT_FOUND;
|
||||
}
|
||||
|
||||
//ABAP key words and chars
|
||||
$this->asAbap = array
|
||||
(
|
||||
'word'=>array
|
||||
(
|
||||
'wCore'=>array( /*'<icon>','<itab>',*/'ABBREVIATED','ABSTRACT','ABSTRACTFINAL','ACCEPT','ACCEPTING','ACCORDING','ACTUAL','ADD',
|
||||
'ADD-CORRESPONDING','ADDITIONS','ADJACENT','ALIASES','ALL','ALLOCATE','ANALYZER', 'AND','APPEND','APPENDING','AS',
|
||||
'ASCENDING','ASCENDINGDESCENDING','AT','ATTRIBUTE','AUTHORITY-CHECK','BACKGOUND','BEFORE','BEGIN','BETWEEN',
|
||||
'BIGLITTLE','BINARY','BIT','BLANK','BLOCK','BREAK-POINT','BY','BYPASSING','BYTE','BYTECHARACTER','CASE',
|
||||
'CASERESPECTING','CASTING','CENTERED','CHAIN','CHANGE','CHANGING','CHARACTER','CHECK','CHECKBOX',
|
||||
'CHECKBOXSYMBOLICONLINE','CLASS','CLASS-DATA','CLASS-EVENTS','CLASS-METHODS','CLEANUP','CLEAR','CLIENT','CLOCK',
|
||||
'CODE','COL_BACKGROUND','COL_HEADING','COL_NORMAL','COL_TOTAL','COLLECT','COLOR','COLUMN','COMMENT','COMMIT',
|
||||
'COMMON','COMMUNICATION','COMPARING','COMPONENTS','COMPUTE','CONCATENATE','CONDENSE','CONSTANTS','CONTEXT',
|
||||
'CONTEXTS','CONTINUE','CONTROL','CONTROLS','CONVERSION','CONVERT','COUNTRY','COUNTY','CURRENT','CURSOR',
|
||||
'CUSTOMER-FUNCTION','DATA','DATABASE','DATASET','DATE','DEALLOCATE','DECIMALS','DEFAULT','DEFAULTUTF-8NON-UNICODE',
|
||||
'DEFERRED','DEFINE','DEFINING','DEFINITION','DELETE','DELETING','DEMAND','DESCENDING','DESCRIBE','DESTINATION',
|
||||
'DIALOG','DIRECTORY','DISTANCE','DISTINCT','DIVIDE-CORRESPONDING','DO','DUPLICATE','DUPLICATES','DURING','DYNAMIC',
|
||||
'EDIT','EDITOR-CALL','ELSE','ELSEIF','ENCODING','END','ENDAT','ENDCASE','ENDCATCH','ENDCHAIN','ENDCLASS','ENDDO',
|
||||
'ENDEXEC','ENDFORM','ENDFUNCTION','ENDIAN','ENDIF','ENDING','ENDINTERFACE','ENDLOOP','ENDMETHOD','ENDMODULE',
|
||||
'ENDON','ENDPROVIDE','ENDSELECT','ENDTRY','ENDWHILE','END-OF_FILE','END-OF-DEFINITION','END-OF-PAGE',
|
||||
'END-OF-SELECTION','ENTRIES','EQ','ERRORS','EVENT','EVENTS','EXCEPTION','EXCEPTIONS','EXCEPTION-TABLE','EXCLUDE',
|
||||
'EXCLUDING','EXEC','EXIT','EXIT-COMMAND','EXPORT','EXPORTING','EXTENDED','EXTRACT','FETCH','FIELD','FIELD-GROUPS',
|
||||
'FIELDSNO','FIELD-SYMBOLS','FILTER','FINAL','FIND','FIRST','FOR','FORM','FORMAT','FORWARDBACKWARD','FOUND','FRAME',
|
||||
'FREE','FRIENDS','FROM','FUNCTION','FUNCTION-POOL','GE','GET','GIVING','GROUP','GT','HANDLER','HASHED','HAVING',
|
||||
'HEADER','HEADING','HELP-ID','HIDE','HIGHLOW','HOLD','HOTSPOT','ID','IF','IGNORING','IMMEDIATELY','IMPLEMENTATION',
|
||||
'IMPORT','IMPORTING','IN','INCREMENT','INDEX','INDEX-LINE','INHERITING','INIT','INITIAL','INITIALIZATION','INNER',
|
||||
'INNERLEFT','INSERT','INSTANCES','INTENSIFIED','INTERFACE','INTERFACES','INTERVALS','INTO','INTOAPPENDING',
|
||||
'INVERTED-DATE','IS','ITAB','JOIN','KEEPING','KEY','KEYS','KIND','LANGUAGE','LAST','LE','LEAVE','LEFT',
|
||||
'LEFT-JUSTIFIED','LEFTRIGHT','LEFTRIGHTCIRCULAR','LEGACY','LENGTH','LIKE','LINE','LINE-COUNT','LINES','LINES',
|
||||
'LINE-SELECTION','LINE-SIZE','LIST','LIST-PROCESSING','LOAD','LOAD-OF-PROGRAM','LOCAL','LOCALE','LOOP','LT',
|
||||
'MARGIN','MARK','MASK','MATCH','MAXIMUM','MEMORY','MESSAGE','MESSAGE-ID','MESSAGES','METHOD','METHODS','MOD','MODE',
|
||||
'MODEIN','MODIF','MODIFIER','MODIFY','MODULE','MOVE','MOVE-CORRESPONDING','MULTIPLY-CORRESPONDING','NE','NEW',
|
||||
'NEW-LINE','NEW-PAGE','NEXT','NODES','NODETABLE','NO-DISPLAY','NO-EXTENSION','NO-GAP','NO-GAPS',
|
||||
'NO-HEADINGWITH-HEADING','NON','NO-SCROLLING','NO-SCROLLINGSCROLLING','NOT','NO-TITLEWITH-TITLE','NO-ZERO','NUMBER',
|
||||
'OBJECT','OBLIGATORY','OCCURENCE','OCCURENCES','OCCURS','OF','OFF','OFFSET','ON','ONLY','ONOFF','OPEN','OPTION',
|
||||
'OPTIONAL','OR','ORDER','OTHERS','OUTPUT-LENGTH','OVERLAY','PACK','PACKAGE','PAGE','PAGELAST','PAGEOF','PAGEPAGE',
|
||||
'PAGES','PARAMETER','PARAMETERS','PARAMETER-TABLE','PART','PERFORM','PERFORMING','PFN','PF-STATUS','PLACES',
|
||||
'POS_HIGH','POS_LOW','POSITION','POSITIONS','PRIMARY','PRINT','PRINT-CONTROL','PRIVATE','PROCESS','PROGRAM',
|
||||
'PROPERTY','PROTECTED','PROVIDE','PUBLIC','PUBLICPROTECTEDPRIVATE','PUSHBUTTON','PUT','QUICKINFO','RADIOBUTTON',
|
||||
'RAISE','RAISING','RANGE','RANGES','READ','RECEIVE','RECEIVING','REDEFINITION','REFERENCE','REFRESH','REJECT',
|
||||
'RENAMING','REPLACE','REPLACEMENT','REPORT','RESERVE','RESET','RESOLUTION','RESULTS','RETURN','RETURNING','RIGHT',
|
||||
'RIGHT-JUSTIFIED','ROLLBACK','ROWS','RUN','SCAN','SCREEN','SCREEN-GROUP1','SCREEN-GROUP2','SCREEN-GROUP3',
|
||||
'SCREEN-GROUP4','SCREEN-GROUP5','SCREEN-INPUT','SCREEN-INTENSIFIED','SCROLL','SCROLL-BOUNDARY','SEARCH','SECTION',
|
||||
'SELECT','SELECTION','SELECTIONS','SELECTION-SCREEN','SELECTION-SET','SELECTION-TABLE','SELECT-OPTIONS','SEND',
|
||||
'SEPARATED','SET','SHARED','SHIFT','SIGN','SINGLE','SINGLEDISTINCT','SIZE','SKIP','SORT','SORTABLE','SPACE',
|
||||
'SPECIFIED','SPLIT','SQL','STABLE','STAMP','STANDARD','START','STARTING','START-OF-SELECTION','STATICS','STEP-LOOP',
|
||||
'STOP','STRLEN','STRUCTURE','SUBMIT','SUBTRACT','SUBTRACT-CORRESPONDING','SUFFIX','SUPPLY','SUPPRESS','SYMBOLS',
|
||||
'SYSTEM-EXCEPTIONS','TABLE','TABLES','TABLEVIEW','TASK','TEXT','THEN','TIME','TIMES','TITLE','TITLEBAR','TO',
|
||||
'TOPIC','TOP-OF-PAGE','TRAILING','TRANSACTION','TRANSFER','TRANSLATE','TRY','TYPE','TYPELIKE','TYPE-POOL',
|
||||
'TYPE-POOLS','TYPES','ULINE','UNION','UNIQUE','UNTIL','UP','UPDATE','UPPERLOWER','USER-COMMAND','USING','VALUE',
|
||||
'VALUES','VARY','VARYING','VERSION','VIA','WAIT','WHEN','WHERE','WHILE','WINDOW','WITH','WORK','WRITE','ZONE','ADD',
|
||||
'ADD-CORRESPONDING','APPEND','BREAK-POINT','CORRESPONDING','FIELDS','ASSIGN','AVG','BACK','CALL','CATCH','CHANGE',
|
||||
'CHECK','CLEAR','CLOSE','COMMIT','COMPUTE','COUNT','CREATE','DATASET','DELETE','DESCRIBE','DIVIDE','DO','ELSE',
|
||||
'ELSEIF','EXIT','FIND','FOR','FORMAT','GET','IF','INCLUDE','LOOP','MAX','MESSAGE','METHOD','MIN','MODIFY','MOVE',
|
||||
'MULTIPLY','NEW-PAGE','OBJECT','OPEN','ORDER','READ','SORT','SUM','TRANSLATE','ULINE','WORK','WRITE','XSTRLEN',
|
||||
'ABS','ACOS','AFTER','ALL','AND','AS','ASIN','ASSIGNING','AT','ATAN','BEGIN','BUFFER','BY','CA','CEIL','CENTERED',
|
||||
'CN','CO','COLOR','COMPARING','COMPONENT','COS','COSH','CP','CS','DEFAULT','END','EQ','EXP','FLOOR','FRAC','GE',
|
||||
'GROUP','GT','ICON','IN','INDEX','INNER','INTENSIFIED','INTO','IS','JOIN','LE','LEADING','LEAVE','LEFT','LIKE',
|
||||
'LOG','LOG10','LOWER','LT','M','MOD','NA','NE','NOT','NP','NS','O','OF','OFF','ON','OR','OTHERS','OUTER','REF',
|
||||
'RIGHT','SIGN','SIN','SINH','SQRT','TABLE','TABLENAME','TAN','TANH','TITLE','TO','TRAILING','TRUNC','TYPE','UPPER',
|
||||
'USING','VALUE','WITH', 'TRANSPORTING', 'TYPE-POOLS'),
|
||||
'wBwCore'=>array('SOURCE_PACKAGE', 'RESULT_PACKAGE', '<SOURCE_FIELDS>', '<RESULT_FIELDS>'),
|
||||
'cOperator'=>array('(', ')', ',', '.', ':', '-', '~', '[', ']', '<', '>'),
|
||||
'cCalculation'=>array('+', '-', '*', '/', '=', '(', ')'),
|
||||
'cComment'=>array('*'),
|
||||
'cPartComment'=>array('"'),
|
||||
'cString'=>array('"', '''),
|
||||
'iNumber'=>array('1', '2', '3', '4', '5', '6', '7', '8', '9', '0'),
|
||||
'wExpand'=>array('loop'=>'endloop', 'if'=>'endif'),
|
||||
'wGlobal'=>array('SY'),
|
||||
'wCodePart'=>array('main', 'global', 'global2')
|
||||
),
|
||||
'color'=>array
|
||||
(
|
||||
'wCore'=>'core',
|
||||
'wBwCore'=>'core',
|
||||
'cOperator'=>'operator',
|
||||
'cCalculation'=>'operator',
|
||||
'cComment'=>'comment',
|
||||
'cPartComment'=>'comment',
|
||||
'cString'=>'string',
|
||||
'iNumber'=>'number',
|
||||
'wExpand'=>'expand',
|
||||
'wGlobal'=>'glogal',
|
||||
'wCodePart'=>'code_part'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private function getWords($sKey)
|
||||
{
|
||||
return $this->asAbap['word'][$sKey];
|
||||
}
|
||||
|
||||
private function getColor($sKey)
|
||||
{
|
||||
return $this->asAbap['color'][$sKey];
|
||||
}
|
||||
|
||||
private function addColoring()
|
||||
{
|
||||
//Safe characters
|
||||
$sCode = $this->convText2Html($this->sCode);
|
||||
$sServName = $_GET['serv_name'];
|
||||
$sSafeRexExServName = preg_quote(str_replace('http://', '', $sServName), '/');
|
||||
|
||||
$asLines = explode("\n", $sCode);
|
||||
$asLineClasses = array();
|
||||
$iOffSet = 0;
|
||||
|
||||
//building lines
|
||||
foreach($asLines as $iLineNb=>$sLine)
|
||||
{
|
||||
/* Code ref:
|
||||
* <li id="#line_nb#" class="#li_class#">
|
||||
* <span class="expand_line">
|
||||
* <span id="#expand_id#" class="#expand_class#">-</span>
|
||||
* </span>
|
||||
* <span class="#code_class#">#line#</span>
|
||||
* </li>
|
||||
*/
|
||||
$sLiClass = $sExpandSign = $sCodeClass = $sExpandHtml = $sExpandButton = '';
|
||||
$sFirstWord = $this->getFirstWord($sLine);
|
||||
$sFirstChar = $this->getFirstChar($sLine);
|
||||
|
||||
//Apply current classes
|
||||
$sLiClass = implode(' ', $asLineClasses);
|
||||
|
||||
//Expanding starting/ending point
|
||||
if(in_array($sFirstWord, array_keys($this->getWords('wExpand')))) //start
|
||||
{
|
||||
$iLoopId = count($asLineClasses)+$iOffSet;
|
||||
$asLineClasses[] = 'loop'.$iLoopId;
|
||||
$sExpandButton = '<input type="button" id="expand_loop'.$iLoopId.'" class="minus" value="" />';
|
||||
}
|
||||
elseif(in_array($sFirstWord, $this->getWords('wExpand'))) //end
|
||||
{
|
||||
array_pop($asLineClasses);
|
||||
$iOffSet++;
|
||||
$sExpandButton = '<span></span>';
|
||||
}
|
||||
|
||||
//Enlarge line
|
||||
//if(mb_strpos($sLine, $sServName) !== false) $sLiClass .= ' bigline';
|
||||
|
||||
//comments (entire line)
|
||||
$sCodeClass = (in_array($sFirstChar, $this->getWords('cComment')))?'comment':'code';
|
||||
|
||||
//Internal & external Urls
|
||||
$sLine = Toolbox::findReplaceLinks($sLine);
|
||||
|
||||
$asColoredLines[] = '<li id="'.($iLineNb+1).'" class="round_right '.$sLiClass.'"><span class="expand_line">'.$sExpandButton.'</span><span class="'.$sCodeClass.'">'.$sLine.'</span></li>';
|
||||
}
|
||||
$sCode = implode('', $asColoredLines);
|
||||
|
||||
//Strings
|
||||
foreach($this->getWords('cString') as $sStringWord)
|
||||
{
|
||||
$sPattern = '/>([^<]*?)'.$sStringWord.'([^<]*?)'.$sStringWord.'/u';
|
||||
$sCode = preg_replace($sPattern, '>$1<span class="string">'.$sStringWord.'$2'.$sStringWord.'</span>', $sCode);
|
||||
}
|
||||
|
||||
//Part comment
|
||||
$sPattern = '/>([^<]*)\"\;([^<]*)\<\/span\>\<\/li\>/u';
|
||||
$sCode = preg_replace($sPattern, '>$1<span class="comment">"$2</span>', $sCode);
|
||||
|
||||
//Global / Main
|
||||
$sPattern = '/>\*\ \[('.implode('|', $this->getWords('wCodePart')).')\]/u';
|
||||
$sCode = preg_replace($sPattern, '><span class="code_part">> $1</span>', $sCode);
|
||||
|
||||
//Core Words
|
||||
foreach($this->getWords('wCore') as $sCoreWord)
|
||||
{
|
||||
$sCoreWord = mb_strtolower($sCoreWord);
|
||||
$sPattern = '/>(([^<]*)([^\w&<]{1})|.{0})('.$sCoreWord.')([\W])/u';
|
||||
$sCode = preg_replace($sPattern, '>$1<span class="core">$4</span>$5', $sCode);
|
||||
}
|
||||
//$sCoreWords = str_replace(' ', '\ ', implode('|', array_map('mb_strtolower', $this->getWords('wCore'))));
|
||||
//$sPattern = '/>(([^<]*)([^\w<]{1})|.{0})('.$sCoreWords.')(?=[\W])/U';
|
||||
//$sCode = preg_replace($sPattern, '>$1<span class="core">$4</span>', $sCode);
|
||||
|
||||
//Operators
|
||||
//TODO distinguer operator / calculation
|
||||
$asOperators = array_unique(array_merge($this->getWords('cOperator'), $this->getWords('cCalculation')));
|
||||
foreach($asOperators as $sOpWord)
|
||||
{
|
||||
$sPattern = '/>([^<]*)\\'.$sOpWord.'/u';
|
||||
$sCode = preg_replace($sPattern, '>$1<span class="operator">'.$sOpWord.'</span>', $sCode);
|
||||
}
|
||||
//$sPattern = '/>([^<]*)['.implode(array_map('mb_strtolower', ($this->getWords('cOperator')))).']/';
|
||||
//echo $sPattern;
|
||||
//$sCode = preg_replace($sPattern, '>$1<span class="operator">$2$3</span>', $sCode);
|
||||
|
||||
//Numbers
|
||||
$sPreChar = '\\'.implode('\\', $this->getWords('cCalculation')).'\s';
|
||||
$sPattern = '/>((([^<]*)['.$sPreChar.']{1})|.{0})([0-9]+)([\W])/u';
|
||||
$sCode = preg_replace($sPattern, '>$1<span class="number">$4</span>$5', $sCode);
|
||||
|
||||
return $sCode;
|
||||
}
|
||||
|
||||
private static function getFirstWord($sText)
|
||||
{
|
||||
return mb_strstr(str_replace('.', ' ', trim($sText)), ' ', true);
|
||||
}
|
||||
|
||||
private static function getFirstChar($sText)
|
||||
{
|
||||
return mb_substr(str_replace('.', ' ', trim($sText)), 0, 1);
|
||||
}
|
||||
|
||||
private function addColor(&$sText, $sWord, $sClassColor)
|
||||
{
|
||||
$sText = str_replace($sWord, '<span class="'.$sClassColor.'">'.$sWord.'</span>', $sText);
|
||||
}
|
||||
|
||||
private static function getColoredWord($sWord, $sClass)
|
||||
{
|
||||
return '<span class="'.$sClass.'">'.$sWord.'</span>';
|
||||
}
|
||||
|
||||
public static function convText2Html($sCode)
|
||||
{
|
||||
return htmlspecialchars(mb_strtolower($sCode), ENT_QUOTES);
|
||||
}
|
||||
|
||||
public function getColoredCode()
|
||||
{
|
||||
return $this->addColoring();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
Reference in New Issue
Block a user