mirror of
https://github.com/yuin/goldmark
synced 2025-03-04 23:04:52 +00:00
#248 - 2
This commit is contained in:
parent
2f8abf5949
commit
f5dcbd8208
3 changed files with 16 additions and 77 deletions
|
|
@ -488,3 +488,11 @@ _a[b_c_](d)
|
||||||
//- - - - - - - - -//
|
//- - - - - - - - -//
|
||||||
<p>_a<a href="d">b_c_</a></p>
|
<p>_a<a href="d">b_c_</a></p>
|
||||||
//= = = = = = = = = = = = = = = = = = = = = = = =//
|
//= = = = = = = = = = = = = = = = = = = = = = = =//
|
||||||
|
|
||||||
|
37: Tabs and spaces
|
||||||
|
OPTIONS: {"enableEscape": true}
|
||||||
|
//- - - - - - - - -//
|
||||||
|
\t\t x\n
|
||||||
|
//- - - - - - - - -//
|
||||||
|
<pre><code>\t x\n</code></pre>
|
||||||
|
//= = = = = = = = = = = = = = = = = = = = = = = =//
|
||||||
|
|
|
||||||
|
|
@ -87,8 +87,11 @@ func (b *fencedCodeBlockParser) Continue(node ast.Node, reader text.Reader, pc C
|
||||||
return Close
|
return Close
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pos, padding := util.DedentPositionPadding(line, reader.LineOffset(), segment.Padding, fdata.indent)
|
pos, padding := util.IndentPositionPadding(line, reader.LineOffset(), segment.Padding, fdata.indent)
|
||||||
|
if pos < 0 {
|
||||||
|
pos = util.FirstNonSpacePosition(line)
|
||||||
|
padding = 0
|
||||||
|
}
|
||||||
seg := text.NewSegmentPadding(segment.Start+pos, segment.Stop, padding)
|
seg := text.NewSegmentPadding(segment.Start+pos, segment.Stop, padding)
|
||||||
// if code block line starts with a tab, keep a tab as it is.
|
// if code block line starts with a tab, keep a tab as it is.
|
||||||
if padding != 0 {
|
if padding != 0 {
|
||||||
|
|
|
||||||
78
util/util.go
78
util/util.go
|
|
@ -151,30 +151,7 @@ func TabWidth(currentPos int) int {
|
||||||
// width=2 is in the tab character. In this case, IndentPosition returns
|
// width=2 is in the tab character. In this case, IndentPosition returns
|
||||||
// (pos=1, padding=2)
|
// (pos=1, padding=2)
|
||||||
func IndentPosition(bs []byte, currentPos, width int) (pos, padding int) {
|
func IndentPosition(bs []byte, currentPos, width int) (pos, padding int) {
|
||||||
if width == 0 {
|
return IndentPositionPadding(bs, currentPos, 0, width)
|
||||||
return 0, 0
|
|
||||||
}
|
|
||||||
w := 0
|
|
||||||
l := len(bs)
|
|
||||||
i := 0
|
|
||||||
hasTab := false
|
|
||||||
for ; i < l; i++ {
|
|
||||||
if bs[i] == '\t' {
|
|
||||||
w += TabWidth(currentPos + w)
|
|
||||||
hasTab = true
|
|
||||||
} else if bs[i] == ' ' {
|
|
||||||
w++
|
|
||||||
} else {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if w >= width {
|
|
||||||
if !hasTab {
|
|
||||||
return width, 0
|
|
||||||
}
|
|
||||||
return i, w - width
|
|
||||||
}
|
|
||||||
return -1, -1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// IndentPositionPadding searches an indent position with the given width for the given line.
|
// IndentPositionPadding searches an indent position with the given width for the given line.
|
||||||
|
|
@ -188,9 +165,9 @@ func IndentPositionPadding(bs []byte, currentPos, paddingv, width int) (pos, pad
|
||||||
i := 0
|
i := 0
|
||||||
l := len(bs)
|
l := len(bs)
|
||||||
for ; i < l; i++ {
|
for ; i < l; i++ {
|
||||||
if bs[i] == '\t' {
|
if bs[i] == '\t' && w < width {
|
||||||
w += TabWidth(currentPos + w)
|
w += TabWidth(currentPos + w)
|
||||||
} else if bs[i] == ' ' {
|
} else if bs[i] == ' ' && w < width {
|
||||||
w++
|
w++
|
||||||
} else {
|
} else {
|
||||||
break
|
break
|
||||||
|
|
@ -202,55 +179,6 @@ func IndentPositionPadding(bs []byte, currentPos, paddingv, width int) (pos, pad
|
||||||
return -1, -1
|
return -1, -1
|
||||||
}
|
}
|
||||||
|
|
||||||
// DedentPosition dedents lines by the given width.
|
|
||||||
func DedentPosition(bs []byte, currentPos, width int) (pos, padding int) {
|
|
||||||
if width == 0 {
|
|
||||||
return 0, 0
|
|
||||||
}
|
|
||||||
w := 0
|
|
||||||
l := len(bs)
|
|
||||||
i := 0
|
|
||||||
for ; i < l; i++ {
|
|
||||||
if bs[i] == '\t' {
|
|
||||||
w += TabWidth(currentPos + w)
|
|
||||||
} else if bs[i] == ' ' {
|
|
||||||
w++
|
|
||||||
} else {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if w >= width {
|
|
||||||
return i, w - width
|
|
||||||
}
|
|
||||||
return i, 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// DedentPositionPadding dedents lines by the given width.
|
|
||||||
// This function is mostly same as DedentPosition except this function
|
|
||||||
// takes account into additional paddings.
|
|
||||||
func DedentPositionPadding(bs []byte, currentPos, paddingv, width int) (pos, padding int) {
|
|
||||||
if width == 0 {
|
|
||||||
return 0, paddingv
|
|
||||||
}
|
|
||||||
|
|
||||||
w := 0
|
|
||||||
i := 0
|
|
||||||
l := len(bs)
|
|
||||||
for ; i < l; i++ {
|
|
||||||
if bs[i] == '\t' {
|
|
||||||
w += TabWidth(currentPos + w)
|
|
||||||
} else if bs[i] == ' ' {
|
|
||||||
w++
|
|
||||||
} else {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if w >= width {
|
|
||||||
return i - paddingv, w - width
|
|
||||||
}
|
|
||||||
return i - paddingv, 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// IndentWidth calculate an indent width for the given line.
|
// IndentWidth calculate an indent width for the given line.
|
||||||
func IndentWidth(bs []byte, currentPos int) (width, pos int) {
|
func IndentWidth(bs []byte, currentPos int) (width, pos int) {
|
||||||
l := len(bs)
|
l := len(bs)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue