Skip to content

Commit

Permalink
rough implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
PankajBhojwani committed Sep 21, 2020
1 parent 88d1527 commit 481c16e
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 3 deletions.
5 changes: 5 additions & 0 deletions src/buffer/out/OutputCellIterator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,11 @@ OutputCellIterator::operator bool() const noexcept
CATCH_FAIL_FAST();
}

std::wstring_view OutputCellIterator::returnRun()
{
return std::get<std::wstring_view>(_run);
}

// Routine Description:
// - Advances the iterator one position over the underlying data source.
// Return Value:
Expand Down
2 changes: 2 additions & 0 deletions src/buffer/out/OutputCellIterator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ class OutputCellIterator final

operator bool() const noexcept;

std::wstring_view returnRun();

ptrdiff_t GetCellDistance(OutputCellIterator other) const noexcept;
ptrdiff_t GetInputDistance(OutputCellIterator other) const noexcept;
friend ptrdiff_t operator-(OutputCellIterator one, OutputCellIterator two) = delete;
Expand Down
65 changes: 62 additions & 3 deletions src/buffer/out/textBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,14 +307,73 @@ bool TextBuffer::_PrepareForDoubleByteSequence(const DbcsAttribute dbcsAttribute
// - givenIt - Iterator representing output cell data to write
// Return Value:
// - The final position of the iterator
OutputCellIterator TextBuffer::Write(const OutputCellIterator givenIt)
OutputCellIterator TextBuffer::Write(OutputCellIterator givenIt)
{
const auto& cursor = GetCursor();
const auto target = cursor.GetPosition();

const auto finalIt = Write(givenIt, target);
// the regex object we will use to match URIs
std::regex uri(R"([a-z]+[:.].*?(?=\s))");

return finalIt;
// get the text from the iterator we are about to write
auto run = til::u16u8(givenIt.returnRun());

// search through the run with our regex object
auto words_begin = std::sregex_iterator(run.begin(), run.end(), uri);
auto words_end = std::sregex_iterator();
if (words_begin != words_end)
{
// we found some matches
std::wstring sufStr;

// get a mutable target coord
auto target2 = target;
for (auto i = words_begin; i != words_end; ++i)
{
// for each match, we write the prefix (which is everything between the last match and
// this match) with the current attributes, then set the hyperlink attribute to write the URI,
// then we set the attributes back

// get the URI and prefix strings
const auto uriStr = til::u8u16(i->str());
const auto preStr = til::u8u16(i->prefix().str());

// store the suffix string in case this is the last match we've found - once the loop
// is done we need to write the suffix of the last match
// we only write the suffix of the last match because the suffix of the nth match
// is simply the prefix of the (n+1)th match, which we write anyway
sufStr = til::u8u16(i->suffix().str());

// write the prefix string and update the target
OutputCellIterator preIter{ preStr, _currentAttributes };
Write(preIter, target2);
target2.X += (SHORT) preStr.size();

// update metadata for hyperlinks
const auto id = GetHyperlinkId(L"");
AddHyperlinkToMap(uriStr, id);
const auto oldId = _currentAttributes.GetHyperlinkId();
_currentAttributes.SetHyperlinkId(id);

// write the uri and update the target
OutputCellIterator uriIter{ uriStr, _currentAttributes };
Write(uriIter, target2);
target2.X += (SHORT) uriStr.size();

// set the attributes back
_currentAttributes.SetHyperlinkId(oldId);
}

// write the suffix string of the last match
const OutputCellIterator sufIter{ sufStr, _currentAttributes };
const auto finalIt = Write(sufIter, target2);
return finalIt;
}
else
{
const auto finalIt = Write(givenIt, target);
return finalIt;
}
}

// Routine Description:
Expand Down
2 changes: 2 additions & 0 deletions src/buffer/out/textBuffer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ filling in the last row, and updating the screen.

#include "../renderer/inc/IRenderTarget.hpp"

#include <regex>

class TextBuffer final
{
public:
Expand Down

1 comment on commit 481c16e

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

New misspellings found, please review:

  • sregex
To accept these changes, run the following commands
perl -e '
my @expect_files=qw('".github/actions/spell-check/expect/alphabet.txt
.github/actions/spell-check/expect/expect.txt
.github/actions/spell-check/expect/web.txt"');
@ARGV=@expect_files;
my @stale=qw('"Autogenerated debugbreak DECLL DECSMBV Inplace notypeopt restrictederrorinfo Scs Switchto Wlk "');
my $re=join "|", @stale;
my $suffix=".".time();
my $previous="";
sub maybe_unlink { unlink($_[0]) if $_[0]; }
while (<>) {
  if ($ARGV ne $old_argv) { maybe_unlink($previous); $previous="$ARGV$suffix"; rename($ARGV, $previous); open(ARGV_OUT, ">$ARGV"); select(ARGV_OUT); $old_argv = $ARGV; }
  next if /^($re)(?:$| .*)/; print;
}; maybe_unlink($previous);'
perl -e '
my $new_expect_file=".github/actions/spell-check/expect/481c16ea1ea1e413e6b3af8841983a375c86baad.txt";
open FILE, q{<}, $new_expect_file; chomp(my @words = <FILE>); close FILE;
my @add=qw('"autogenerated inplace sregex "');
my %items; @items{@words} = @words x (1); @items{@add} = @add x (1);
@words = sort {lc($a) cmp lc($b)} keys %items;
open FILE, q{>}, $new_expect_file; for my $word (@words) { print FILE "$word\n" if $word =~ /\w/; };
close FILE;'
git add .github/actions/spell-check/expect || echo '... you want to ensure .github/actions/spell-check/expect/481c16ea1ea1e413e6b3af8841983a375c86baad.txt is added to your repository...'
✏️ Contributor please read this

By default the command suggestion will generate a file named based on your commit. That's generally ok as long as you add the file to your commit. Someone can reorganize it later.

⚠️ The command is written for posix shells. You can copy the contents of each perl command excluding the outer ' marks and dropping any '"/"' quotation mark pairs into a file and then run perl file.pl from the root of the repository to run the code. Alternatively, you can manually insert the items...

If the listed items are:

  • ... misspelled, then please correct them instead of using the command.
  • ... names, please add them to .github/actions/spell-check/dictionary/names.txt.
  • ... APIs, you can add them to a file in .github/actions/spell-check/dictionary/.
  • ... just things you're using, please add them to an appropriate file in .github/actions/spell-check/expect/.
  • ... tokens you only need in one place and shouldn't generally be used, you can add an item in an appropriate file in .github/actions/spell-check/patterns/.

See the README.md in each directory for more information.

🔬 You can test your commits without appending to a PR by creating a new branch with that extra change and pushing it to your fork. The :check-spelling action will run in response to your push -- it doesn't require an open pull request. By using such a branch, you can limit the number of typos your peers see you make. 😉

⚠️ Reviewers

At present, the action that triggered this message will not show its ❌ in this PR unless the branch is within this repository.
Thus, you should make sure that this comment has been addressed before encouraging the merge bot to merge this PR.

Please sign in to comment.