Skip to content

Instantly share code, notes, and snippets.

@codedokode
Created June 6, 2018 16:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save codedokode/80913ab9d9279bf30878ff60c48515dc to your computer and use it in GitHub Desktop.
Save codedokode/80913ab9d9279bf30878ff60c48515dc to your computer and use it in GitHub Desktop.
Программа обнаружения повторяющихся фрагментов текста и результат ее применения к сломанным тредам
/tmp/threads/pr-thread-4-272705-m2ch-18-may-google.html
Total repeats: 185567 of 454322 bytes
- 0 - 41080 | \n<meta http-equiv="Content-Type" content ... ss="reply" id="27307
first 1 41081 - 85327 | 5"><div class="pst_bar"><span class="pos ... ://m2-ch.ru/pr/res/2
second 1 85328 - 129574 | 5"><div class="pst_bar"><span class="pos ... ://m2-ch.ru/pr/res/2
- 129575 - 129593 | 72705.html#273385">
first 2 129594 - 177012 | &gt;&gt;273385</a><br><br><span class="u ... ;А если надо сюда HT
- 177013 - 177034 | 72705.html#273385"&gt;
second 2 177035 - 224453 | &gt;&gt;273385</a><br><br><span class="u ... ;А если надо сюда HT
- 224454 - 224621 | ML-тегов с аттрибутами добавить? У тебя ... виджет сделан.</span
first 3 224622 - 270150 | ><br>Ну добавляешь, кто мешает? Компонен ... 59">&gt;&gt;275659</
- 270151 - 270163 | ml-тегов
second 3 270164 - 315692 | ><br>Ну добавляешь, кто мешает? Компонен ... 59">&gt;&gt;275659</
first 4 315693 - 364064 | a><br><br>Рад, что ты сам разобрался.<br ... ки несколько раз. <b
second 4 364065 - 412436 | a><br><br>Рад, что ты сам разобрался.<br ... ки несколько раз. <b
- 412437 - 454321 | r><br>Это не виджеты, это один большой н ... ru&client=opera -->\n
/tmp/test/pr-thread1.html
Total repeats: 1279393 of 2599187 bytes
- 0- 11281, 11282 | <!DOCTYPE html><html xmlns="http://www.w ... /" title="конец свет
first 1 11282- 13674, 2393 | а">ew</a> / <a href="http://2ch.hk/fa/" ... ика и оружие">wm</a>
- 13675- 13735, 61 | / <a href="http://2ch.hk/chat/" title="Двач чат">chat
first 2 13736- 15146, 1411 | </a>]</span>&nbsp;&nbsp; <span class="no ... 2ch.hk/wr/" title="▒
- 15147- 15189, 43 | ▒екстовые авторские рпг
first 3 15190- 17449, 2260 | ">wr</a>]</span>&nbsp;&nbsp; <span class ... k</a>]</span> </div>
- 17450- 38695, 21246 | </div> <div class="mobile" id="boardNavM ... turn false;" onmouse
first 4 38696- 76402, 37707 | out="javascript:removeAdminMenu(event); ... "><span class="name"
- 76403- 76403, 1 |
second 4 76404-114110, 37707 | out="javascript:removeAdminMenu(event); ... "><span class="name"
first 5 114111-149330, 35220 | >Аноним</span>&nbsp;&nbsp;<br><span clas ... ew(event)" onmouseou
second 5 149331-184550, 35220 | >Аноним</span>&nbsp;&nbsp;<br><span clas ... ew(event)" onmouseou
first 6 160479-165119, 4641 | <strong>SAGE</strong> <strong>SAGE</stro ... strong>SAGE</strong>
second 6 160985-165625, 4641 | <strong>SAGE</strong> <strong>SAGE</stro ... strong>SAGE</strong>
- 165626-167260, 1635 | </p></blockquote></td></tr></tbody></tab ... ss="postMessage"><p>
first 7 167261-175993, 8733 | <strong>SAGE</strong> <strong>SAGE</stro ... strong>SAGE</strong>
second 7 167767-176499, 8733 | <strong>SAGE</strong> <strong>SAGE</stro ... strong>SAGE</strong>
- 176500-184651, 8152 | </p></blockquote></td></tr></tbody></tab ... "highlight(236505)">
first 8 184652-223944, 39293 | &gt;&gt;236505</a><br>У всех баттхёрт не ... там только теория,
- 223945-224035, 91 | t="delPostPreview(event)" href="/pr/res/ ... ghlight(236505)"&gt;
second 8 224036-263328, 39293 | &gt;&gt;236505</a><br>У всех баттхёрт не ... там только теория,
first 9 263329-303269, 39941 | где все задание заключается в нажатии su ... eteGood и.т.д.<br>П▒
second 9 303269-343209, 39941 | где все задание заключается в нажатии su ... eteGood и.т.д.<br>П▒
- 343210-343339, 130 | ▒дскажите, пожалуйста, решение или выска ... еи по этому поводу</
first 10 343340-382617, 39278 | p></blockquote></td></tr></tbody></table ... >}<br>break_label:<b
- 382618-382756, 139 | одскажите&#44; пожалуйста&#44; решение и ... еи по этому поводу<
second 10 382757-422034, 39278 | p></blockquote></td></tr></tbody></table ... >}<br>break_label:<b
- 422035-422795, 761 | r>... продолжение программы<br><br>Объяс ... _237302" class="post
first 11 422796-460169, 37374 | "><tbody><tr><td class="reply" id="23730 ... an class="postertrip
- 460170-460924, 755 | r />... продолжение программы<br /><br / ... ble id=" post_237302
second 11 460925-498298, 37374 | "><tbody><tr><td class="reply" id="23730 ... an class="postertrip
first 12 498299-535887, 37589 | ">!xnn2uE3AU.</span>&nbsp;<span class="p ... tml#237603">№</a><a
second 12 535888-573476, 37589 | ">!xnn2uE3AU.</span>&nbsp;<span class="p ... tml#237603">№</a><a
- 573477-573573, 97 | href="javascript:insert('>>237603')" onc ... 3'); return false;">
first 13 573574-611136, 37563 | 237603</a><br><span class="postpanel"><a ... ыло бы любопытно пос
- 611137-611242, 106 | href="javascript:insert('&gt;&gt;237603' ... ; return false;"&gt;
second 13 611243-648805, 37563 | 237603</a><br><span class="postpanel"><a ... ыло бы любопытно пос
- 648806-649062, 257 | мотреть. Заодно проверить, так ли удобен ... _237821" class="post
first 14 649063-687398, 38336 | "><tbody><tr><td class="reply" id="23782 ... ;" onmouseout="javas
- 687399-687654, 256 | мотреть. Заодно проверить, так ли удобен ... id=" post_237821"="
second 14 687655-725990, 38336 | "><tbody><tr><td class="reply" id="23782 ... ;" onmouseout="javas
first 15 725991-763137, 37147 | cript:removeAdminMenu(event); return fal ... ipt:removeAdminMenu(
second 15 763138-800284, 37147 | cript:removeAdminMenu(event); return fal ... ipt:removeAdminMenu(
first 16 800285-836592, 36308 | event); return false;"></a></span>&nbsp; ... ick="javascript:addQ
second 16 836593-872900, 36308 | event); return false;"></a></span>&nbsp; ... ick="javascript:addQ
first 17 872901-910583, 37683 | uickReply('240883'); return false;"></a> ... javascript:insert('>
- 910584-910588, 5 | &amp;
second 17 910589-948271, 37683 | uickReply('240883'); return false;"></a> ... javascript:insert('>
- 948272-948272, 1 | >
first 18 948273-985370, 37098 | 241122')" onclick="javascript:addQuickRe ... pan class="postpanel
- 985371-985373, 3 | gt;
second 18 985374-1022471, 37098 | 241122')" onclick="javascript:addQuickRe ... pan class="postpanel
first 19 1022472-1059465, 36994 | "><a class="postbtn_rep" href="http://2c ... onclick="javascript:
second 19 1059466-1096459, 36994 | "><a class="postbtn_rep" href="http://2c ... onclick="javascript:
first 20 1096460-1135728, 39269 | addQuickReply('241974'); return false;"> ... 67214" class="postIn
second 20 1135729-1174997, 39269 | addQuickReply('241974'); return false;"> ... 67214" class="postIn
- 1174998-1175000, 3 | foM
first 21 1175001-1213593, 38593 | mobile"><span class="nameBlock"><span c ... 42218"></a><blockquo
- 1213594-1213596, 3 | fom
second 21 1213597-1252189, 38593 | mobile"><span class="nameBlock"><span c ... 42218"></a><blockquo
- 1252190-1252224, 35 | te id="m242218" class="postMessage"
first 22 1252225-1296010, 43786 | ><p><a onmouseover="showPostPreview(even ... trip">!xnn2uE3AU.</s
- 1296011-1296012, 2 | te
second 22 1296013-1339798, 43786 | ><p><a onmouseover="showPostPreview(even ... trip">!xnn2uE3AU.</s
- 1339799-1339825, 27 | pan>&nbsp;<br><span class="
first 23 1339826-1378510, 38685 | subject"></span></span><span data-utc="1 ... over="showPostPrevie
- 1378511-1378538, 28 | pan>&nbsp;<br><span class="
second 23 1378539-1417223, 38685 | subject"></span></span><span data-utc="1 ... over="showPostPrevie
- 1417224-1417287, 64 | w(event)" onmouseout="delPostPreview(eve ... href="http://2ch.hk
first 24 1417288-1454922, 37635 | /pr/res/236463.html#242501" onclick="hig ... "242690"></a><blockq
- 1454923-1454973, 51 | w(event)" onmouseout="delPostPreview(event)" href="
second 24 1454974-1492608, 37635 | /pr/res/236463.html#242501" onclick="hig ... "242690"></a><blockq
- 1492609-1492646, 38 | uote id="m242690" class="postMessage">
first 25 1492647-1530877, 38231 | <p><a onmouseover="showPostPreview(event ... r>Алсо, добавлю, что
- 1530878-1530919, 42 | uote id="m242690" class="postMessage"&gt;
second 25 1530920-1569150, 38231 | <p><a onmouseover="showPostPreview(event ... r>Алсо, добавлю, что
- 1569151-1569151, 1 | ,
first 26 1569152-1605852, 36701 | задание на мой взгляд простейшее. Если ... ая копия, оригинал п
- 1605853-1605854, 2 | 4;
second 26 1605855-1642555, 36701 | задание на мой взгляд простейшее. Если ... ая копия, оригинал п
- 1642556-1642571, 16 | о клику.</
first 27 1642572-1678852, 36281 | span></span><br class="turnmeoff"><span ... le id="post_243365"
- 1678853-1678868, 16 | о клику.<
second 27 1678869-1715149, 36281 | span></span><br class="turnmeoff"><span ... le id="post_243365"
- 1715150-1715162, 13 | class="post">
first 28 1715163-1755034, 39872 | <tbody><tr><td class="reply" id="243365" ... естно).<br>Реализова
- 1755035-1755051, 17 | class="post"&gt;
second 28 1755052-1794923, 39872 | <tbody><tr><td class="reply" id="243365" ... естно).<br>Реализова
- 1794924-1795034, 111 | л я это создав производный класс DBSelec ... pastebin.ru/oK89X5R7
first 29 1795035-1835262, 40228 | " rel="nofollow">http://pastebin.ru/oK89 ... ; return false;" onm
- 1835263-1835362, 100 | л="" я="" это="" создав="" производный=" ... select_note="" (<a="
second 29 1835363-1875590, 40228 | " rel="nofollow">http://pastebin.ru/oK89 ... ; return false;" onm
- 1875591-1875622, 32 | ouseout="javascript:removeAdminM
first 30 1875623-1912843, 37221 | enu(event); return false;"></a></span>&n ... "></a></span>&nbsp;<
- 1912844-1912875, 32 | ouseout="javascript:removeadminm
second 30 1912876-1950096, 37221 | enu(event); return false;"></a></span>&n ... "></a></span>&nbsp;<
- 1950097-1950097, 1 | /
first 31 1950098-1988390, 38293 | span></em></span></div><input type="chec ... v id="pim143367214"
second 31 1988391-2026683, 38293 | span></em></span></div><input type="chec ... v id="pim143367214"
- 2026684-2026707, 24 | class="postInfoM mobile"
first 32 2026708-2063923, 37216 | ><span class="nameBlock"><span class="na ... 3 13:45:04&nbsp;</sp
- 2063924-2063939, 16 | class="postinfom
second 32 2063940-2101155, 37216 | ><span class="nameBlock"><span class="na ... 3 13:45:04&nbsp;</sp
first 33 2101156-2140031, 38876 | an><span class="reflink"><a href="http:/ ... span>&nbsp;<span cla
second 33 2140031-2178906, 38876 | an><span class="reflink"><a href="http:/ ... span>&nbsp;<span cla
- 2178907-2178922, 16 | ss="postername">
first 34 2178923-2218972, 40050 | Аноним</span>&nbsp;&nbsp;<span class="po ... переменным никогда
- 2218973-2218992, 20 | ass="postername"&gt;
second 34 2218993-2259042, 40050 | Аноним</span>&nbsp;&nbsp;<span class="po ... переменным никогда
- 2259043-2259136, 94 | не давал.</p></blockquote></td></tr></tb ... _246408" class="post
first 35 2259137-2296044, 36908 | "><tbody><tr><td class="reply" id="24640 ... r><span class="postp
- 2296045-2296126, 82 | не давал.</p></blockquote></td></tr></tb ... ble id=" post_246408
second 35 2296127-2333034, 36908 | "><tbody><tr><td class="reply" id="24640 ... r><span class="postp
first 36 2333035-2373615, 40581 | anel"><a class="postbtn_rep" href="http: ... st_246601" class="po
second 36 2373616-2414196, 40581 | anel"><a class="postbtn_rep" href="http: ... st_246601" class="po
- 2414197-2414200, 4 | st">
first 37 2414201-2451156, 36956 | <tbody><tr><td class="reply" id="246601" ... о я лох. <br>textf я
- 2451157-2451163, 7 | st"&gt;
second 37 2451164-2488119, 36956 | <tbody><tr><td class="reply" id="246601" ... о я лох. <br>textf я
- 2488120-2488430, 311 | сделал fulltext индексом, но нихуя. FOR ... е полных совпадений,
first 38 2488431-2525472, 37042 | а мне нужно полное.<br>Как это все прав ... ss="turnmeoff"><a id
- 2525473-2525782, 310 | сделал fulltext индексом&#44; но нихуя. ... лных совпадений&#44;
second 38 2525783-2562824, 37042 | а мне нужно полное.<br>Как это все прав ... ss="turnmeoff"><a id
- 2562825-2590969, 28145 | ="247420"></a><blockquote id="m247420" c ... живание и самооборон
second 1 2590970-2593362, 2393 | а">ew</a> / <a href="http://2ch.hk/fa/" ... ика и оружие">wm</a>
second 2 2593359-2594769, 1411 | </a>]</span>&nbsp;&nbsp; <span class="no ... 2ch.hk/wr/" title="▒
- 2594770-2594783, 14 | ▒пг игры
second 3 2594784-2597043, 2260 | ">wr</a>]</span>&nbsp;&nbsp; <span class ... k</a>]</span> </div>
- 2597044-2599186, 2143 | <hr> <p class="footer"> &nbsp; - <a hr ... res/236463.html -->\n
/tmp/test/pr-thread-4b-280501.html
Total repeats: 1227965 of 2514267 bytes
- 0- 9930, 9931 | <!DOCTYPE html><html xmlns="http://www.w ... "rmenu" id="boardNav
first 1 9931- 16795, 6865 | "> <span class="nowrap">Тематика&nbsp;[< ... /a>]</span> </div> <
- 16796- 38638, 21843 | /div></div> <div class="mobile" id="boar ... "name">Аноним</span>
first 2 38639- 75935, 37297 | &nbsp;&nbsp;<br><span class="subject"></ ... p></blockquote></td>
- 75936- 75944, 9 | /span&gt;
second 2 75945-113241, 37297 | &nbsp;&nbsp;<br><span class="subject"></ ... p></blockquote></td>
first 3 113242-150836, 37595 | </tr></tbody></table><table id="post_280 ... name"></span>&nbsp;<
second 3 150836-188430, 37595 | </tr></tbody></table><table id="post_280 ... name"></span>&nbsp;<
first 4 188429-226987, 38559 | ;<span class="postertrip">!xnn2uE3AU.</s ... остепенно заменять и
second 4 226988-265546, 38559 | ;<span class="postertrip">!xnn2uE3AU.</s ... остепенно заменять и
- 265547-265582, 36 | х на нормальный код,
first 5 265583-303640, 38058 | начиная с самых важных разделов.<br><br ... ta-utc="1339778953"
- 303641-303680, 40 | х на нормальный код&#44;
second 5 303681-341738, 38058 | начиная с самых важных разделов.<br><br ... ta-utc="1339778953"
- 341739-341763, 25 | class="dateTime postNum">
first 6 341764-381354, 39591 | Срд 22 Май 2013 09:26:16<br><em><span cl ... 1.html#281106">№</a>
- 381355-381383, 29 | class="dateTime postNum"&gt;
second 6 381384-420974, 39591 | Срд 22 Май 2013 09:26:16<br><em><span cl ... 1.html#281106">№</a>
first 7 420975-459088, 38114 | <a href="javascript:insert('>>281106')" ... a id="281173"></a><b
second 7 459089-497202, 38114 | <a href="javascript:insert('>>281106')" ... a id="281173"></a><b
- 497203-497243, 41 | lockquote id="m281173" class="postMessage
first 8 497244-534326, 37083 | "><p><a onmouseover="showPostPreview(eve ... pan class="posternam
- 534327-534348, 22 | lockquote id=" m281173
second 8 534349-571431, 37083 | "><p><a onmouseover="showPostPreview(eve ... pan class="posternam
first 9 571432-610146, 38715 | e">Аноним</span>&nbsp;&nbsp;<span class= ... </a><blockquote id="
second 9 610147-648861, 38715 | e">Аноним</span>&nbsp;&nbsp;<span class= ... </a><blockquote id="
- 648862-648888, 27 | m281932" class="postMessage
first 10 648889-685093, 36205 | "><p><a onmouseover="showPostPreview(eve ... span class="posttime
- 685094-685100, 7 | m281932
second 10 685101-721305, 36205 | "><p><a onmouseover="showPostPreview(eve ... span class="posttime
first 11 721306-760132, 38827 | ">Втр 28 Май 2013 01:07:25&nbsp;</span>< ... </a><span class="pos
second 11 760133-798959, 38827 | ">Втр 28 Май 2013 01:07:25&nbsp;</span>< ... </a><span class="pos
first 12 798960-838018, 39059 | tpanel"><a class="postbtn_rep" href="htt ... Preview(event)" onmo
second 12 838019-877077, 39059 | tpanel"><a class="postbtn_rep" href="htt ... Preview(event)" onmo
- 877078-877183, 106 | useout="delPostPreview(event)" href="htt ... "highlight(283084)">
first 13 877184-916763, 39580 | &gt;&gt;283084</a><br><span class="unkfu ... </span>&nbsp;</span>
- 916764-916859, 96 | useout="delPostPreview(event)" href="/pr ... ghlight(283084)"&gt;
second 13 916860-956439, 39580 | &gt;&gt;283084</a><br><span class="unkfu ... </span>&nbsp;</span>
first 14 956440-995436, 38997 | </em></span></div><input type="checkbox" ... вуй, анон. Давай-ка
second 14 995437-1034433, 38997 | </em></span></div><input type="checkbox" ... вуй, анон. Давай-ка
first 15 1034434-1073082, 38649 | посмотрим, много ли ты ошибок наделал в ... low">http://archive-
second 15 1073083-1111731, 38649 | посмотрим, много ли ты ошибок наделал в ... low">http://archive-
- 1111732-1111755, 24 | ipq-co.narod.ru/,но</a
first 16 1111756-1150856, 39101 | > вот этот сайт не пашет <a href="http:/ ... nbsp;</span></em></s
- 1150857-1150871, 15 | ipq-co.narod.ru
second 16 1150872-1189972, 39101 | > вот этот сайт не пашет <a href="http:/ ... nbsp;</span></em></s
first 17 1189973-1226896, 36924 | pan></div><input type="checkbox" name="d ... ost"><tbody><tr><td
second 17 1226897-1263820, 36924 | pan></div><input type="checkbox" name="d ... ost"><tbody><tr><td
first 18 1263821-1301313, 37493 | class="reply" id="285792"><div id="pim14 ... <tbody><tr><td class
second 18 1301314-1338806, 37493 | class="reply" id="285792"><div id="pim14 ... <tbody><tr><td class
- 1338807-1338827, 21 | ="reply" id="285852">
first 19 1338828-1376594, 37767 | <div id="pim143367214" class="postInfoM ... ttime">Птн 07 Июн 20
- 1376595-1376618, 24 | ="reply" id="285852"&gt;
second 19 1376619-1414385, 37767 | <div id="pim143367214" class="postInfoM ... ttime">Птн 07 Июн 20
first 20 1414386-1452090, 37705 | 13 21:01:37&nbsp;</span><span class="ref ... ном месте. Про понят
second 20 1452091-1489795, 37705 | 13 21:01:37&nbsp;</span><span class="ref ... ном месте. Про понят
- 1489796-1489849, 54 | ливость запомню.<br><span class="unkfunc
first 21 1489850-1528719, 38870 | ">&gt;Надо ставить скобки так:</span><br ... cript:addAdminMenu(t
- 1528720-1528779, 60 | ливость запомню.<br /><span class=" unkfunc"="
second 21 1528780-1567649, 38870 | ">&gt;Надо ставить скобки так:</span><br ... cript:addAdminMenu(t
- 1567650-1567668, 19 | his); return false;
first 22 1567669-1605551, 37883 | " onmouseout="javascript:removeAdminMenu ... play:none" onclick="
- 1605552-1605577, 26 | his);" return="" false;"="
second 22 1605578-1643460, 37883 | " onmouseout="javascript:removeAdminMenu ... play:none" onclick="
- 1643461-1643480, 20 | javascript:addAdminM
first 23 1643481-1681182, 37702 | enu(this); return false;" onmouseout="ja ... 6356"><span class="f
- 1681183-1681204, 22 | " javascript:addadminm
second 23 1681205-1718906, 37702 | enu(this); return false;" onmouseout="ja ... 6356"><span class="f
first 24 1718907-1759029, 40123 | iletitle"></span>&nbsp;<span class="post ... 214" class="postInfo
second 24 1759030-1799152, 40123 | iletitle"></span>&nbsp;<span class="post ... 214" class="postInfo
- 1799153-1799153, 1 | M
first 25 1799154-1837679, 38526 | mobile"><span class="nameBlock"><span c ... ox" name="delete" cl
- 1837680-1837680, 1 | m
second 25 1837681-1876206, 38526 | mobile"><span class="nameBlock"><span c ... ox" name="delete" cl
- 1876207-1876220, 14 | ass="turnmeoff
first 26 1876221-1913117, 36897 | " value="286625"><span class="filetitle" ... /res/280501.html#286
- 1913118-1913135, 18 | ass=" turnmeoff"="
second 26 1913136-1950032, 36897 | " value="286625"><span class="filetitle" ... /res/280501.html#286
first 27 1950033-1987385, 37353 | 836">№</a><a href="javascript:insert('>> ... <tr><td class="reply
second 27 1987386-2024738, 37353 | 836">№</a><a href="javascript:insert('>> ... <tr><td class="reply
- 2024739-2024750, 12 | " id="287436
first 28 2024751-2062560, 37810 | "><div id="pim143367214" class="postInfo ... 17:15:27&nbsp;</spa
second 28 2062561-2100370, 37810 | "><div id="pim143367214" class="postInfo ... 17:15:27&nbsp;</spa
first 29 2100371-2139690, 39320 | n><span class="reflink"><a href="http:// ... ml</a><br><span clas
second 29 2139691-2179010, 39320 | n><span class="reflink"><a href="http:// ... ml</a><br><span clas
- 2179011-2179020, 10 | s="unkfunc
first 30 2179021-2218629, 39609 | ">&gt;шаблонизатор</span><br>import re<b ... mouseout="javascript
- 2218630-2218643, 14 | s=" unkfunc"="
second 30 2218644-2258252, 39609 | ">&gt;шаблонизатор</span><br>import re<b ... mouseout="javascript
- 2258253-2258292, 40 | :removeAdminMenu(event); return false;">
first 31 2258293-2295717, 37425 | </a></span>&nbsp;</span><br class="turnm ... ; return false;">288
- 2295718-2295760, 43 | :removeAdminMenu(event); return false;"&gt;
second 31 2295761-2333185, 37425 | </a></span>&nbsp;</span><br class="turnm ... ; return false;">288
- 2333186-2333190, 5 | 198</
first 32 2333191-2369977, 36787 | a><br><span class="postpanel"><a class=" ... ass="reflink1"><a hr
- 2369978-2369982, 5 | 198<
second 32 2369983-2406769, 36787 | a><br><span class="postpanel"><a class=" ... ass="reflink1"><a hr
- 2406770-2406794, 25 | ef="http://2ch.pm/pr/res/
first 33 2406795-2444270, 37476 | 280501.html#288346">№</a><a href="javasc ... <em><span class="ref
- 2444271-2444280, 10 | =" pr res
second 33 2444281-2481756, 37476 | 280501.html#288346">№</a><a href="javasc ... <em><span class="ref
- 2481757-2504614, 22858 | link1"><a href="http://2ch.pm/pr/res/280 ... " id="boardNavBottom
second 1 2504615-2511479, 6865 | "> <span class="nowrap">Тематика&nbsp;[< ... /a>]</span> </div> <
- 2511480-2514266, 2787 | hr> <p class="footer"> &nbsp; - <a href ... res/280501.html -->\n
/tmp/test/pr-thread-15-gcache.html
Total repeats: 861266 of 1763495 bytes
- 0- 11108, 11109 | <!DOCTYPE html>\n<meta http-equiv="Conten ... "rmenu" id="boardNav
first 1 11109- 18340, 7232 | "> <span class="nowrap">Тематика&nbsp;[< ... nbsp;&nbsp; </div> <
- 18341- 38956, 20616 | /div></div> <div class="mobile" id="boar ... nt); return false;">
first 2 38957- 76952, 37996 | </a></span>&nbsp;</span><br class="turnm ... пеешь подготовиться.
- 76953- 77040, 88 | (this); return false;" onmouseout="javas ... ; return false;"&gt;
second 2 77041-115036, 37996 | </a></span>&nbsp;</span><br class="turnm ... пеешь подготовиться.
first 3 115037-151035, 35999 | <br><br>Вот тебе пример талицы чтобы пот ... 345599">№</a><a href
second 3 151036-187034, 35999 | <br><br>Вот тебе пример талицы чтобы пот ... 345599">№</a><a href
- 187035-187067, 33 | ="javascript:insert('>>345599')">
first 4 187068-226599, 39532 | 345599</a><span class="postpanel"><a cla ... ="dateTime postNum">
- 226600-226641, 42 | ="javascript:insert('&gt;&gt;345599')"&gt;
second 4 226642-266173, 39532 | 345599</a><span class="postpanel"><a cla ... ="dateTime postNum">
first 5 266174-304765, 38592 | Срд 25 Дек 2013 22:15:01<br><em><span cl ... орием ты связан<br>g
second 5 304766-343357, 38592 | Срд 25 Дек 2013 22:15:01<br><em><span cl ... орием ты связан<br>g
first 6 343358-381945, 38588 | it config -l — показывает конфиг гита, в ... time">Чтв 26 Дек 201
second 6 381946-420533, 38588 | it config -l — показывает конфиг гита, в ... time">Чтв 26 Дек 201
- 420534-420551, 18 | 3 21:39:18&nbsp;</
first 7 420552-460716, 40165 | span><span class="reflink"><a href="http ... br><em><span class="
- 460717-460735, 19 | 3" 21:39:18&nbsp;<
second 7 460736-500900, 40165 | span><span class="reflink"><a href="http ... br><em><span class="
first 8 500901-541421, 40521 | reflink1"><a href="http://2ch.hk/pr/res/ ... a onmouseover="showP
- 541422-541423, 2 | "
second 8 541424-581944, 40521 | reflink1"><a href="http://2ch.hk/pr/res/ ... a onmouseover="showP
first 9 581945-622465, 40521 | ostPreview(event)" onmouseout="delPostPr ... nmeoff"><a id="34663
second 9 622466-662986, 40521 | ostPreview(event)" onmouseout="delPostPr ... nmeoff"><a id="34663
first 10 662987-701597, 38611 | 8"></a><blockquote id="m346638" class="p ... dQuickReply('346808'
second 10 701598-740208, 38611 | 8"></a><blockquote id="m346638" class="p ... dQuickReply('346808'
first 11 740209-780175, 39967 | ); return false;">346808</a><br><span cl ... " id="346972"><div i
second 11 780176-820142, 39967 | ); return false;">346808</a><br><span cl ... " id="346972"><div i
- 820143-820184, 42 | d="pim143367214" class="postInfoM mobile">
first 12 820185-861270, 41086 | <span class="nameBlock"><span class="nam ... ECIMAL, как проверит
- 861271-861315, 45 | d="pim143367214" class="postInfoM mobile"&gt;
second 12 861316-902401, 41086 | <span class="nameBlock"><span class="nam ... ECIMAL, как проверит
- 902402-902616, 215 | ь равно ли поле NULL, транзакции (BEGIN, ... ://www.nostarch.com/
first 13 902617-943194, 40578 | mg_databases.htm" rel="nofollow">http:// ... onmouseout="delPost
- 943195-943415, 221 | ь равно ли поле NULL, транзакции (BEGIN, ... p: www.nostarch.com
second 13 943416-983993, 40578 | mg_databases.htm" rel="nofollow">http:// ... onmouseout="delPost
- 983994-984084, 91 | Preview(event)" href="http://2ch.hk/pr/r ... "highlight(347110)">
first 14 984085-1023132, 39048 | &gt;&gt;347110</a></p></blockquote></td> ... звестен. Ты же сам п
- 1023133-1023213, 81 | Preview(event)" href="/pr/res/345388.htm ... ghlight(347110)"&gt;
second 14 1023214-1062261, 39048 | &gt;&gt;347110</a></p></blockquote></td> ... звестен. Ты же сам п
- 1062262-1062511, 250 | ишешь в статье, что хочешь читать файлы ... br><br><span class="
first 15 1062512-1101582, 39071 | unkfunc">&gt; Таково пехапе, ничего не п ... /table><table id="po
- 1101583-1101837, 255 | ишешь в статье, что хочешь читать файлы ... <br /><span class="
second 15 1101838-1140908, 39071 | unkfunc">&gt; Таково пехапе, ничего не п ... /table><table id="po
first 16 1140909-1179206, 38298 | st_347440" class="post"><tbody><tr><td c ... d="347475"></a><bloc
second 16 1179207-1217504, 38298 | st_347440" class="post"><tbody><tr><td c ... d="347475"></a><bloc
- 1217505-1217515, 11 | kquote id="
first 17 1217516-1256372, 38857 | m347475" class="postMessage"><p>Всё прин ... ascript:insert('>>34
- 1256373-1256384, 12 | kquote id="
second 17 1256385-1295241, 38857 | m347475" class="postMessage"><p>Всё прин ... ascript:insert('>>34
first 18 1295242-1334114, 38873 | 7633')" onclick="javascript:addQuickRepl ... anel"><a class="post
second 18 1334115-1372987, 38873 | 7633')" onclick="javascript:addQuickRepl ... anel"><a class="post
- 1372988-1373034, 47 | btn_rep" href="http://2ch.hk/pr/res/345388.html
first 19 1373035-1411076, 38042 | #" onclick="javascript:addQuickReply('34 ... 444</a><br><span cla
- 1411077-1411091, 15 | btn_rep" href="
second 19 1411092-1449133, 38042 | #" onclick="javascript:addQuickReply('34 ... 444</a><br><span cla
- 1449134-1449137, 4 | ss="
first 20 1449138-1486392, 37255 | unkfunc">&gt;Если есть вопросы, задавай, ... ><span class="subjec
- 1486393-1486397, 5 | ss="
second 20 1486398-1523652, 37255 | unkfunc">&gt;Если есть вопросы, задавай, ... ><span class="subjec
first 21 1523653-1561122, 37470 | t"></span></span><span data-utc="1339778 ... ttp://2ch.hk/pr/res/
second 21 1561123-1598592, 37470 | t"></span></span><span data-utc="1339778 ... ttp://2ch.hk/pr/res/
first 22 1598593-1635792, 37200 | 345388.html#348611">№</a><a href="javasc ... ta-utc="1339778953"
- 1635793-1635799, 7 | pr res
second 22 1635800-1672999, 37200 | 345388.html#348611">№</a><a href="javasc ... ta-utc="1339778953"
- 1673000-1673020, 21 | class="dateTime postN
first 23 1673021-1710784, 37764 | um">Суб 04 Янв 2014 18:56:14<br><em><spa ... seover="showPostPrev
- 1710785-1710806, 22 | class=" datetime postn
second 23 1710807-1748570, 37764 | um">Суб 04 Янв 2014 18:56:14<br><em><spa ... seover="showPostPrev
- 1748571-1754002, 5432 | iew(event)" onmouseout="delPostPreview(e ... " id="boardNavBottom
second 1 1754003-1761234, 7232 | "> <span class="nowrap">Тематика&nbsp;[< ... nbsp;&nbsp; </div> <
- 1761235-1763494, 2260 | hr> <p class="footer"> &nbsp; - <a href ... channel=suggest -->\n
<?php
/**
* Ищет в HTML коде повторяющиеся куски
*/
// Минимальная длина повторяющегося куска
$minSize = 1000;
// Шаг поиска, в 2 р меньше. Мы разбиваем исходную строку на
// подстроки с таким шагом, берем каждую по очереди и ищем
// справа ее повторы.
$sliceSize = (int)max(1, ceil($minSize / 2)); // шаг поиска, в 2 р меньше
// Выдать на stdout исправленный файл
$doFix = in_array('--fix', $argv);
$stderr = fopen('php://stderr', 'w');
// Минимальный размер повторяющегося куска, подлежащего вырезанию.
// Если поставить маленьким, то можно вырезать например длинный пост из
// тысяч слов sage или меню, которое продублировано сверху и снизу.
$copyMinSize = 30000;
// Максимальное расстояние между концом первой копии и началом второй. Этот
// промежуток также вырезается.
$spaceMaxSize = 500;
$input = file_get_contents('php://stdin');
// Общее число дублирующихся байт
$totalRepeat = 0;
$pos = 0;
$copyNumber = 1;
// Найденные объекты Copy и Segment
$copies = [];
$segments = [];
// $lastMsg = 0;
/*
Разбиваем строку на куски длиной sliceSize и для
каждого ищем повторения справа от него.
*/
while ($pos + $minSize < strlen($input)) {
// if ($pos - $lastMsg > 50000) {
// printf("Offset: %d\n", $pos);
// $lastMsg = $pos;
// }
$sample = substr($input, $pos, $sliceSize);
$searchFrom = $pos + $sliceSize;
// Возможная точка в строке, где повторяется наш кусочек
$copyPos = strpos($input, $sample, $searchFrom);
if ($copyPos === false) {
$pos += $sliceSize;
continue;
}
// Находим длину повторяющегося сегмента
list($start1, $start2, $length) = determineRepeatLength($input, $pos, $copyPos, $minSize);
assert($length >= $sliceSize);
if ($length < $minSize) {
$pos += $sliceSize;
continue;
}
$first = new Segment($input, $start1, $length, 'first', $copyNumber);
$second = new Segment($input, $start2, $length, 'second', $copyNumber);
$copy = new Copy($first, $second);
$copies[] = $copy;
$segments[] = $first;
$segments[] = $second;
$copyNumber++;
$totalRepeat += $length;
$pos = $start1 + $length;
}
fprintf($stderr, "Total repeats: %d of %d bytes\n", $totalRepeat, strlen($input));
// Сортируем сегменты по возрастанию смещения от начала файла
usort($segments, function ($a, $b) {
return $a->offset - $b->offset;
});
// Выводим карту файла, с повторяющимися сегментами
$pos = 0;
foreach ($segments as $seg) {
if ($seg->offset > $pos) {
$free = new Segment($input, $pos, $seg->offset - $pos, '-');
printSegment($free);
$pos = $seg->offset;
}
printSegment($seg);
$pos = $seg->getEnd() + 1;
}
if ($pos < strlen($input)) {
$free = new Segment($input, $pos, strlen($input) - $pos, '-');
printSegment($free);
}
if ($doFix) {
/*
Находим все копии, подходящие по размеру, и вырезаем из
них второй сегмент и промежуток между 1-м и 2-м сегментами.
*/
$removeSegments = [];
$removeBytes = 0;
// Выбираем список сегментов для вырезания
foreach ($copies as $copy) {
$seg = $copy->first;
if ($seg->length < $copyMinSize) {
fprintf($stderr, "Skip seg {$seg->copyNumber}, size = {$seg->length}\n");
continue;
}
$spacing = $copy->getSpacing();
if ($spacing > $spaceMaxSize) {
fprintf($stderr, "Skip seg {$seg->copyNumber}, spacing = {$copy->getSpacing()}\n");
continue;
}
// Вырезаем также промежуток между копиями
fprintf($stderr, "Remove second seg {$seg->copyNumber} + spacing ({$copy->getSpacing()} bytes)\n");
if ($copy->getSpacing() > 0) {
$spacingSeg = new Segment($input, $seg->getEnd() + 1, $copy->getSpacing(), 'space', $seg->copyNumber);
$removeSegments[] = $spacingSeg;
}
$removeSegments[] = $copy->second;
}
fprintf($stderr, "Remove segments:\n");
$newParts = [];
$start = 0;
// Пересоздаем файл без вырезанных сегментов
foreach ($removeSegments as $seg) {
$removeBytes += $seg->length;
if ($seg->offset > $start) {
$part = substr($input, $start, $seg->offset - $start);
$newParts[] = $part;
}
$start = $seg->getEnd() + 1;
printSegment($seg);
}
if ($start < strlen($input)) {
$part = substr($input, $start);
$newParts[] = $part;
}
// Собираем результат
$result = implode("", $newParts);
fprintf(
$stderr,
"Left %d bytes of %d source, removed %d bytes, expected to remove %d bytes\n",
strlen($result),
strlen($input),
strlen($input) - strlen($result),
$removeBytes
);
echo $result;
}
function printSegment(Segment $seg)
{
global $stderr;
$content = truncate($seg->getContent(), 60);
$content = strtr($content, [
"\r" => "\\r",
"\n" => "\\n",
"\t" => "\\t"
]);
fprintf(
$stderr,
"%6s %2s %6d-%6d,%6d | %s\n",
$seg->type,
$seg->copyNumber,
$seg->offset,
$seg->getEnd(),
$seg->length,
$content
);
}
/**
* Ищет одинаковые куски строки, начиная с данной позиции.
*
* Получает на вход 2 позиции в строке. Ищет вправо и влево от них
* до тех пор, пока там идут одинаковые символы.
*
* Возвращает начало первого, второго повторяющихся кусков и их длину,
* все в байтах.
*
* @return [$start1, $start2, $length]
*/
function determineRepeatLength($input, $pos, $copyPos, $minSize)
{
$i = $pos;
$j = $copyPos;
$len = strlen($input);
$right = 0;
while ($i < $len && $j < $len) {
if ($input[$i] !== $input[$j]) {
break;
}
$right++;
$i++;
$j++;
}
$left = 0;
$i = $pos;
$j = $copyPos;
while ($i > 1 && $j > 1) {
$i--;
$j--;
if ($input[$i] !== $input[$j]) {
break;
}
$left++;
}
$start1 = $pos - $left;
$start2 = $copyPos - $left;
$length = $left + $right;
return [$start1, $start2, $length];
}
/**
* Выводит длинную строку с многоточием посередине.
*/
function truncate($string, $length)
{
if (mb_strlen($string) < $length) {
return $string;
}
$break = ceil($length * 0.66);
$tail = floor($length * 0.34);
return mb_substr($string, 0, $break) . ' ... ' .
mb_substr($string, -$tail);
}
/**
* Представляет кусок исходной строки с HTML-кодом, определяемый
* смещением относительно начала в байтах (offset) и длиной в
* байтах (length).
*/
class Segment
{
public $from;
public $offset;
public $input;
public $type;
public $copyNumber;
public function __construct($input, $offset, $length, $type, $copyNumber = null)
{
$this->input = $input;
$this->offset = $offset;
$this->length = $length;
$this->type = $type;
$this->copyNumber = $copyNumber;
}
public function getContent()
{
return substr($this->input, $this->offset, $this->length);
}
public function getBefore($length)
{
$from = max(0, $this->offset - $length);
return substr($this->input, $from, $length);
}
public function getAfter($length)
{
$from = $this->offset + $length;
return substr($this->input, $from, $length);
}
public function getEnd()
{
return $this->offset + $this->length - 1;
}
}
/**
* Представляет 2 сегмента, являющиеся дубликатами. spacing - число
* байт между концом первого сегмента и началом второго.
*/
class Copy
{
public $first;
public $second;
public function __construct(Segment $first, Segment $second)
{
$this->first = $first;
$this->second = $second;
}
public function getSpacing()
{
return $this->second->offset - ($this->first->getEnd() + 1);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment