getLines(); $raw = []; $escaped = []; // Code $code = $body->getCode(); if (count($code) % 2 == 0) // make sure tags has pairs { $i = 1; foreach ($code as $index => $capture) { // Replace code tags if ($i % 2 == 0) { $lines[$index] = ''; // Skip code format inside the tags by raw registry foreach (array_slice($lines, $offset, $index - $offset) as $start => $line) { $raw[$start + $offset] = $line; } } else { if ($capture) { $lines[$index] = sprintf( '%s', self::escape( $capture ) ); } else { $lines[$index] = ''; } $offset = $index + 1; } $escaped[] = $index; $i++; } } // H1 foreach ($body->getH1() as $index => $value) { if (!isset($raw[$index])) { $lines[$index] = sprintf( '%s', self::escape( $value ) ); $escaped[] = $index; } } // H2 foreach ($body->getH2() as $index => $value) { if (!isset($raw[$index])) { $lines[$index] = sprintf( '%s', self::escape( $value ) ); $escaped[] = $index; } } // H3 foreach ($body->getH3() as $index => $value) { if (!isset($raw[$index])) { $lines[$index] = sprintf( '%s', self::escape( $value ) ); $escaped[] = $index; } } // Quote foreach ($body->getQuote() as $index => $value) { if (!isset($raw[$index])) { $lines[$index] = sprintf( '%s', self::escape( $value ) ); $escaped[] = $index; } } // Links foreach ($body->getLinks() as $index => $line) { if (!isset($raw[$index])) { $link = new \Yggverse\Gemini\Gemtext\Link( $line ); if (!$address = $link->getAddress()) { continue; } if (!$alt = $link->getAlt()) { if (!$alt = $link->getDate()) { $alt = $address; } } if ($alt == $address) { $lines[$index] = sprintf( '%s', $address, self::escape( $alt ) ); } else { $lines[$index] = sprintf( '%s', $address, self::escape( urldecode( $address ) ), self::escape( $alt ) ); } $escaped[] = $index; } } // Escape special chars for non escaped lines foreach ($body->getLines() as $index => $value) { if (!in_array($index, $escaped)) { $lines[$index] = self::escape( $value ); } } return implode( PHP_EOL, $lines ); } public static function escape( string $value ): string { return htmlspecialchars( $value ); } }