| 1580 | |
| 1581 | |
| 1582 | void diff_match_patch::patch_addContext(Patch &patch, const QString &text) { |
| 1583 | if (text.isEmpty()) { |
| 1584 | return; |
| 1585 | } |
| 1586 | QString pattern = safeMid(text, patch.start2, patch.length1); |
| 1587 | int padding = 0; |
| 1588 | |
| 1589 | // Look for the first and last matches of pattern in text. If two different |
| 1590 | // matches are found, increase the pattern length. |
| 1591 | while (text.indexOf(pattern) != text.lastIndexOf(pattern) |
| 1592 | && pattern.length() < Match_MaxBits - Patch_Margin - Patch_Margin) { |
| 1593 | padding += Patch_Margin; |
| 1594 | pattern = safeMid(text, std::max(0, patch.start2 - padding), |
| 1595 | std::min(text.length(), patch.start2 + patch.length1 + padding) |
| 1596 | - std::max(0, patch.start2 - padding)); |
| 1597 | } |
| 1598 | // Add one chunk for good luck. |
| 1599 | padding += Patch_Margin; |
| 1600 | |
| 1601 | // Add the prefix. |
| 1602 | QString prefix = safeMid(text, std::max(0, patch.start2 - padding), |
| 1603 | patch.start2 - std::max(0, patch.start2 - padding)); |
| 1604 | if (!prefix.isEmpty()) { |
| 1605 | patch.diffs.prepend(Diff(EQUAL, prefix)); |
| 1606 | } |
| 1607 | // Add the suffix. |
| 1608 | QString suffix = safeMid(text, patch.start2 + patch.length1, |
| 1609 | std::min(text.length(), patch.start2 + patch.length1 + padding) |
| 1610 | - (patch.start2 + patch.length1)); |
| 1611 | if (!suffix.isEmpty()) { |
| 1612 | patch.diffs.append(Diff(EQUAL, suffix)); |
| 1613 | } |
| 1614 | |
| 1615 | // Roll back the start points. |
| 1616 | patch.start1 -= prefix.length(); |
| 1617 | patch.start2 -= prefix.length(); |
| 1618 | // Extend the lengths. |
| 1619 | patch.length1 += prefix.length() + suffix.length(); |
| 1620 | patch.length2 += prefix.length() + suffix.length(); |
| 1621 | } |
| 1622 | |
| 1623 | |
| 1624 | QList<Patch> diff_match_patch::patch_make(const QString &text1, |