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', '', ''), '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: *
  • * * - * * #line# *
  • */ $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 = ''; } elseif(in_array($sFirstWord, $this->getWords('wExpand'))) //end { array_pop($asLineClasses); $iOffSet++; $sExpandButton = ''; } //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[] = '
  • '.$sExpandButton.''.$sLine.'
  • '; } $sCode = implode('', $asColoredLines); //Strings foreach($this->getWords('cString') as $sStringWord) { $sPattern = '/>([^<]*?)'.$sStringWord.'([^<]*?)'.$sStringWord.'/u'; $sCode = preg_replace($sPattern, '>$1'.$sStringWord.'$2'.$sStringWord.'', $sCode); } //Part comment $sPattern = '/>([^<]*)\"\;([^<]*)\<\/span\>\<\/li\>/u'; $sCode = preg_replace($sPattern, '>$1"$2', $sCode); //Global / Main $sPattern = '/>\*\ \[('.implode('|', $this->getWords('wCodePart')).')\]/u'; $sCode = preg_replace($sPattern, '>> $1', $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$4$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$4', $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'.$sOpWord.'', $sCode); } //$sPattern = '/>([^<]*)['.implode(array_map('mb_strtolower', ($this->getWords('cOperator')))).']/'; //echo $sPattern; //$sCode = preg_replace($sPattern, '>$1$2$3', $sCode); //Numbers $sPreChar = '\\'.implode('\\', $this->getWords('cCalculation')).'\s'; $sPattern = '/>((([^<]*)['.$sPreChar.']{1})|.{0})([0-9]+)([\W])/u'; $sCode = preg_replace($sPattern, '>$1$4$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, ''.$sWord.'', $sText); } private static function getColoredWord($sWord, $sClass) { return ''.$sWord.''; } public static function convText2Html($sCode) { return htmlspecialchars(mb_strtolower($sCode), ENT_QUOTES); } public function getColoredCode() { return $this->addColoring(); } } ?>