Exemplo n.º 1
0
 function HTML2BBCodeForNodeInstance($_x164)
 {
     $_x177 = new RTEStringBuilder();
     for ($_x45 = $_x164; $_x45 != null; $_x45 = $_x45->NextNode) {
         if ($_x45->NodeType == "Text") {
             $_x177->Append(html_entity_decode($_x45->IsModified ? $_x45->NewCode : $_x45->RawCode));
             continue;
         }
         if ($_x45->NodeType != "Element") {
             continue;
         }
         if ($_x45->IsEndTag) {
             $_x177->Append($_x45->BBCodeEndTagCode);
             continue;
         }
         if ($_x45->IsClosed) {
             switch ($_x45->NameLower) {
                 case "br":
                 case "hr":
                     $_x177->Append("\r\n");
                     break;
                 case "img":
                     $_x153 = $_x45->GetAttribute("src");
                     if (RTEUtil::IsNullOrEmpty($_x153)) {
                         break;
                     }
                     $_x177->Append("[img]");
                     $_x177->Append($_x153);
                     $_x177->Append("[/img]");
                     break;
             }
             continue;
         }
         if ($_x45->EndTag == null) {
             continue;
         }
         switch ($_x45->NameLower) {
             case "font":
                 $_x202 = $_x45->GetAttribute("name");
                 if (!RTEUtil::IsNullOrEmpty($_x202)) {
                     $_x177->Append("[face=" . $_x202 . "]");
                     $_x45->EndTag->BBCodeEndTagCode = "[/face]" . $_x45->EndTag->BBCodeEndTagCode;
                 }
                 $_x57 = $_x45->GetAttribute("size");
                 if (!RTEUtil::IsNullOrEmpty($_x57)) {
                     $_x177->Append("[size=" . $_x57 . "]");
                     $_x45->EndTag->BBCodeEndTagCode = "[/size]" . $_x45->EndTag->BBCodeEndTagCode;
                 }
                 break;
             case "strike":
             case "s":
                 $_x177->Append("[s]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/s]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "u":
                 $_x177->Append("[u]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/u]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "em":
             case "i":
                 $_x177->Append("[i]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/i]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "strong":
             case "b":
                 $_x177->Append("[b]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/b]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "sup":
                 $_x177->Append("[sup]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/sup]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "sub":
                 $_x177->Append("[sub]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/sub]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "h1":
             case "h2":
             case "h3":
             case "h4":
             case "h5":
             case "h6":
                 $_x177->Append("[h=" . $_x45->NameLower . Substring(1) . "]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/h]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "pre":
                 $_x177->Append("[pre]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/pre]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "p":
             case "div":
             case "fieldset":
                 $_x177->Append("[p]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/p]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "legend":
                 $_x45->EndTag->BBCodeEndTagCode = "\r\n" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "blockquote":
                 $_x177->Append("[quote]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/quote]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "table":
             case "tr":
             case "td":
                 $_x177->Append("[" . $_x45->NameLower . "]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/" . $_x45->NameLower . "]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "th":
                 $_x177->Append("[td]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/td]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "a":
                 $_x203 = $_x45->GetAttribute("href");
                 if (RTEUtil::IsNullOrEmpty(href)) {
                     break;
                 }
                 $_x177->Append("[url=" . $_x203 . "]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/url]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "textarea":
                 $_x177->Append("[code]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/code]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "ul":
                 $_x177->Append("[list]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/list]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "ol":
                 $_x177->Append("[list=1]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/list]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
             case "li":
                 $_x177->Append("[*]");
                 break;
             case "center":
                 $_x177->Append("[align=center]");
                 $_x45->EndTag->BBCodeEndTagCode = "[/align]" . $_x45->EndTag->BBCodeEndTagCode;
                 break;
         }
         $_x204 = $_x45->GetAttribute("style");
         if (RTEUtil::IsNullOrEmpty($_x204)) {
             continue;
         }
         foreach (explode(";", $_x204) as $_x205) {
             $_x97 = rtefilter_strpos($_x205, ":");
             if ($_x97 == -1) {
                 continue;
             }
             $value = trim(substr($_x205, $_x97 + 1));
             if (strlen($value) == 0 || rtefilter_strpos($value, '[') != -1 || rtefilter_strpos($value, ']') != -1) {
                 continue;
             }
             $_x206 = strtolower(trim(substr($_x205, 0, $_x97)));
             switch ($_x206) {
                 case "vertical-align":
                     if (strtolower($value) == "sub") {
                         $_x177->Append("[sub]");
                         $_x45->EndTag->BBCodeEndTagCode = "[/sub]" . $_x45->EndTag->BBCodeEndTagCode;
                     }
                     if (strtolower($value) == "super") {
                         $_x177->Append("[sup]");
                         $_x45->EndTag->BBCodeEndTagCode = "[/sup]" . $_x45->EndTag->BBCodeEndTagCode;
                     }
                     break;
                 case "text-align":
                     $_x177->Append("[align=" . $value . "]");
                     $_x45->EndTag->BBCodeEndTagCode = "[/align]" . $_x45->EndTag->BBCodeEndTagCode;
                     break;
                 case "font-weight":
                     if (strtolower($value) == "bold") {
                         $_x177->Append("[b]");
                         $_x45->EndTag->BBCodeEndTagCode = "[/b]" . $_x45->EndTag->BBCodeEndTagCode;
                     }
                     break;
                 case "font-style":
                     if (strtolower($value) == "italic") {
                         $_x177->Append("[i]");
                         $_x45->EndTag->BBCodeEndTagCode = "[/i]" . $_x45->EndTag->BBCodeEndTagCode;
                     }
                     break;
                 case "text-decoration":
                     if (rtefilter_strpos(strtolower($value), "underline") != -1) {
                         $_x177->Append("[u]");
                         $_x45->EndTag->BBCodeEndTagCode = "[/u]" . $_x45->EndTag->BBCodeEndTagCode;
                     }
                     if (rtefilter_strpos(strtolower($value), "line-through") != -1) {
                         $_x177->Append("[s]");
                         $_x45->EndTag->BBCodeEndTagCode = "[/s]" . $_x45->EndTag->BBCodeEndTagCode;
                     }
                     break;
                 case "font-famliy":
                     $_x177->Append("[face=" . $value . "]");
                     $_x45->EndTag->BBCodeEndTagCode = "[/face]" . $_x45->EndTag->BBCodeEndTagCode;
                     break;
                 case "font-size":
                     $_x177->Append("[size=" . $value . "]");
                     $_x45->EndTag->BBCodeEndTagCode = "[/size]" . $_x45->EndTag->BBCodeEndTagCode;
                     break;
                 case "color":
                     $_x177->Append("[color=" . $value . "]");
                     $_x45->EndTag->BBCodeEndTagCode = "[/color]" . $_x45->EndTag->BBCodeEndTagCode;
                     break;
             }
         }
     }
     return $_x177->ToString();
 }
Exemplo n.º 2
0
 private function ConvertSANtoCoordinates($szMove, &$nStartTile, &$nEndTile, &$promotionType)
 {
     $nTmp;
     if (strlen($szMove) < 2) {
         return false;
     }
     //promotionType = PIECE_TYPE::UNDEFINED;
     // If there is a p in the text then remove it since we don't need to be told the move was en passant
     $nTmp = strpos($szMove, 'ep');
     if ($nTmp !== FALSE) {
         $szMove = substr($szMove, 0, $nTmp) . substr($szMove, $nTmp, strlen($szMove) - $nTmp - 2);
     }
     // Check if the move was check or checkmate and remove the last character
     if (STRING_UTILS::last_char($szMove) == "+") {
         //$szMove.Replace("+", "");
         $szMove = substr($szMove, 0, strlen($szMove) - 1);
     }
     $nTmp = strpos($szMove, '#');
     if ($nTmp !== FALSE) {
         // Extract the move made which caused the checkmate. Note that crafty sends 0-1 {black mates} after the #.
         //$szMove = $szMove.Substring(0, $szMove.Length - 1);
         $szMove = substr($szMove, 0, $nTmp);
     }
     // Determine the type of the move (castle-, check+, mate#, promotion=)
     if ($szMove == "O-O") {
         if ($this->PlayerTurn == 0) {
             $nStartTile = 4;
             $nEndTile = 6;
         } else {
             $nStartTile = 60;
             $nEndTile = 62;
         }
         return true;
     } else {
         if ($szMove == "O-O-O") {
             if ($this->PlayerTurn == 0) {
                 $nStartTile = 4;
                 $nEndTile = 2;
             } else {
                 $nStartTile = 60;
                 $nEndTile = 58;
             }
             return true;
         } else {
             if (strpos($szMove, '=') !== FALSE) {
                 // Get type to promote to
                 if (STRING_UTILS::last_char($szMove) == "N") {
                     $promotionType = PIECE_TYPE::KNIGHT;
                 } else {
                     if (STRING_UTILS::last_char($szMove) == "B") {
                         $promotionType = PIECE_TYPE::BISHOP;
                     } else {
                         if (STRING_UTILS::last_char($szMove) == "R") {
                             $promotionType = PIECE_TYPE::ROOK;
                         } else {
                             if (STRING_UTILS::last_char($szMove) == "Q") {
                                 $promotionType = PIECE_TYPE::QUEEN;
                             }
                         }
                     }
                 }
                 // Get tiles
                 $szMove = substr($szMove, 0, strlen($szMove) - 2);
                 // Check if there is an x to indicate a piece was taken.
                 if ($szMove . Contains("x")) {
                     $nEndTile = $this->ChessUtils->ConvertAlgebraicNotationTileToInteger($szMove . Substring(2));
                     if ($this->PlayerTurn == 0) {
                         $nStartTile = $this->ChessUtils->ConvertAlgebraicNotationTileToInteger($szMove . Substring(0, 1) + "7");
                     } else {
                         $nStartTile = $this->ChessUtils->ConvertAlgebraicNotationTileToInteger($szMove . Substring(0, 1) + "2");
                     }
                 } else {
                     $nEndTile = $this->ChessUtils->ConvertAlgebraicNotationTileToInteger($szMove);
                     if ($this->PlayerTurn == 0) {
                         $nStartTile = $nEndTile - 8;
                     } else {
                         $nStartTile = $nEndTile + 8;
                     }
                 }
                 if ($nStartTile == -1 || $nEndTile == -1) {
                     return false;
                 }
                 return true;
             } else {
                 if ($szMove[strlen($szMove) - 1] == 'Q' || $szMove[strlen($szMove) - 1] == 'B' || $szMove[strlen($szMove) - 1] == 'N' || $szMove[strlen($szMove) - 1] == 'R') {
                     // Get type to promote to
                     if ($szMove[strlen($szMove) - 1] == 'N') {
                         $promotionType = PIECE_TYPE::KNIGHT;
                     } else {
                         if ($szMove[strlen($szMove) - 1] == 'B') {
                             $promotionType = PIECE_TYPE::BISHOP;
                         } else {
                             if ($szMove[strlen($szMove) - 1] == 'R') {
                                 $promotionType = PIECE_TYPE::ROOK;
                             } else {
                                 if ($szMove[strlen($szMove) - 1] == 'Q') {
                                     $promotionType = PIECE_TYPE::QUEEN;
                                 }
                             }
                         }
                     }
                     // Remove the last char and then continue on finding the start and end tiles for this move.
                     $szMove = substr($szMove, 0, strlen($szMove) - 1);
                     // Make sure the move is valid for further processing.
                     if (strlen($szMove) < 2) {
                         return false;
                     }
                 }
             }
         }
     }
     // Last two chars indicate the end tile. Remove them from the string.
     $nEndTile = $this->ChessUtils->ConvertAlgebraicNotationTileToInteger(substr(strlen($szMove) - 2));
     if ($nEndTile == -1) {
         return false;
     }
     $szMove = substr($szMove, 0, strlen($szMove) - 2);
     // Check if a piece was taken and remove the x character if so.
     if ($szMove[strlen($szMove) - 1] == 'x') {
         $szMove = substr($szMove, 0, strlen($szMove) - 1);
     }
     // Check the remaining length.
     if (strlen($szMove) == 0) {
         if ($this->PlayerTurn == 0) {
             //if (rgBoard[nEndTile / 8 - 1, nEndTile % 8] > 0) nStartTile = nEndTile - 8;
             //else nStartTile = nEndTile - 16;
             //return true;
             // If the end tile is not rank 4 that means a pawn couldn't have moved two tiles
             // up the rank.
             if ($nEndTile / 8 != 3) {
                 // Check for a single move forward.
                 if ($this->Board[$this->floor[$nEndTile] - 1][$nEndTile % 8] == PIECE_TYPE::PAWN) {
                     $nStartTile = $nEndTile - 8;
                 } else {
                     if ($this->nEnPassantSquare == nEndTile) {
                         // Check if there is a white pawn to the left/right one rank down from the end tile
                         if ($nEndTile % 8 == 0) {
                             if ($this->Board[$this->floor[$nEndTile] - 1][$nEndTile % 8 + 1] == PIECE_TYPE::PAWN) {
                                 $nStartTile = $nEndTile - 7;
                             } else {
                                 return false;
                             }
                         } else {
                             if ($nEndTile % 8 > 0 && $nEndTile % 8 < 7) {
                                 if ($this->Board[$this->floor[$nEndTile] - 1][$nEndTile % 8 - 1] == PIECE_TYPE::PAWN) {
                                     $nStartTile = $nEndTile - 9;
                                 } else {
                                     if ($this->Board[$this->floor[$nEndTile] - 1][$nEndTile % 8 + 1] == PIECE_TYPE::PAWN) {
                                         $nStartTile = $nEndTile - 7;
                                     } else {
                                         return false;
                                     }
                                 }
                             } else {
                                 if ($this->Board[$this->floor[$nEndTile] - 1][$nEndTile % 8 - 1] == PIECE_TYPE::PAWN) {
                                     $nStartTile = $nEndTile - 9;
                                 } else {
                                     return false;
                                 }
                             }
                         }
                     }
                 }
             } else {
                 // Check for a single move forward.
                 if ($this->Board[$this->floor[$nEndTile] - 1][$nEndTile % 8] == PIECE_TYPE::PAWN) {
                     $nStartTile = $nEndTile - 8;
                 } else {
                     if ($this->Board[$this->floor[$nEndTile] - 2][$nEndTile % 8] == PIECE_TYPE::PAWN) {
                         $nStartTile = $nEndTile - 16;
                     } else {
                         // Check if there is a black pawn to the left/right one rank up from the end tile
                         if ($nEndTile % 8 == 0) {
                             if ($this->Board[$this->floor[$nEndTile] + 1][$nEndTile % 8 + 1] == PIECE_TYPE::PAWN + 6) {
                                 $nStartTile = $nEndTile + 9;
                             } else {
                                 return false;
                             }
                         } else {
                             if ($nEndTile % 8 > 0 && $nEndTile % 8 < 7) {
                                 if ($this->Board[$this->floor[$nEndTile] + 1][$nEndTile % 8 - 1] == PIECE_TYPE::PAWN + 6) {
                                     $nStartTile = $nEndTile + 7;
                                 } else {
                                     if ($this->Board[$this->floor[$nEndTile] + 1][$nEndTile % 8 + 1] == PIECE_TYPE::PAWN + 6) {
                                         $nStartTile = $nEndTile + 9;
                                     } else {
                                         return false;
                                     }
                                 }
                             } else {
                                 if ($this->Board[$this->floor[$nEndTile] + 1][$nEndTile % 8 - 1] == PIECE_TYPE::PAWN + 6) {
                                     $nStartTile = $nEndTile + 7;
                                 } else {
                                     return false;
                                 }
                             }
                         }
                     }
                 }
             }
         } else {
             //if ($this->Board[nEndTile / 8 + 1, nEndTile % 8] > 0) nStartTile = nEndTile + 8;
             //else nStartTile = nEndTile + 16;
             //return true;
             // If the end tile is not rank 5 that means a pawn couldn't have moved two tiles
             // down the rank.
             if ($this->floor[$nEndTile] != 4) {
                 if ($this->Board[$this->floor[$nEndTile] + 1][$nEndTile % 8] == PIECE_TYPE::PAWN + 6) {
                     $nStartTile = $nEndTile + 8;
                 } else {
                     if ($this->nEnPassantSquare == $nEndTile) {
                         $nStartTile = -1;
                         return false;
                     }
                 }
             } else {
                 if ($this->Board[$this->floor[$nEndTile] + 1][$nEndTile % 8] == PIECE_TYPE::PAWN + 6) {
                     $nStartTile = $nEndTile + 8;
                 } else {
                     if ($this->Board[$this->floor[$nEndTile] + 2][$nEndTile % 8] == PIECE_TYPE::PAWN + 6) {
                         $nStartTile = $nEndTile + 16;
                     } else {
                         $nStartTile = -1;
                         return false;
                     }
                 }
             }
         }
         return true;
     }
     if (strlen($szMove) == 1) {
         if ($szMove == 'a' || $szMove == 'b' || $szMove == 'c' || $szMove == 'd' || $szMove == 'e' || $szMove == 'f' || $szMove == 'g' || $szMove == 'h') {
             if ($this->PlayerTurn == 0) {
                 $nTmp = $nEndTile / 8;
             } else {
                 $nTmp = $this->floor[$nEndTile] + 2;
             }
             $nStartTile = $this->ChessUtils->ConvertAlgebraicNotationTileToInteger(substr($szMove, 0, 1) . $nTmp);
         } else {
             if ($szMove == 'K') {
                 $nStartTile = $this->ObtainAttackingTileForPieceType(PIECE_TYPE::KING, $nEndTile);
             } else {
                 if ($szMove == 'Q') {
                     $nStartTile = $this->ObtainAttackingTileForPieceType(PIECE_TYPE::QUEEN, $nEndTile);
                 } else {
                     if ($szMove == 'R') {
                         $nStartTile = $this->ObtainAttackingTileForPieceType(PIECE_TYPE::ROOK, $nEndTile);
                     } else {
                         if ($szMove == 'B') {
                             $nStartTile = $this->ObtainAttackingTileForPieceType(PIECE_TYPE::BISHOP, $nEndTile);
                         } else {
                             if ($szMove == 'N') {
                                 $nStartTile = $this->ObtainAttackingTileForPieceType(PIECE_TYPE::KNIGHT, $nEndTile);
                             }
                         }
                     }
                 }
             }
         }
         if ($nStartTile == -1) {
             return false;
         }
         return true;
     }
     if (strlen($szMove) == 2) {
         // Find the piece type for the given file or rank
         if ($szMove[0] == 'K') {
             $nStartTile = $this->FindPieceLocatedInFileOrRank(PIECE_TYPE::KING, $szMove[1]);
         } else {
             if ($szMove[0] == 'Q') {
                 $nStartTile = $this->FindPieceLocatedInFileOrRank(PIECE_TYPE::QUEEN, $szMove[1]);
             } else {
                 if ($szMove[0] == 'R') {
                     $nStartTile = $this->FindPieceLocatedInFileOrRank(PIECE_TYPE::ROOK, $szMove[1]);
                 } else {
                     if ($szMove[0] == 'B') {
                         $nStartTile = $this->FindPieceLocatedInFileOrRank(PIECE_TYPE::BISHOP, $szMove[1]);
                     } else {
                         if ($szMove[0] == 'N') {
                             $nStartTile = $this->FindPieceLocatedInFileOrRank(PIECE_TYPE::KNIGHT, $szMove[1]);
                         } else {
                         }
                     }
                 }
             }
         }
         if ($nStartTile == -1) {
             return false;
         }
         return true;
     }
     if (strlen($szMove) == 3) {
         $nStartTile = $this->ChessUtils->ConvertAlgebraicNotationTileToInteger(substr($szMove, 1));
         if ($nStartTile == -1) {
             return false;
         }
         return true;
     }
     return false;
 }