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(); }
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; }