teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

typo修正

2016/06/11 21:44

投稿

think49
think49

スコア18194

answer CHANGED
@@ -146,6 +146,6 @@
146
146
 
147
147
  ### 更新履歴
148
148
 
149
- - 2016/06/12 06:36 連続するp要素の2つ目以降のp要素の before-n が期待通りに動作しなかった不具合を修正。before-n における ` ` の合計算出時に要素を乗り越えて記録していた不具合を修正(実質的にはホワイトスペースノードd値がクリアされていたので表面化されていませんでした)。
149
+ - 2016/06/12 06:36 連続するp要素の2つ目以降のp要素の before-n が期待通りに動作しなかった不具合を修正。before-n における ` ` の合計算出時に要素を乗り越えて記録していた不具合を修正(今までのサンプルではホワイトスペースノードで数値がクリアされていたので表面化されていませんでした)。
150
150
 
151
151
  Re: flat さん

1

before-n ののバグ修正

2016/06/11 21:44

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,6 +1,8 @@
1
+ ### String.prototype.replace
2
+
1
3
  `String.prototype.replace` の第二引数に関数を指定して分岐処理すれば良いと思います。
2
4
 
3
- - [HTMLタグを解析して書き換える - JSFiddle](https://jsfiddle.net/n1tb3pky/)
5
+ - [HTMLタグを解析して書き換える - JSFiddle](https://jsfiddle.net/n1tb3pky/1/)
4
6
 
5
7
  ```JavaScript
6
8
  <script>
@@ -38,7 +40,7 @@
38
40
  function replaceSample (string) {
39
41
  var before;
40
42
 
41
- return string.replace(/(<p(?: [^>]*)?>)([^<>]*<\x2Fp>)([^<>]*)|<[^>]*>|([^<>]+)/g, function (match, p1, p2, p3, p4) {
43
+ return string.replace(/(<p(?: [^>]*)?>)([^<>]*<\x2Fp>)([^<>]*)|(<[^>]*>)|([^<>]+)/g, function (match, p1, p2, p3, p4, p5) {
42
44
  if (p1) {
43
45
  var tokens = [p1], after, length;
44
46
 
@@ -50,13 +52,18 @@
50
52
 
51
53
  if (after) {
52
54
  tokens.push('after-' + after.length);
55
+ before = after.length;
53
56
  }
54
57
 
55
58
  return addClassByStartTag.apply(null, tokens) + p2 + p3;
56
59
  }
57
60
 
58
61
  if (p4) {
62
+ before = 0;
63
+ }
64
+
65
+ if (p5) {
59
- before = p4.match(/&nbsp;/g);
66
+ before = p5.match(/&nbsp;/g);
60
67
  before = before ? before.length : 0;
61
68
  }
62
69
 
@@ -67,8 +74,8 @@
67
74
  function handleSubmit (event) {
68
75
  var elements = event.target.elements;
69
76
 
77
+ event.preventDefault();
70
78
  elements['output'].value = replaceSample(elements['input'].value);
71
- event.preventDefault();
72
79
  }
73
80
  </script>
74
81
 
@@ -98,7 +105,7 @@
98
105
  &amp;nbsp;
99
106
  &amp;nbsp;
100
107
  &amp;nbsp;
101
- &lt;p&gt;段落&lt;/p&amp;nbsp;&gt;
108
+ &lt;p&gt;段落&lt;/p&gt;
102
109
  &amp;nbsp;
103
110
  &lt;/div&gt;
104
111
 
@@ -121,8 +128,13 @@
121
128
  &amp;nbsp;
122
129
  &amp;nbsp;
123
130
  &amp;nbsp;
131
+ &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;!-- テキストノードを挟まない場合 --&gt;&lt;p&gt;段落&lt;/p&gt;
132
+ &amp;nbsp;
133
+ &lt;p&gt;段落&lt;/p&gt;
134
+ &amp;nbsp;
135
+ &amp;nbsp;
136
+ &amp;nbsp;
124
137
  &lt;/div&gt;
125
- &lt;/div&gt;
126
138
  </textarea>
127
139
  </p>
128
140
  <p><input type="submit" value="変換"></p>
@@ -132,4 +144,8 @@
132
144
  </Form>
133
145
  ```
134
146
 
147
+ ### 更新履歴
148
+
149
+ - 2016/06/12 06:36 連続するp要素の2つ目以降のp要素の before-n が期待通りに動作しなかった不具合を修正。before-n における `&nbsp;` の合計算出時に要素を乗り越えて記録していた不具合を修正(実質的にはホワイトスペースノードd値がクリアされていたので表面化されていませんでした)。
150
+
135
151
  Re: flat さん