mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 20:47:45 +00:00
LibMarkdown: Add LineIterator
LineIterator wraps a vector's ConstIterator, to provide an iterator that can work on indented container blocks (like lists and blockquotes).
This commit is contained in:
parent
cd560d3ae3
commit
10f6f6a723
16 changed files with 139 additions and 21 deletions
75
Userland/Libraries/LibMarkdown/LineIterator.h
Normal file
75
Userland/Libraries/LibMarkdown/LineIterator.h
Normal file
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* 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 };
|
||||
};
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue