QByteArray MumeXmlParser::characters(QByteArray &ch) { QByteArray toUser; if (ch.isEmpty()) { return toUser; } // replace > and < chars stripXmlEntities(ch); const auto &config = getConfig(); m_stringBuffer = QString::fromLatin1(ch); if (m_readSnoopTag && m_stringBuffer.length() > 3 && m_stringBuffer.at(0) == '&' && m_stringBuffer.at(2) == ' ') { // Remove snoop prefix (i.e. "&J Exits: north.") m_stringBuffer = m_stringBuffer.mid(3); } switch (m_xmlMode) { case XmlMode::NONE: // non room info m_stringBuffer = normalizeStringCopy(m_stringBuffer.trimmed()); if (m_stringBuffer.isEmpty()) { // standard end of description parsed if (m_readingRoomDesc) { m_readingRoomDesc = false; // we finished read desc mode m_descriptionReady = true; if (config.mumeNative.emulatedExits) { emulateExits(); } } } else { parseMudCommands(m_stringBuffer); } if (m_readSnoopTag) { if (m_descriptionReady) { m_promptFlags.reset(); // Don't trust god prompts queue.enqueue(m_move); emit showPath(queue, true); move(); m_readSnoopTag = false; } } toUser.append(ch); break; case XmlMode::ROOM: // dynamic line m_dynamicRoomDesc += normalizeStringCopy(m_stringBuffer.simplified().append("\n")); toUser.append(ch); break; case XmlMode::NAME: if (m_descriptionReady) { move(); } m_readingRoomDesc = true; // start of read desc mode m_roomName = normalizeStringCopy(m_stringBuffer); toUser.append(ch); break; case XmlMode::DESCRIPTION: // static line m_staticRoomDesc += normalizeStringCopy(m_stringBuffer.simplified().append("\n")); if (!m_gratuitous) { toUser.append(ch); } break; case XmlMode::EXITS: m_exits += m_stringBuffer; if (m_readingRoomDesc) { m_readingRoomDesc = false; m_descriptionReady = true; } break; case XmlMode::PROMPT: emit sendPromptLineEvent(normalizeStringCopy(m_stringBuffer).toLatin1()); if (m_readingRoomDesc) { // fixes compact mode m_readingRoomDesc = false; // we finished read desc mode m_descriptionReady = true; if (config.mumeNative.emulatedExits) { emulateExits(); } } if (m_descriptionReady) { parsePrompt(normalizeStringCopy(m_stringBuffer)); move(); } toUser.append(ch); break; case XmlMode::TERRAIN: default: toUser.append(ch); break; } if (!getConfig().parser.removeXmlTags) { toUser.replace(ampersand, ampersandTemplate); toUser.replace(greaterThanChar, greaterThanTemplate); toUser.replace(lessThanChar, lessThanTemplate); } return toUser; }
void Parser::parseNewMudInput(IncomingData& data /*TelnetIncomingDataQueue& que*/) { bool staticLine = false; bool dontSendToUser = false; /*IncomingData data; bool staticLine; while ( !que.isEmpty() ) { data = que.dequeue(); */ //dline = (quint8 *)data.line.data(); switch (data.type) { case TDT_DELAY: case TDT_MENU_PROMPT: case TDT_LOGIN: case TDT_LOGIN_PASSWORD: case TDT_TELNET: case TDT_SPLIT: case TDT_UNKNOWN: #ifdef PARSER_STREAM_DEBUG_INPUT_TO_FILE (*debugStream) << "***STYPE***"; (*debugStream) << "Other"; (*debugStream) << "***ETYPE***"; #endif emit sendToUser(data.line); break; case TDT_PROMPT: #ifdef PARSER_STREAM_DEBUG_INPUT_TO_FILE (*debugStream) << "***STYPE***"; (*debugStream) << "Prompt"; (*debugStream) << "***ETYPE***"; #endif m_stringBuffer = QString::fromAscii(data.line.constData(), data.line.size()); m_stringBuffer = m_stringBuffer.simplified(); latinToAscii(m_stringBuffer); if (m_readingRoomDesc) { m_readingRoomDesc = false; // we finished read desc mode m_descriptionReady = true; if (m_examine) m_examine = false; // stop showing bypassing brief-mode } if (m_descriptionReady) { m_descriptionReady = false; parsePrompt(m_stringBuffer); if (!queue.isEmpty()) { CommandIdType c = queue.dequeue(); if ( c != CID_SCOUT ){ //qDebug("%s",m_roomName.toAscii().data()); //qDebug("%s",m_dynamicRoomDesc.toAscii().data()); emit showPath(queue, false); characterMoved(c, m_roomName, m_dynamicRoomDesc, m_staticRoomDesc, m_exitsFlags, m_promptFlags); } //additional scout move needs to be removed when scout was successful else queue.dequeue(); } else { //qDebug("%s",m_roomName.toAscii().data()); //qDebug("%s",m_dynamicRoomDesc.toAscii().data()); emit showPath(queue, false); characterMoved(CID_NONE, m_roomName, m_dynamicRoomDesc, m_staticRoomDesc, m_exitsFlags, m_promptFlags); } } emit sendToUser(data.line); break; case TDT_CRLF: #ifdef PARSER_STREAM_DEBUG_INPUT_TO_FILE (*debugStream) << "***STYPE***"; (*debugStream) << "CRLF"; (*debugStream) << "***ETYPE***"; #endif if (data.line.contains("null)>")) break; m_stringBuffer = QString::fromAscii(data.line.constData(), data.line.size()); m_stringBuffer = m_stringBuffer.simplified(); latinToAscii(m_stringBuffer); if (m_readingRoomDesc) { if (isEndOfRoomDescription(m_stringBuffer)) // standard end of description parsed { m_readingRoomDesc = false; // we finished read desc mode m_descriptionReady = true; dontSendToUser = true; } else if (m_stringBuffer.isEmpty()) // standard end of description parsed { m_readingRoomDesc = false; // we finished read desc mode m_descriptionReady = true; if (Config().m_emulatedExits) emulateExits(); } else // reading room description line { switch(Config().m_roomDescriptionsParserType) { case Configuration::RDPT_COLOR: if ((m_readingStaticDescLines == true) && isStaticRoomDescriptionLine(m_stringBuffer)) { staticLine = true; m_staticRoomDesc += m_stringBuffer+"\n"; } else { m_readingStaticDescLines = false; m_dynamicRoomDesc += m_stringBuffer+"\n"; } m_roomDescLines++; break; case Configuration::RDPT_PARSER: if ((m_roomDescLines >= Config().m_minimumStaticLines) && ((m_readingStaticDescLines == false) || Patterns::matchDynamicDescriptionPatterns(m_stringBuffer))) { m_readingStaticDescLines = false; m_dynamicRoomDesc += m_stringBuffer+"\n"; } else { staticLine = true; m_staticRoomDesc += m_stringBuffer+"\n"; } m_roomDescLines++; break; case Configuration::RDPT_LINEBREAK: m_dynamicRoomDesc += m_stringBuffer+"\n"; m_roomDescLines++; break; } } } else if (!m_readingRoomDesc && m_descriptionReady) //read betwen Exits and Prompt (track for example) { if ( isRoomName(m_stringBuffer) ) //Room name arrived { if (m_descriptionReady) { m_descriptionReady = false; if (!queue.isEmpty()) { CommandIdType c = queue.dequeue(); if ( c != CID_SCOUT ){ emit showPath(queue, false); characterMoved(c, m_roomName, m_dynamicRoomDesc, m_staticRoomDesc, m_exitsFlags, m_promptFlags); } //additional scout move needs to be removed when scout was successful else queue.dequeue(); } else { emit showPath(queue, false); characterMoved(CID_NONE, m_roomName, m_dynamicRoomDesc, m_staticRoomDesc, m_exitsFlags, m_promptFlags); } } m_readingRoomDesc = true; //start of read desc mode m_descriptionReady = false; m_roomName=m_stringBuffer; m_dynamicRoomDesc=nullString; m_staticRoomDesc=nullString; m_roomDescLines = 0; m_readingStaticDescLines = true; m_exitsFlags = 0; } else if (!m_stringBuffer.isEmpty()) parseMudCommands(m_stringBuffer); } else if ( isRoomName(m_stringBuffer) ) //Room name arrived { if (m_descriptionReady) { m_descriptionReady = false; if (!queue.isEmpty()) { CommandIdType c = queue.dequeue(); if ( c != CID_SCOUT ){ emit showPath(queue, false); characterMoved(c, m_roomName, m_dynamicRoomDesc, m_staticRoomDesc, m_exitsFlags, m_promptFlags); } //additional scout move needs to be removed when scout was successful else queue.dequeue(); } else { emit showPath(queue, false); characterMoved(CID_NONE, m_roomName, m_dynamicRoomDesc, m_staticRoomDesc, m_exitsFlags, m_promptFlags); } } m_readingRoomDesc = true; //start of read desc mode m_descriptionReady = false; m_roomName=m_stringBuffer; m_dynamicRoomDesc=nullString; m_staticRoomDesc=nullString; m_roomDescLines = 0; m_readingStaticDescLines = true; m_exitsFlags = 0; } else if (!m_stringBuffer.isEmpty() && Patterns::matchNoDescriptionPatterns(m_stringBuffer)) // non standard end of description parsed (fog, dark or so ...) { m_readingRoomDesc = false; // we finished read desc mode m_descriptionReady = true; m_roomName=nullString; m_dynamicRoomDesc=nullString; m_staticRoomDesc=nullString; m_roomDescLines = 0; m_readingStaticDescLines = false; m_exitsFlags = 0; m_promptFlags = 0; } else // parse standard input (answers) from server { //str=removeAnsiMarks(m_stringBuffer); if (!m_stringBuffer.isEmpty()) parseMudCommands(m_stringBuffer); } if (!dontSendToUser && !(staticLine && (m_examine || Config().m_brief))) emit sendToUser(data.line); break; case TDT_LFCR: #ifdef PARSER_STREAM_DEBUG_INPUT_TO_FILE (*debugStream) << "***STYPE***"; (*debugStream) << "LFCR"; (*debugStream) << "***ETYPE***"; #endif m_stringBuffer = QString::fromAscii(data.line.constData(), data.line.size()); m_stringBuffer = m_stringBuffer.simplified(); latinToAscii(m_stringBuffer); if (m_readingRoomDesc && (Config().m_roomDescriptionsParserType == Configuration::RDPT_LINEBREAK) ) { staticLine = true; m_staticRoomDesc += m_stringBuffer+"\n"; m_roomDescLines++; } if (!(staticLine && (m_examine || Config().m_brief))) emit sendToUser(data.line); break; case TDT_LF: #ifdef PARSER_STREAM_DEBUG_INPUT_TO_FILE (*debugStream) << "***STYPE***"; (*debugStream) << "LF"; (*debugStream) << "***ETYPE***"; #endif m_stringBuffer = QString::fromAscii(data.line.constData(), data.line.size()); emit sendToUser(data.line); break; } #ifdef PARSER_STREAM_DEBUG_INPUT_TO_FILE (*debugStream) << "***S***"; (*debugStream) << data.line; (*debugStream) << "***E***"; #endif //} }
void MMapperPluginParser::prompt(QString text) { parsePrompt(text); if (m_descriptionReady) submit(); }