/// <summary> /// Attempts to parse a list item marker (bullet or enumerated). /// On success, returns length of the marker, and populates /// data with the details. On failure, returns 0. /// </summary> /// <remarks>Original: int parse_list_marker(string ln, int pos, ref ListData dataptr)</remarks> private static int ParseListMarker(string ln, int pos, out ListData data) { char c; int startpos; data = null; var len = ln.Length; startpos = pos; c = ln[pos]; if (c == '+' || c == '•' || ((c == '*' || c == '-') && 0 == Scanner.scan_hrule(ln, pos, len))) { pos++; if (pos == len || (ln[pos] != ' ' && ln[pos] != '\n')) return 0; data = new ListData(); data.BulletChar = c; data.Start = 1; } else if (c >= '0' && c <= '9') { int start = c - '0'; while (pos < len - 1) { c = ln[++pos]; if (c >= '0' && c <= '9') start = start * 10 + (c - '0'); else break; } if (pos >= len - 1 || (c != '.' && c != ')')) return 0; pos++; if (pos == len || (ln[pos] != ' ' && ln[pos] != '\n')) return 0; data = new ListData(); data.ListType = ListType.Ordered; data.BulletChar = '\0'; data.Start = start; data.Delimiter = (c == '.' ? ListDelimiter.Period : ListDelimiter.Parenthesis); } else { return 0; } return (pos - startpos); }
private static bool ListsMatch(ListData listData, ListData itemData) { return (listData.ListType == itemData.ListType && listData.Delimiter == itemData.Delimiter && // list_data.marker_offset == item_data.marker_offset && listData.BulletChar == itemData.BulletChar); }
/// <summary> /// Attempts to parse a list item marker (bullet or enumerated). /// On success, returns length of the marker, and populates /// data with the details. On failure, returns 0. /// </summary> /// <remarks>Original: int parse_list_marker(string ln, int pos, ref ListData dataptr)</remarks> private static int ParseListMarker(string ln, int pos, out ListData data) { char c; int startpos; data = null; var len = ln.Length; startpos = pos; c = ln[pos]; if (c == '+' || c == '•' || ((c == '*' || c == '-') && 0 == Scanner.scan_thematic_break(ln, pos, len))) { pos++; if (pos == len || (ln[pos] != ' ' && ln[pos] != '\n')) return 0; data = new ListData(); data.BulletChar = c; data.Start = 1; } else if (c >= '0' && c <= '9') { int start = c - '0'; while (pos < len - 1) { c = ln[++pos]; // We limit to 9 digits to avoid overflow, This also seems to be the limit for 'start' in some browsers. if (c >= '0' && c <= '9' && start < 100000000) start = start * 10 + (c - '0'); else break; } if (pos >= len - 1 || (c != '.' && c != ')')) return 0; pos++; if (pos == len || (ln[pos] != ' ' && ln[pos] != '\n')) return 0; data = new ListData(); data.ListType = ListType.Ordered; data.BulletChar = '\0'; data.Start = start; data.Delimiter = (c == '.' ? ListDelimiter.Period : ListDelimiter.Parenthesis); } else { return 0; } return (pos - startpos); }