1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 13:28:11 +00:00
serenity/Userland/Libraries/LibMarkdown/LineIterator.h
Peter Elliott 10f6f6a723 LibMarkdown: Add LineIterator
LineIterator wraps a vector's ConstIterator, to provide an iterator that
can work on indented container blocks (like lists and blockquotes).
2021-10-05 13:27:25 +03:30

75 lines
1.7 KiB
C++

/*
* Copyright (c) 2021, Peter Elliott <pelliott@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Iterator.h>
#include <AK/StringView.h>
#include <AK/Vector.h>
namespace Markdown {
template<typename T>
class FakePtr {
public:
FakePtr(T item)
: m_item(move(item))
{
}
T const* operator->() const { return &m_item; }
T* operator->() { return &m_item; }
private:
T m_item;
};
class LineIterator {
public:
LineIterator(Vector<StringView>::ConstIterator const& lines, size_t indent = 0)
: m_iterator(lines)
, m_indent(indent)
{
}
bool is_end() const;
StringView operator*() const;
LineIterator operator++()
{
reset_ignore_prefix();
++m_iterator;
return *this;
}
LineIterator operator++(int)
{
LineIterator tmp = *this;
reset_ignore_prefix();
++m_iterator;
return tmp;
}
LineIterator operator+(ptrdiff_t delta) const { return LineIterator { m_iterator + delta, m_indent }; }
LineIterator operator-(ptrdiff_t delta) const { return LineIterator { m_iterator - delta, m_indent }; }
ptrdiff_t operator-(LineIterator other) const { return m_iterator - other.m_iterator; }
FakePtr<StringView> operator->() const { return FakePtr<StringView>(operator*()); }
size_t indent() const { return m_indent; }
void set_indent(size_t indent) { m_indent = indent; }
void ignore_next_prefix() { m_ignore_prefix_mode = true; }
private:
void reset_ignore_prefix() { m_ignore_prefix_mode = false; }
bool is_indented(StringView const& line) const;
Vector<StringView>::ConstIterator m_iterator;
size_t m_indent;
bool m_ignore_prefix_mode { false };
};
}